OpenGL之法線

OpenGL之法線

法線:即垂直於其表面的單位矢量

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;

}

法線演示程式,旋轉正方體觀看光照的變化如上圖:下載

  1. 按+/-鍵增加或減小光照亮度
  2. 按SPACE(空格)鍵啟用或禁用光照
  3. 按UP/DOWN鍵正方體繞X軸旋轉
  4. 按LEFT/RIGHT鍵正方體繞Y軸旋轉
  5. 按Z+LEFT/Z+RIGHT鍵正方體繞Z軸旋轉
  6. 按F1鍵打開幫助
  7. 按ESC鍵重置模型旋轉角度

 

評論