OpenGL之NURBS曲面构建
一個NURBS曲面F(s,t)包含三個要素:
?????????? 控制頂點(x,y,z),節點序列(s,t)和權因子(w),
或者說是
?????????? 帶權控制頂點(x*w,y*w,z*w,w)和節點序列(s,t)。
OpenGL中提供了對兩類曲面的繪制:
GL_MAP2_VERTEX_4:控制頂點帶權,每個點記為(x*w,y*w,z*w,w)
GL_MAP2_VERTEX_3:控制頂點權都為1,每個點記為(x,y,z)
OpenGL中的gluNurbsSurface()函數是繪制NURBS曲線曲面的關鍵函數,其函數原型定義如下:
?void gluNurbsSurface(
GLUnurbsObj * nobj, //NURBS曲面對象
GLint sknot_count,?????? //s方向節點數目
GLfloat * sknot,???????? //s方向節點數組指針
GLint tknot_count,?????? //t方向節點數目
GLfloat * tknot,???????? //t方向節點數組指針
GLint s_stride,????????? //s方向控制點數據跨度
GLint t_stride,????????? //t方向控制點數據跨度
GLfloat * ctlarray,????? //控制點數組指針
GLint sorder,??????????? //s方向上多項式階數
GLint torder,??????????? //t方向上多項式階數
GLenum type????????????? //確定求值器類型
);
代碼示例:
??? /*****************初始化*********************/
??? /*設置特殊效果*/
?? ??? ?glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
?? ??? ?glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
?? ??? ?glEnable(GL_BLEND);
??? ?
?? ??? ?glEnable(GL_AUTO_NORMAL);
?? ??? ?glEnable(GL_NORMALIZE);
?? ??? ?glFrontFace(GL_CW);
?? ??? ?glShadeModel(GL_SMOOTH);
?? ??? ?glEnable(GL_LINE_SMOOTH);
??? ?
??? //打開自動法矢量開關
?? ??? ?glEnable(GL_AUTO_NORMAL);
?? ??? ?//允許正則化法矢量
?? ??? ?glEnable(GL_NORMALIZE);
?? ??? ?theNurb = gluNewNurbsRenderer(); // 創建一個NURBS曲面對象 ?
?? ??? ?//修改NURBS曲面對象的屬性——glu庫函數
?? ??? ?采樣sampling容錯torerance
?? ??? ?gluNurbsProperty(theNurb, GLU_SAMPLING_TOLERANCE, 5.0);
?? ??? ?gluNurbsProperty(theNurb, GLU_DISPLAY_MODE, GLU_FILL);
??? ?
??? /************************在繪制函數中調用**************************/
??? /*******************nurbs***********************/
?? ??? ?GLfloat ctrlpoints[6][5][3] = {
?? ??? ?{{-3,0,0}, {-1,1,0}, {0,0,0}, {1,-1,0}, {3,0,0}},
?? ??? ?{{-3,0,-1},{-1,1,-1},{0,0,-1},{1,-1,-1},{3,0,-1}},
?? ??? ?{{-3,0,-3},{-1,1,-3},{0,0,-3},{1,1,-3},{3,0,-3}},
?? ??? ?{{-3,1,-3},{-1,1,-3},{0,0,-3},{1,-1,-3},{3,0,-3}},
?? ??? ?{{-3,0,-4},{-1,1,-4},{0,0,-4},{1,-1,-4},{3,0,-4}},
?? ??? ?{{-3,2,-5},{-1,1,-5},{0,0,-5},{1,-1,-5},{3,1,-5}} };
?? ??? ?
?? ??? ?//各控制點影響力參數設置
??????? GLfloat knots1[12] = { 0.0, 0.0, 0.0, 0.0,0.0,0.0,
?? ??? ??? ?1.0, 1.0, 1.0, 1.0 ,1.0,1.0 }; // NURBS曲面的控制向量
?? ??? ?GLfloat knots2[10] = { 0.0, 0.0, 0.0, 0.0,0.0,
?? ??? ??? ?1.0, 1.0, 1.0, 1.0 ,1.0}; // NURBS曲面的控制向量??? ?
???? ?
?? ??? ?gluBeginSurface(theNurb); // 開始曲面繪制 ?? ?
?? ??? ?gluNurbsSurface(theNurb, 12, knots1, 10, knots2, 5 * 3, 3, &ctrlpoints[0][0][0], 6, 5, GL_MAP2_VERTEX_3); // 定義曲面的數學模型,確定其形狀 ?
?? ??? ?gluEndSurface(theNurb); // 結束曲面繪制 ?
運行效果:
?
總結
以上是生活随笔為你收集整理的OpenGL之NURBS曲面构建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用OpenGL进行曲线、曲面的绘制
- 下一篇: B样条数据点反求控制点绘制曲线(源码)