DotNet SDK How Get Vertex Normal

DotNet SDK How Get Vertex Normal

donggdbk
Explorer Explorer
264 Views
0 Replies
Message 1 of 1

DotNet SDK How Get Vertex Normal

donggdbk
Explorer
Explorer

我正在使用 3ds Max 2020。

如何正确获取模型的顶点、法线和纹理坐标数据?希望与 Max obj 导出
一致,以下是我使用 DotNet SDK 的方法。目前,顶点法线不一致。

 

 

for (int i = 0; i < Mesh.Faces.Count; i++)
{
    var Face = Mesh.Faces[i];
    var TVFace = Mesh.TvFace[i];

    for (int j = 0; j < Face.V.Length; j++)
    {
        // ========== 
        var vi = Face.GetVert((int)j);
        var v = Mesh.GetVert((int)vi);
        v = NodeUtil.GetWorldSpacePoint3(Node, v);

        var vKey = PointToString(v);
        if (!V_Unique.TryGetValue(vKey, out vi))
        {
            Vertices.Add(v);
            vi = (uint)V_Unique.Keys.Count + 1;
            V_Unique.Add(vKey, vi);
        }

        FaceVertexIndexs.Add(vi);

        // ==========
        var vni = vi - 0;
        var vn = Mesh.GfxNormals[(int)vni];

        var vnKey = PointToString(vn);
        if (!VN_Unique.TryGetValue(vnKey, out vni))
        {
            VertNormals.Add(vn);
            vni = (uint)VN_Unique.Keys.Count + 1;
            VN_Unique.Add(vnKey, vni);
        }

        FaceNormalIndexs.Add(vni);


        // ==========
        if (Mesh.NumTVerts > 0)
        {
            var vti = TVFace.GetTVert((int)j);
            var vt = Mesh.GetTVert((int)vti);
            var vtKey = PointToString(vt, false);

            if (!VT_Unique.TryGetValue(vtKey, out vti))
            {
                TexCoords.Add(vt);
                vti = (uint)VT_Unique.Keys.Count + 1;
                VT_Unique.Add(vtKey, vti);
            }

            FaceTexCoordIndexs.Add(vti);
        }

        // ==========
        SmoothGroups.Add(Face.SmGroup);

    }
}

 

这是一个数据对比图

 

donggdbk_0-1740826558257.png

 

 

 

0 Likes
265 Views
0 Replies
Replies (0)