3ds Max如何在Mesh类中存储法线?

时间:2013-09-04 16:23:44

标签: c++ 3d 3dsmax normals

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

1 个答案:

答案 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);
        }
}