[英]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.