Я пишу анализатор файлов 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 последних строк. Я просто … не могу понять, как и почему это работает.
Может кто-нибудь объяснить, как он рассчитывается?
Как сказал Кибер в комментариях, решение заключается в расчете перекрестного продукта. Математика описана Вот.
Код превращает точки треугольника в 2 вектора (от точки 1 до 2 и от точки 1 до 3), затем он берет их и вычисляет перекрестное произведение по ним.
Это перекрестный продукт. Обратите внимание, что когда вектор (I, j, k) умножается (перекрестное произведение) на (i0, j0, k0), результатом является (jk0-kj0, ki0-ik0, ij0-ji0), обычно нормали тоже следует нормализовать, если векторы не единичной длины.