我正在用C ++编写3ds文件解析器。现在,我正在处理法线,并且在网络上的某个地方找到了这段代码:

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


除了最后三行,我几乎了解所有内容。我只是...无法弄清楚它的工作方式和原因。

有人可以解释它的计算方式吗?

最佳答案

正如Cyber​​在评论中所说,解决方案正在计算叉积。数学描述为here

该代码将三角形点变成2个向量(从点1到2,从点1到3),然后将它们取下来并计算它们的叉积。

10-07 12:41