我正在编写一个 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()
什么?