OpenGL之貝賽爾(Bezier)曲線

OpenGL貝賽爾(Bezier)曲線

OpenGL支持貝賽爾(Bezier)曲線繪畫,貝賽爾曲線由起點,終點和控制點組成,並且具有平滑的運動軌跡.控制點用於定義曲線的形狀,像磁石將曲線向控制點的位置吸引.上圖的演示程式通過滑鼠點選屏幕放置『控制點』繪畫貝賽爾(Bezier)曲線.ESC鍵清空『控制點』:下載

1.設置貝賽爾(Bezier)曲線

void glMap1f(GLenum target,GLfloat u1,GLfloat u2,GLint stride,GLint order,const GLfloat *points);

參數 簡介
target 控制點類型
u1, u2 u參數的定義域(0~1)
stride 頂點跨度
order 曲線頂點個數(由起點,終點和控制點組成)
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.啟用控制點

glEnable(GL_MAP1_VERTEX_3);

3.現在可以繪畫曲線,100條直線繪畫貝賽爾(Bezier)曲線,以均等間隔繪畫.

glBegin(GL_LINE_STRIP);

for (i = 0; i <= 100; ++i)

glEvalCoord1f((float)i / 100.0f);

glEnd();

上面的代碼可以簡化為

glMapGrid1d(100, 0.0f, 1.0f);// 定義定義均勻的間格

glEvalMesh1(GL_LINE,0, 100);// 繪製曲線

4.完成繪畫後需要繪畫控制點

glPointSize(5);

glBegin(GL_POINTS);

for (i = 0; i < bezier->countol_count; ++i)

           glVertex3fv(bezier->control_array[i].M);

glEnd();

 

評論