『貝賽爾(Bezier)曲線』(下面簡稱為『曲線』)跟據其『控制點』數目分類.擁有三個控制點『曲線』稱為『二次曲線』. 擁有四個控制點『曲線』稱為『三次曲線』.
隨著『曲線』控制點數目增加.曲線的平滑度可能會被大量控制點拉扯而被破壞.
所以引入NURBS(非均勻有理B樣條).『B樣條』其實就是『曲線』,只不過『B樣條』分為多個『曲線段』. 每個『曲線段』擁有四個控制點.將整條『曲線』分為若干『曲線段』,等於將多個『三次曲線』合併為『B樣條』.
『B樣條』有四個『控制點』,而每個『控制點』擁有兩個『節點』.其值可以取u和v域範圍任意值.『節點』影響『控制點』對『曲線』影響程度.這也是Bezier與NURBS區別之處.NURBS演示程式下載:
1.生成NURBS對象
GLUnurbsObj * object = gluNewNurbsRenderer();
2.定義八個『節點』
float knots[8] = { 0,0, 0,0, 1,1, 1,1 };
3.生成NURBS四個『控制點』
float nurbs[4][4][3] ;
4.設置NURBS曲面控制點,形成坨峰形
for (int u = 0; u < 4; ++u){
for (int v = 0; v < 4; ++v){
nurbs[u][v][0] = 3.0f*((float)u – 1.5f);
nurbs[u][v][1] = 2.0f*((float)v – 1.5f);
if ((u == 1 || u == 2) && (v == 1 || v == 2))
nurbs[u][v][2] = 3.0f;
else
nurbs[u][v][2] = -1.0f;
}
}
5.設置多邊形最大長度
gluNurbsProperty(object,GLU_SAMPLING_TOLERANCE,30.0f);
6.以多邊形繪製曲面
gluNurbsProperty(object,GLU_DISPLAY_MODE,GLU_FILL);
gluNurbsProperty()用於設置採樣以及如何繪畫NURBS
void gluNurbsProperty(GLUnurbs *nobj,GLenum property,GLfloat value);
參數 | 數值 | 簡介 |
nobj | GLUnurbsObj * object; | NURBS對象 |
property | GLU_SAMPLING_TOLERANCE: | 設置多邊形最大長度 |
GLU_DISPLAY_MODE: | 多邊形渲染模式GLU_FILL:多變形實體填充 | |
value | 依property而定 |
7.設置NURBS曲面
gluBeginSurface(object);
8.準備繪製NURBS曲面
gluNurbsSurface(object,8,knots,8, knots,43,3,(GLfloat)&nurbs[0][0][0],4,4, GL_MAP2_VERTEX_3);
函式定義
void gluNurbsSurface(GLUnurbsnobj,GLint sknot_count,floatsknot,GLint tknot_count,GLfloattknot,GLint s_stride,GLint t_stride,GLfloatctlarray,GLint sorder,GLint torder,GLenum type);
參數 | 簡介 |
nobj | NURBS對象 |
sknot_count | u節點個數 |
sknot | u節點 |
tknot_count | v節點個數 |
tknot | v節點 |
s_stride | u控制點距離 |
t_stride | v控制點距離 |
ctlarray | 指向控制點 |
sorder | u方向控制點個數 |
torder | v方向控制點個數 |
type | 曲面類型 |
9.完成渲染
gluEndSurface(object);