日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL之NURBS曲面构建

發布時間:2025/3/21 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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曲面构建的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。