three.js Geometry.faceVertexUvs 设置令人困惑
three.js Geometry.faceVertexUvs setup is confusing
我正在努力实现自定义模型导入器。该文件包含所有必要的信息(顶点、顶点法线、顶点 uv 坐标、materials 等)
请务必注意,该文件包含具有多个 material 的模型。
顶点的设置非常简单,并且工作正常。
我不是 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是material基于子网格数的面索引目标文件。这似乎也能正常工作。
现在是困难的部分。我整天都在寻找一个清晰的解释 and/or 如何设置多 material 网格的 faceVertexUvs 的好例子,但我发现每一秒 post 都显示了一种不同的设置方法向上。经过大量的反复试验,我得到了这个有效的解决方案,但抛出了很多警告...
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是一个和vertices数组长度相同的Vector2数组。
基本上我在做:
faceVertexUvs[materialIndex][faceIndex][uvs[a], uvs[b], uvs[c]].
material个索引的数量等于对象拥有的子网格的数量。
所以这个解决方案还算行得通,但是有些纹理看起来不正确(我怀疑是因为那个区域的 UV 贴图设置不正确),我收到很多警告说:
重要的是要注意,所有模型在导出程序中看起来都正常,所以问题不在于此。
关于我在这里做错了什么有什么想法吗?
所以我想我终于弄明白了,我让它正常工作,而且由于这方面的文档严重缺乏,而且例子也不是很清楚我会 post 我的理解此主题适用于遇到相同问题的任何人。
所以它是这样的:
Geometry.faveVertexUvs[UV LAYER][face index][uv[face.a], uv[face.b], uv[face.c]]
据我了解,除非你有 AO(环境遮挡)贴图,否则你只能使用 UV LAYER 0。
现在,如果您在设置几何体的面时定义一个 material 索引,那么每个面都将使用相应的 material 进行渲染,并且不需要像我那样将 UV 拆分为单独的区域在做我的问题。所以你只需要使用:
Geometry.faces.push(new THREE.Face3(v0, v1, v2, [n0, n1, n2], vertexColor, materialIndex));
我正在努力实现自定义模型导入器。该文件包含所有必要的信息(顶点、顶点法线、顶点 uv 坐标、materials 等) 请务必注意,该文件包含具有多个 material 的模型。 顶点的设置非常简单,并且工作正常。 我不是 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是material基于子网格数的面索引目标文件。这似乎也能正常工作。
现在是困难的部分。我整天都在寻找一个清晰的解释 and/or 如何设置多 material 网格的 faceVertexUvs 的好例子,但我发现每一秒 post 都显示了一种不同的设置方法向上。经过大量的反复试验,我得到了这个有效的解决方案,但抛出了很多警告...
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是一个和vertices数组长度相同的Vector2数组。 基本上我在做: faceVertexUvs[materialIndex][faceIndex][uvs[a], uvs[b], uvs[c]].
material个索引的数量等于对象拥有的子网格的数量。
所以这个解决方案还算行得通,但是有些纹理看起来不正确(我怀疑是因为那个区域的 UV 贴图设置不正确),我收到很多警告说:
重要的是要注意,所有模型在导出程序中看起来都正常,所以问题不在于此。
关于我在这里做错了什么有什么想法吗?
所以我想我终于弄明白了,我让它正常工作,而且由于这方面的文档严重缺乏,而且例子也不是很清楚我会 post 我的理解此主题适用于遇到相同问题的任何人。 所以它是这样的:
Geometry.faveVertexUvs[UV LAYER][face index][uv[face.a], uv[face.b], uv[face.c]]
据我了解,除非你有 AO(环境遮挡)贴图,否则你只能使用 UV LAYER 0。 现在,如果您在设置几何体的面时定义一个 material 索引,那么每个面都将使用相应的 material 进行渲染,并且不需要像我那样将 UV 拆分为单独的区域在做我的问题。所以你只需要使用:
Geometry.faces.push(new THREE.Face3(v0, v1, v2, [n0, n1, n2], vertexColor, materialIndex));