Как 3ds Max хранит нормали в классе Mesh?

Я пишу экспортер 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()?

0

Решение

Я получаю их так:

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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector