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