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));