我正在编写3ds Max导出器,我需要获取应用程序计算的网格法线。我有一个Mesh
实例,我可以获得顶点位置,UV,颜色等等,但法线看起来并不那么容易......顺便说一句:我知道如何计算面/顶点法线,但我需要来自3ds Max的精确数据,考虑了平滑组和材料索引。
对于这种情况,我创建了一个简单的框,并在调用Mesh
方法后查看了生成的buildNormals()
实例。以下是我在调试和深入研究文档后发现的内容,所有提到的数据都在Mesh
类中:
我有简单的顶点/面数:
int numVerts = 8;
int numFaces = 12;
并且验证/面对数据:
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()
的是什么?
答案 0 :(得分: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);
}
}