第十二講 繪製NURBS曲線和曲面

2021-04-13 22:54:32 字數 3177 閱讀 7732

上一節講了一般的曲線與曲面的繪製,本節講nurbs曲線和曲面的繪製。

例11:此例繪製兩個相同形狀的nurbs曲面,不同之處是乙個為線框式,乙個是由實多邊形組成。執行後可以看到其中的區別,如圖十三所示。

#include

#include

glunurbsobj *thenurb1;

glunurbsobj *thenurb2;

glfloat ctrlpoints[5][5][3] = ,,,,},

,,,,},

,,,,},

,,,,},

,,,,}};//控制點

glfloat mat_diffuse = ;

glfloat mat_specular = ;

glfloat mat_shininess = ;

glfloat light_position = ;

void myinit(void)

int spin = 0;

/*接收鍵盤指令*/

static void mykey(unsigned char key,int x,int y)

}/*繪製曲面*/

void mydisplay(void)

;glclear(gl_color_buffer_bit|gl_depth_buffer_bit);

glrotatef(50.0,1.0,1.0,0.0);

/*第乙個曲面*/

glpushmatrix();

gltranslatef(1.0,0.0,0.0);

glubeginsu***ce(thenurb1);

/*定義曲面形狀*/

glunurbssu***ce(thenurb1,10,knots,10,knots,5*3,3,&ctrlpoints[0][0][0],5,5,gl_map2_vertex_3);

gluendsu***ce(thenurb1);

glpopmatrix();

/*第二個曲面*/

glpushmatrix();

gltranslatef(7.0,0.0,0.0);

glubeginsu***ce(thenurb2);

/*定義曲面形狀*/

glunurbssu***ce(thenurb2,10,knots,10,knots,5*3,3,&ctrlpoints[0][0][0],5,5,gl_map2_vertex_3);

gluendsu***ce(thenurb2);

glpopmatrix();

glutswapbuffers();

}void myreshape(glsizei w,glsizei h)

int main(int argc,char ** argv)

·glunurbsobj* glnewnurbsrenderer()建立乙個nurbs物件,並返回乙個指向該物件的指標。如果沒有足夠的

記憶體分配給該物件,則返回值為0。

·void glunurbsproperty(glunurbsobj* nobj, glenum property, glfloat value)設定nurbs屬性。

nobj 指向nurbs物件的指標。

property需設定的屬性。

value 設定指定屬性的值。

·glbeginsu***ce及gluendsu***ce兩個函式一起限定乙個nurbs面的定義。返回值均為void,引數均為glunurbsobj* nobj,為指向nurbs物件的指標。

·void glunurbssu***ce(glunurbsobj *nobj, glint knot_count, glfloat tknot_count, glfloat *tknot, glint s_stride, glint t_stride, glfloat *ctlarry, glint sorder, glint torder,glenum type) 定義nurbs曲面形狀。

nobj 指向nurbs物件的指標。

sknot_count 引數化u方向上的節點數。

sknot 引數化u方向上的非遞減節點值。

tknot_count 引數化v方向上的節點數。

tknot 引數化v方向上的非遞減節點值。

s_stride在ctlarry中引數化u方向上相鄰控制點的偏移量。

t_stride在ctlarry中引數化v方向上相鄰控制點的偏移量。

ctlarrynurbs的控制點陣列。

sorder引數化u方向上nurbs的階數,階數比維數大1。

torder引數化v方向上nurbs的階數,階數比維數大1。

type曲面型別。

圖十三:nurbs曲面

例12:繪製乙個彩色的曲線,曲線閉合成圓。在曲線的邊緣繪製8個點,如圖十四所示。

#include

#include

glunurbsobj *thenurb;

glfloat ctrlpoints[12][3] = ,,,,

,,,,

,,,};//控制點

glfloat color[12][3]=,,,,

,,,,

,,,};

glfloat knots[15] = ;

void myinit(void)

/*繪製曲線*/

void mydisplay(void)

void myreshape(glsizei w,glsizei h)

int main(int argc,char ** argv)

·glubegincurve,gluendcurve限定nurbs曲面。返回值均為void,引數均為glunurbsobj* nobj,為指向nurbs物件的指標。

·void glunurbscurve(glunurbsobj *nobj, glint nknots, glfloat *knot, glint stride, glfloat *ctlarray, glint order,glenum type)定義曲線形狀。

nobj 指向nurbs物件的指標。

nknots 節點數,節點數等於控制點數加上階數。

knot nknots陣列非遞減節點值。

stride相鄰控制點的偏移量。

ctlarry指向nurbs的控制點陣列的指標。

order nurbs曲線的階數,階數比維數大1。

type曲面型別。

圖十四:nurbs曲線

第十二講 物件導向基礎 多型

多型可以理解為事物存在的多種體現形態。例如,貓這個物件對應的型別是貓型別 貓 x new 貓 同時貓也是動物中的一種,也可以把貓稱為動物 動物 x new 貓 動物是貓和狗等具體事物中抽取出來的父型別。多型在程式中的體現為父類的引用或者介面的引用指向了子類的物件。多型出現的前提是必須是類與類之間有關...

EJB3的XML Schema第十二講

method intf 元素可以和方法元素的三種用法一起使用。例如,下面的方法元素例子可以被用於指向employeeservice bean 的遠端home 介面和遠端業務介面的所有方法。employeeservice home multiplicitytype 描述了關係中角色的多方。它的值必須是...

視覺SLAM十四講 第十二講筆記

講完了前端後端,這一講講的是回環檢測。比起之前的內容要容易理解多了 其思路是 回環檢測的作用 消除累積誤差。累積誤差是怎麼來的呢?前端根據區域性 相鄰或相近 幀給出位姿估計,後端也是根據前端已有的結果進行優化 比如p x k xk 1 p x k x p xk xk 1 這樣,當前端每一幀都存在誤差...