Я пытаюсь реализовать импортер .3ds в соответствии с this documentation, и я подошел к этапу, когда мне нужно вычислить нормали вершин, потому что файлы .3ds не предоставляют таких. Вот код Java:Расчет нормалей модели .3ds
/* Sctructure of vertex array is {x0, y0, z0, x1, y1, z1...}
*
* Basically, MathUtils.generateNormal_f(x0,y0,z0, x1,y1,z1, x2,y2,z2) is cross
* product between (x1-x0, y1-y0, z1-z0) and (x2-x0, y2-y0, z2-z0) */
normals = new float[this.vertex.length]; //every vertex has it's own normal
int n = 0;
for (int i=0; i<this.index.length; i++){
float[] Normal = MathUtils.generateNormal_f(//getting xyz coords of 1 normal
vertex[index[i]*3], vertex[index[i]*3+1], vertex[index[i]*3+2],
vertex[index[++i]*3], vertex[index[i]*3+1], vertex[index[i]*3+2],
vertex[index[++i]*3], vertex[index[i]*3+1], vertex[index[i]*3+2]);
normals[n++] = Normal[0];
normals[n++] = Normal[1];
normals[n++] = Normal[2];
}
Метод MathUtils.generateNormal_f(...)
протестирована и работает отлично. Результат этого кода можно увидеть ниже (первое изображение). Например, во втором изображении каждая нормальная модель одинакова и указывает на источник света.
Вопрос: как правильно рассчитать нормали?
3ds действительно не имеет нормалей, все приложение было построено вокруг идеи, что нормали вычисляются сглаживанием групп. Который работает отлично, я вас точка дать пользователям любые другие варианты. – joojaa
1. Нет, нормали не инвертируются. Они просто случайно указывают везде. 2. Формат 3ds вообще не поддерживает нормали. 3. Не могу понять, о каких волшебниках и магах вы говорите :) – TomatoMato