【发布时间】:2015-05-11 12:30:02
【问题描述】:
我正在用 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;
}
我几乎什么都懂,除了最后三行。我只是...无法弄清楚它是如何以及为什么起作用的。
有人能解释一下它是如何计算的吗?
【问题讨论】:
-
您可以使用cross product (as shown here) 计算法线,这基本上就是您的代码正在做的事情。
-
这里是关于计算表面法线的,你可以在opengl.org/wiki/Calculating_a_Surface_Normal看到。
-
最后一行正在计算cross product of two 3-vectors。关于法线的计算我推荐你这个答案stackoverflow.com/a/6661242/524368
标签: c++ parsing opengl normals 3ds