【问题标题】:three.js Geometry.faceVertexUvs setup is confusing三.js Geometry.faceVertexUvs 设置比较混乱
【发布时间】: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


    【解决方案1】:

    所以我想我终于设法弄明白了,我让它正常工作,由于这方面的文档严重缺乏,而且示例不太清楚,我会在这里为任何人发布我对这个主题的理解有同样的问题。 所以它是这样的:

    Geometry.faveVertexUvs[UV LAYER][face index][uv[face.a], uv[face.b], uv[face.c]]
    

    据我了解,除非您有 AO(环境光遮蔽)贴图,否则您只能使用 UV LAYER 0。 现在,如果您在设置几何体的面时定义材质索引,那么每个面都将使用相应的材质进行渲染,并且无需像我在问题中所做的那样将 UV 拆分为单独的区域。所以你只需要使用:

    Geometry.faces.push(new THREE.Face3(v0, v1, v2, [n0, n1, n2], vertexColor, materialIndex));
    

    【讨论】:

      猜你喜欢
      • 2016-12-24
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多