2015-05-11 5 views
0

Я пишу синтаксический анализатор 3ds в C++. Сейчас я работаю над нормалей, и я нашел этот кусок кода где-то на веб-сайте:Может кто-нибудь объяснить, как нормали рассчитываются в этом коде?

void calculateNormals(vert a, vert b, vert c,GLfloat *nx,GLfloat *ny, GLfloat *nz){ 

    GLfloat Qx, Qy, Qz, Px, Py, Pz; 


    GLfloat v1[3] = {a.x,a.y,a.z}; 
    GLfloat v2[3] = {b.x,b.y,b.z}; 
    GLfloat v3[3] = {c.x,c.y,c.z}; 

     Qx = v2[0]-v1[0]; 
     Qy = v2[1]-v1[1]; 
     Qz = v2[2]-v1[2]; 
     Px = v3[0]-v1[0]; 
     Py = v3[1]-v1[1]; 
     Pz = v3[2]-v1[2]; 

    *nx = Py*Qz - Pz*Qy; 
    *ny = Pz*Qx - Px*Qz; 
    *nz = Px*Qy - Py*Qx; 
} 

Я понимаю почти все, за исключением 3-х последних строк. Я просто ... не могу понять, как и почему это работает.

Может кто-нибудь объяснить, как он рассчитан?

+7

Вы можете вычислить нормали, используя [поперечное произведение (как показано здесь)] (https://math.stackexchange.com/questions/305642/how-to-find-surface-normal-of-a-triangle) , что в основном делает ваш код. – CoryKramer

+1

Речь идет о вычислении нормали поверхности, как вы можете видеть в https://www.opengl.org/wiki/Calculating_a_Surface_Normal. – user1929959

+1

Последняя строка вычисляет [кросс-произведение двух 3-векторов] (http://en.wikipedia.org/wiki/Cross_product). Что касается расчета нормалей, я ссылаюсь на этот ответ http://stackoverflow.com/a/6661242/524368 – datenwolf

ответ

3

Как Кибер сказал в комментариях, решение вычисляет перекрестное произведение. Математика описана here.

Код превращает точки треугольника во 2 вектора (из пункта 1 в 2 и из пункта 1 в 3), затем он берет их и вычисляет поперечное произведение над ними.

1

Это крест продукта. Заметим, что когда вектор (I, j, k) умножается (перекрестное произведение) в (i0, j0, k0), результат равен (jk0-kj0, ki0-ik0, ij0-ji0), обычно нормали также должны быть нормированы, если векторы не являются единичной длиной.