【发布时间】:2019-07-27 02:35:21
【问题描述】:
我正在实施一个自定义模型导入器。该文件包含所有必要的信息(顶点、顶点法线、顶点 uv 坐标、材质等) 请务必注意,该文件包含具有多种材料的模型。 顶点的设置相当简单,并且工作正常。 我不确定100%的面孔设置。我执行以下操作:
meshDict[name].faces.push(
new THREE.Face3(parseInt(triangles[t]),
parseInt(triangles[t + 1]),
parseInt(triangles[t + 2]),
[normals[parseInt(triangles[t])],
normals[parseInt(triangles[t + 1])],
normals[parseInt(triangles[t + 2])]],
new THREE.Vector3(1, 1, 1), matIndex));
这里:t 是三角形数组的索引迭代器,normals 是保存顶点法线信息的数组,matIndex 是基于目标文件中的子网格编号的面的材质索引。这似乎也可以正常工作。
现在是最难的部分。我整天都在寻找一个清晰的解释和/或如何设置多材质网格的 faceVertexUvs 的好例子,但是我发现的每一秒帖子都会显示一种不同的设置方法。经过大量的试验和错误,我得到了这个可行的解决方案,但会引发很多警告......
for (var f = 0; f < faces.length; f++)
{
if (currentMesh.faceVertexUvs[faces[f].materialIndex] == undefined)
{
currentMesh.faceVertexUvs[faces[f].materialIndex] = []
faceOffset = (faces[f].materialIndex == 0? 0 : 1) * f;
}
currentMesh.faceVertexUvs[faces[f].materialIndex].push(f);
currentMesh.faceVertexUvs[faces[f].materialIndex][f - faceOffset] = [];
currentMesh.faceVertexUvs[faces[f].materialIndex][f - faceOffset].push(uvs[faces[f].a]);
currentMesh.faceVertexUvs[faces[f].materialIndex][f - faceOffset].push(uvs[faces[f].b]);
currentMesh.faceVertexUvs[faces[f].materialIndex][f - faceOffset].push(uvs[faces[f].c]);
}
这里的uvs是一个与顶点数组长度相同的Vector2数组。 基本上我在做: faceVertexUvs[materialIndex][faceIndex][uvs[a], uvs[b], uvs[c]].
材质索引的数量等于对象拥有的子网格的数量。
所以这个解决方案还不错,但有些纹理看起来不正确(我怀疑是因为该区域的 UV 映射设置不正确),而且我收到很多警告说:
需要注意的是,所有模型在导出程序中看起来都不错,所以问题不在于那里。
关于我在这里做错了什么有什么想法吗?
【问题讨论】:
标签: three.js mesh uv-mapping