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

在这一点上,我几乎拥有了我需要的所有数据,但我无法将一个法线分配给一个渲染顶点。还有一张更有趣的表:

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 回答