有人能解释一下在这段代码中法线是如何计算的吗? 我正在编写一个C++的3DS文件解析器。现在我正在研究法线,我在web上的某个地方发现了这段代码: 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; }

有人能解释一下在这段代码中法线是如何计算的吗? 我正在编写一个C++的3DS文件解析器。现在我正在研究法线,我在web上的某个地方发现了这段代码: 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; },c++,parsing,opengl,normals,3ds,C++,Parsing,Opengl,Normals,3ds,除了最后三行,我几乎什么都懂。我只是。。。不知道它是怎么工作的,为什么 有人能解释一下它是如何计算的吗?正如赛博在评论中所说,解决方案是计算叉积。数学描述 代码将三角形点转化为2个向量(从点1到2和从点1到3),然后取它们并计算它们的叉积。正如赛博在评论中所说,解决方案是计算叉积。数学描述 代码将三角形点转换为2个向量(从点1到2和从点1到3),然后取它们并计算它们的叉积。这是叉积。请注意,当向量(I,j,k)在(i0,j0,k0)中相乘(叉积)时,结果是(jk0-kj0,ki0-ik0,ij0

除了最后三行,我几乎什么都懂。我只是。。。不知道它是怎么工作的,为什么


有人能解释一下它是如何计算的吗?

正如赛博在评论中所说,解决方案是计算叉积。数学描述


代码将三角形点转化为2个向量(从点1到2和从点1到3),然后取它们并计算它们的叉积。

正如赛博在评论中所说,解决方案是计算叉积。数学描述


代码将三角形点转换为2个向量(从点1到2和从点1到3),然后取它们并计算它们的叉积。

这是叉积。请注意,当向量(I,j,k)在(i0,j0,k0)中相乘(叉积)时,结果是(jk0-kj0,ki0-ik0,ij0-ji0)。如果向量不是单位长度,通常法线也应该归一化。

它是叉积。请注意,当向量(I,j,k)在(i0,j0,k0)中相乘(叉积)时,结果是(jk0-kj0,ki0-ik0,ij0-ji0),如果向量不是单位长度,通常法线也应该规格化。

您可以使用计算法线,这基本上就是您的代码所做的。这里是关于计算曲面法线的,正如您在中所看到的,最后一行是计算。关于法线的计算,我建议您参考这个答案,您可以使用计算法线,这基本上就是您的代码所做的。这里是关于计算曲面法线的,如中所示。最后一行是计算。关于法线的计算,请参考此答案