法線:即垂直於其表面的單位矢量
OpenGL在進行光照運算前需先計算法線,光與表面相交的角度利用法先計算出反射角度,結合光照與材質計算表面的顏色
法線函式 | 簡介 |
void glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); | 設置法線
(nx,ny,nz):法線坐標分量 |
法線函式示例
glBegin(GL_POLYGON);
glNormal3f(0.0f,1.0f,0.0f);// 法線
glVertex3f( 0.5f, 0.5f, 0.5f);
glVertex3f( 0.5f, 0.5f,-0.5f);
glVertex3f(-0.5f, 0.5f,-0.5f);
glVertex3f(-0.5f, 0.5f, 0.5f);
glEnd();
法線的計算 | 簡介 |
A*B=(Ax*Bz-Az*By, Az*Bx-Ax*Bz, Ax*By-Ay*Bx) | 矢量A和B叉積方程 |
計算兩個3D向量的法線(叉積)
void Cross(float pa[3], float pb[3], float pc[3],float normal[3])
{
float va[3],vb[3];//矢量1,矢量2
float length;//矢量長度
// 計算矢量1
va[0] = pa[0] – pb[0];
va[1] = pa[1] – pb[1];
va[2] = pa[2] – pb[2];
// 計算矢量2
vb[0] = pb[0] – pc[0];
vb[1] = pb[1] – pc[1];
vb[2] = pb[2] – pc[2];
// 計算叉積
normal[0] = va[1]vb[2] – va[2]vb[1];
normal[1] = va[2]vb[0] – va[0]vb[2];
normal[2] = va[0]vb[1] – va[1]vb[0];
// 計算長度
length = sqrt(normal[0]normal[0] + normal[1]normal[1] + normal[2]*normal[2]);
// 計算單位矢量
normal[0] = normal[0] / length;
normal[1] = normal[1] / length;
normal[2] = normal[2] / length;
}
法線演示程式,旋轉正方體觀看光照的變化如上圖:下載
- 按+/-鍵增加或減小光照亮度
- 按SPACE(空格)鍵啟用或禁用光照
- 按UP/DOWN鍵正方體繞X軸旋轉
- 按LEFT/RIGHT鍵正方體繞Y軸旋轉
- 按Z+LEFT/Z+RIGHT鍵正方體繞Z軸旋轉
- 按F1鍵打開幫助
- 按ESC鍵重置模型旋轉角度