OpenGL 编程/中级/法线
外观
您可以为创建的面指定法线。这是一个垂直于面的向量。如果您计划使用灯光,则指定法线很重要。它们告诉 OpenGL 光线是如何反射的。虽然 OpenGL 不是光线追踪器,但它仍然会影响您看到面的亮度。OpenGL 不会自行计算法线,您必须手动执行此操作。
法线使用函数 glNormal3f 指定,并在您创建属于该面的顶点之前使用。示例
// Create a square on the XY axis. The normal vector is then (0, 0, 1) glBegin(GL_QUADS); glNormal3f(0.0, 0.0, 1.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 1.0, 0.0); glVertex3f(1.0, 1.0, 0.0); glVertex3f(1.0, 0.0, 0.0); glEnd();
有一个相当简单的计算三角形法线向量的方法。给定 p1、p2 和 p3,法线向量可以表示为 (p2 - p1) 和 (p3 - p1) 的叉积,除以结果的长度。在 C 代码中,使用结构体类型来表示向量
struct vector a, b, n; double l; a.x = p2.x - p1.x; a.y = p2.y - p1.y; a.z = p2.z - p1.z; b.x = p3.x - p1.x; b.y = p3.y - p1.y; b.z = p3.z - p1.z; n.x = (a.y * b.z) - (a.z * b.y); n.y = (a.z * b.x) - (a.x * b.z); n.z = (a.x * b.y) - (a.y * b.x); // Normalize (divide by root of dot product) l = sqrt(n.x * n.x + n.y * n.y + n.z * n.z); n.x /= l; n.y /= l; n.z /= l; // Now pass n.x, n.y, n.z to glNormal3f