0

私は 3ds Max エクスポータを書いていますが、アプリケーションによって計算されたメッシュ法線を取得する必要があります。インスタンスがMeshあり、頂点の位置、UV、色などを取得できますが、法線はそれほど簡単ではないようです... ところで:面/頂点の法線を計算する方法は知っていますが、3ds Max からの正確なデータが必要です。 、スムージング グループとマテリアル インデックスが考慮されます。

この場合、単純なボックスを作成し、メソッドMeshを呼び出した後に結果のインスタンスを調べましたbuildNormals()。いくつかのデバッグとドキュメントの掘り下げの後に私が見つけたものは次のとおりです。言及されたすべてのデータはMeshクラス内にあります。

私は単純な頂点/面番号を持っています:

int numVerts = 8;
int numFaces = 12;

verices/faces データ:

Point3* verts;    // contains 8 vectors with positions (x,y,z)
Face*   faces;    // contains 12 faces, each with 3 indexes into *verts - [0-7]

これまでのところは良いです...法線データを計算しました:

int normalCount = 24;  // 6 sides * 4 vertices each, no reuse of normal data
Point3* gfxNormals;    // contains 24 normal vectors

この時点で、必要なデータはほぼすべて揃っていますが、1 つの法線を 1 つのレンダリングされた頂点に割り当てることはできません。もう 1 つ興味深い表があります。

Tab<ulong> norInd;    // contains 8 indexes - {0,3,6,9,12,15,18,21}

以前のフィールドに何らかの形で接続されているようです (私は 8 つの頂点を持ち、それぞれに 3 つの法線があります) が、より複雑な状況での使用方法がわかりません。

私が得る必要があるもの:

特定の面の特定の頂点の法線のインデックスが必要です。つまり、OpenGl で 0 番目の面をレンダリングしたい場合は、次を使用できます。

glVertex3f( verts[ faces[0].v[0] ].x, verts[ faces[0].v[0] ].y, verts[ faces[0].v[0] ].z );
glVertex3f( verts[ faces[0].v[1] ].x, verts[ faces[0].v[1] ].y, verts[ faces[0].v[1] ].z );    
glVertex3f( verts[ faces[0].v[2] ].x, verts[ faces[0].v[2] ].y, verts[ faces[0].v[2] ].z );

しかし、何に渡すのglNormal3f()ですか?

4

1 に答える 1

1

私がそれらを取得する方法は次のとおりです。

for(int f = 0; f < mesh->numFaces; ++f)
{
        Point3 normal;
        Face* face = &mesh->faces[f];

        for(int v = 0; v < 3; ++v)
        {
                DWORD vi = face->v[v];
                Point3 normal;
                if(mesh->getRVertPtr(vi))
                        normal = GetVertexNormal(mesh, f, mesh->getRVertPtr(vi));
                else
                        normal = Point3(0, 0, 1);       
                fprintf(file, "\t\t\t<normal x=\"%f\" y=\"%f\" z=\"%f\" />\n", normal.x, normal.y, normal.z);
        }
}
于 2013-10-04T04:51:30.437 に答える