Я пишу экспортер 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 нормали), но я понятия не имею, как использовать его в более сложных ситуациях.
Мне нужен индекс нормали для конкретной вершины в конкретном лице или другими словами — если бы я хотел отрисовать 0-е лицо в OpenGl, я мог бы использовать:
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);
}
}
Других решений пока нет …