跳轉至內容

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();

計算法線

[編輯 | 編輯原始碼]

有一個相當簡單的計算三角形法線向量的方法。給定 p1p2p3,法線向量可以表示為 (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
華夏公益教科書