OpenGL之貝賽爾(Bezier)曲面

OpenGL貝賽爾(Bezier)曲面

貝賽爾(Bezier)『曲面』與『曲線』相比不同之處在於多咗v空間域.曲面函式s(u,v).曲面演示程式按空格鍵在線框、填充、紋理模式中切換:下載

1.對曲面進行柵格映射

void glMap2f(GLenum target,GLfloat u1,GLfloat u2,GLint ustride,GLint uorder,GLfloat v1,GLfloat v2,GLint vstride,GLint vorder,const GLfloat *points);

函式示例:

glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3,u,  0,1, 3v,3,  (GLfloat)bezier->control_array);

參數 簡介
target 控制點類型
u1,u2 u空間域參數的定義域(u1~u2)
ustride u空間域頂點跨度
uorder u空間域頂點個數
v1, v2 v空間域參數的定義域(u1~u2)
vstride v空間域頂點跨度
vorder v空間域頂點個數
points 定點數組

 

控制點類型(target) 簡介
GL_MAP1_VERTEX_3 頂點座標(x,y,z)
GL_MAP1_VERTEX_4 頂點座標(x,y,z,w)
GL_MAP1_INDEX 顏色索引
GL_MAP1_COLOR_4 顏色值(RGBA)
GL_MAP1_NORMAL 法線座標
GL_MAP1_TEXTURE_COORD_1 紋理座標(s)
GL_MAP1_TEXTURE_COORD_2 紋理座標(s,t)
GL_MAP1_TEXTURE_COORD_3 紋理座標(s,t,r)
GL_MAP1_TEXTURE_COORD_4 紋理座標(s,t,r,g)

2.啟用貝賽爾(Bezier)曲面

glEnable(GL_MAP2_VERTEX_3);

3.定義定義均勻的柵格,並設置間隔個數

void glMapGrid2f(GLint un,GLfloat u1,GLfloat u2,GLint vn,GLfloat v1,GLfloat v2);

函式示例:

glMapGrid2f(10,0, 10, 10, 0, 10);

參數 簡介
un u域[u1~u2]間隔個數,必須為正
u1 u1=0
u2 u2=un
vn v域[v1~v2]間隔個數,必須為正
v1 v1=0
v2 v2=vn
  1. 根據柵格設置繪製曲面

void glEvalMesh2(GLenum mode,GLint i1,GLint i2,GLint j1,GLint j2);

函式示例:

glEvalMesh2(GL_FILL, 0, 10, 0, 10);

參數 簡介
mode 繪畫模式

GL_POINT:點

GL_LINE:直線

GL_FILL:填充

i1,i2 u空間域的範圍
j1,j2 v空間域的範圍

5.為曲面生成法線用於光照

glEnable(GL_AUTO_NORMAL);

6.對曲面進行紋理映射

glMap2f(GL_MAP2_TEXTURE_COORD_2, 0,1,2, 2,0,1, 4,2,(GLfloat*)bezier->texture_coord);

對曲面進行紋理映射glMap2f() 簡介
target 紋理座標(s,t):GL_MAP2_TEXTURE_COORD_2(睇上表)
u1,u2 s空間域:[0~1]
ustride s紋理座標頂點跨度:2
uorder s空間域頂點個數:2
v1,v2 t空間域:[0~1]
vstride t紋理座標頂點跨度:4
vorder t空間域頂點個數:2
points 紋理座標:{0.0, 0.0}, {0.0, 1.0}, {1.0, 0.0}, {1.0, 1.0}

4.啟用曲面紋理座標

glEnable(GL_MAP2_TEXTURE_COORD_2);

評論