簡體   English   中英

3ds Max如何將法線存儲在Mesh類中?

[英]How does a 3ds Max store normals in a Mesh class?

我正在編寫3ds Max導出器,我需要獲取由應用程序計算的網格法線。 我有一個Mesh實例,可以獲取頂點位置,UV,顏色等,但是法線似乎並不容易... BTW:我知道如何計算面/頂點法線,但是我需要3ds的確切數據最大值,考慮了平滑組和材料索引。

對於這種情況,我創建了一個簡單的框,並在調用buildNormals()方法之后查看了所得的Mesh實例。 這是經過一些調試和深入研究文檔后發現的,所有提到的數據都在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()什么?

我得到它們的方式是這樣的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM