版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1OpenGL圖形編程武漢紡織大學(xué)數(shù)學(xué)與計(jì)算機(jī)學(xué)院講課教師:陳永強(qiáng)教授第1頁(yè)4.網(wǎng)格化曲線曲面與實(shí)體造型4.1網(wǎng)格化4.2曲線曲面4.3實(shí)體第2頁(yè)4.1網(wǎng)格化OpenGL只能直接顯示簡(jiǎn)單凸多邊形。簡(jiǎn)單凸多邊形就是多邊形邊只在頂點(diǎn)處相交,沒有重復(fù)頂點(diǎn),而且任何頂點(diǎn)都只有兩條邊相遇。假如需要顯示凹多邊形、中間有洞多邊形或者含有相交邊多邊形,就必須分解為簡(jiǎn)單凸多邊形,即網(wǎng)格化。第3頁(yè)4.1網(wǎng)格化復(fù)雜多邊形網(wǎng)格化步驟:創(chuàng)建一個(gè)網(wǎng)格化對(duì)象注冊(cè)在網(wǎng)格化期間執(zhí)行操作回調(diào)函數(shù)指定網(wǎng)格化屬性指定一個(gè)或多個(gè)封閉多邊形組成輪廓,以創(chuàng)建并渲染分割后多邊形刪除網(wǎng)格化對(duì)象第4頁(yè)4.1網(wǎng)格化創(chuàng)建網(wǎng)格化對(duì)象GLUtesselator*gluNewTess(void);函數(shù)創(chuàng)建一個(gè)網(wǎng)格化對(duì)象,并返回一個(gè)指向該對(duì)象指針,假如創(chuàng)建失敗則返回NULL指針。第5頁(yè)4.1網(wǎng)格化網(wǎng)格化回調(diào)函數(shù)voidglTessCallback(GLUtesselator*tessobj,GLenumtype,void(*fn)());函數(shù)將回調(diào)函數(shù)fn與網(wǎng)格化對(duì)象tessobj關(guān)聯(lián)起來,類型由參數(shù)type指定。第6頁(yè)4.1網(wǎng)格化網(wǎng)格化屬性voidgluTessProperty(GLUtesselator*tessobj,GLenumproperty,GLdoublevalue);函數(shù)設(shè)置網(wǎng)格化對(duì)象tessobjproperty屬性,其值設(shè)為value。最主要最復(fù)雜是圍繞規(guī)則,決定了多邊形“內(nèi)部”和“外部”。第7頁(yè)4.1網(wǎng)格化定義多邊形voidglTessBeginPolygon(GLUtesselator*tessobj,void*user_data);voidglTessEndPolygon(GLUtesselator*tessobj);
此對(duì)函數(shù)將多邊形同網(wǎng)格對(duì)象tessobj關(guān)聯(lián)起來,參數(shù)user_data指向用戶定義數(shù)據(jù)。能夠定義一條或多條輪廓線。voidglTessBeginContour(GLUtesselator*tessobj);voidglTessEndContour(GLUtesselator*tessobj);此對(duì)函數(shù)指定一條封閉輪廓線,默認(rèn)將輪廓線中最終一個(gè)頂點(diǎn)和第一頂點(diǎn)相連。voidgluTessVertex(GLUtesselator*tessobj,GLdoublecoords[3],void*vertex_data);函數(shù)指定輪廓線一個(gè)頂點(diǎn)。第8頁(yè)4.1網(wǎng)格化刪去網(wǎng)格化對(duì)象voidgluDeleteTess(GLUtesselator*tessobj);刪去網(wǎng)格化對(duì)象tessobj,并釋放其占用內(nèi)存。第9頁(yè)4.1網(wǎng)格化例子紅皮書tess.c第10頁(yè)114.2曲線曲面4.2.1Bezier曲線曲面4.2.2B樣條曲線曲面第11頁(yè)124.2.1Bezier曲線曲面Bezier曲線Bezier曲線求值函數(shù):voidglMap1{fd}(GLenumtarget,TYPEt1,TYPEt2,GLintstride,GLintorder,constTYPE*points);參數(shù)target給出控制點(diǎn)數(shù)組表示內(nèi)容,普通取GL_MAP1_VERTEX_3,表示控制點(diǎn)數(shù)組存放控制點(diǎn)三維點(diǎn)坐標(biāo)。參數(shù)t1,t2表示Bezier曲線參數(shù)t最小和最大值,普通為0.0和1.0。參數(shù)stride表數(shù)組points中一個(gè)坐標(biāo)位置到另一個(gè)坐標(biāo)位置偏移量,對(duì)三維坐標(biāo)數(shù)組,stride=3。參數(shù)order指定Bezier曲線階數(shù)。參數(shù)points為指向控制點(diǎn)數(shù)組指針。第12頁(yè)134.2.1Bezier曲線曲面Bezier曲線生成步驟1.指定控制點(diǎn)坐標(biāo);2.設(shè)定求值函數(shù);3.激活求值函數(shù)glEnable(GL_MAP1_VERTEX_3)4.計(jì)算沿樣條路徑位置并顯示曲線voidglEvalCoord1{fd}(TYPEt);第13頁(yè)144.2.1Bezier曲線曲面Bezier曲線生成步驟第4步還能夠用以下函數(shù)來生成一組均勻分布參數(shù)值,顯示曲線//指定曲線參數(shù)t從t1開始經(jīng)過n步均勻地變?yōu)閠2。glMapGrid1{fd}(GLintn,TYPEt1,TYPEt2);
//指定從第n1個(gè)到第n2個(gè)參數(shù)(由glMapGrid1算出)繪制glEvalMesh1(GLenummode,GLintn1,GLintn2);參數(shù)mode取值為GL_POINT或GL_LINE,表示以點(diǎn)或折線形式顯示曲線第14頁(yè)154.2.1Bezier曲線曲面Bezier曲面Bezier曲面求值函數(shù):
voidglMap2{fd}(GLenumtarget,TYPEu1,TYPEu2,GLintustride,GLintuorder,TYPEv1,TYPEv2,GLintvstride,GLintvorder,constTYPE*points);參數(shù)u1,u2,v1,v2分別表示Bezier曲面參數(shù)u和v最大最小值。參數(shù)ustride和vstride分別表示數(shù)組points中相鄰控制點(diǎn)偏移量。參數(shù)uorder和vorder指定Bezier曲面階數(shù)。參數(shù)points為指向控制點(diǎn)坐標(biāo)數(shù)組指針。第15頁(yè)164.2.1Bezier曲線曲面Bezier曲面生成步驟1.指定控制點(diǎn)坐標(biāo);2.設(shè)定求值函數(shù);3.激活求值函數(shù)glEnable(GL_MAP2_VERTEX_3)4.計(jì)算沿樣條路徑位置并顯示曲面glEvalCoord2{fd}(TYPEu,TYPEv);第16頁(yè)174.2.1Bezier曲線曲面Bezier曲面生成步驟第4步還能夠用以下函數(shù)來生成一組均勻分布參數(shù)值,顯示曲面glMapGrid2{fd}(GLintnu,TYPEu1,TYPEu2,GLintnv,TYPEv1,TYPEv2);glEvalMesh2(GLenummode,GLintnu1,GLintnu2,GLintnv1,GLintnv2);參數(shù)mode取值為GL_POINT、GL_LINE和GL_FILL,表示以點(diǎn)、折線或填充面形式顯示曲面第17頁(yè)4.2.1Bezier曲線曲面例子教材【程序8-2】紅皮書bezcurve.cbezsurf.cbezmesh.ctexturesurf.c第18頁(yè)194.2.2B樣條曲線曲面在GLU庫(kù)中,提供B樣條曲線曲面接口程序稱為“NURBS”函數(shù),但能夠用來生成既不是非均勻也不是有理B樣條?!癗URBS”函數(shù)能夠顯示含有均勻結(jié)點(diǎn)間隔多項(xiàng)式B樣條,還能夠用來生成Bezier樣條、有理或非有理樣條等。第19頁(yè)204.2.2B樣條曲線曲面NURBS曲線曲面繪制步驟:1.光照;2.指定NURBS對(duì)象;3.設(shè)置NURBS對(duì)象屬性;4.錯(cuò)誤通知;5.創(chuàng)建NURBS曲線曲面。第20頁(yè)214.2.2B樣條曲線曲面1.光照假如要對(duì)NURBS曲面應(yīng)用光照,能夠調(diào)用函數(shù)使曲面自動(dòng)生成面法線。
glEnable(GL_AUTO_NORMAL);也能夠自己計(jì)算面法線。第21頁(yè)224.2.2B樣條曲線曲面2.指定NURBS對(duì)象指定一個(gè)NURBS對(duì)象,這個(gè)對(duì)象既能夠是曲線也能夠是曲面,然后使用函數(shù)GLUnurbsObj*
gluNewNurbsRenderer(void);創(chuàng)建一個(gè)指向該對(duì)象指針,方便在創(chuàng)建時(shí)使用。第22頁(yè)234.2.2B樣條曲線曲面2.指定NURBS對(duì)象詳細(xì)程序:
GLUnurbsObj*curveName;curveName=gluNewNurbsRenderer();假如系統(tǒng)沒有足夠存放容量來存放NURBS對(duì)象,gluNewNurbsRenderer函數(shù)會(huì)返回0值。第23頁(yè)244.2.2B樣條曲線曲面2.指定NURBS對(duì)象當(dāng)NURBS對(duì)象不需要再使用時(shí),能夠使用函數(shù)刪除NURBS對(duì)象。gluDeleteNurbsRenderer(curveName);刪除名為curveNameNURBS對(duì)象。第24頁(yè)254.2.2B樣條曲線曲面3.設(shè)置NURBS對(duì)象屬性設(shè)置NURBS對(duì)象屬性,包含用于渲染多邊形最大尺寸或線段最大長(zhǎng)度。
voidgluNurbsProperty(GLUnurbsObj*nobj,GLenumproperty,GLfloatvalue);參數(shù)nobj指定需要設(shè)置屬性對(duì)象。參數(shù)property指定設(shè)置屬性名稱。參數(shù)value指定屬性值。第25頁(yè)264.2.2B樣條曲線曲面3.設(shè)置NURBS對(duì)象屬性Property屬性名稱與參數(shù)value取值以下屬性名稱為GLU_DISPLAY_MODE,指定顯示模式時(shí):value默認(rèn)值為GLU_FILL,表已填充方式顯示曲面對(duì)象;Value值為GLU_OUTLINE_POLYGON,表以網(wǎng)格多邊形輪廓方式顯示曲面;Value值為GLU_OUTLINE_PATCH,不顯示網(wǎng)格多邊形,僅顯示曲面輪廓,包含指定修剪曲線。第26頁(yè)274.2.2B樣條曲線曲面3.設(shè)置NURBS對(duì)象屬性Property屬性名稱與參數(shù)value取值以下屬性名稱為GLU_NURBS_MODE,指定NURBS曲線曲面模式時(shí):value默認(rèn)值為GLU_NURBS_RENDERER,表只對(duì)曲面進(jìn)行繪制而不在回調(diào)中產(chǎn)生網(wǎng)格數(shù)據(jù);Value值為GLU_NURBS_TESSELLATOR,表返回經(jīng)過網(wǎng)格化處理得到數(shù)據(jù)。第27頁(yè)284.2.2B樣條曲線曲面3.設(shè)置NURBS對(duì)象屬性Property屬性名稱與參數(shù)value取值以下屬性名稱為GLU_CULLING,用于確定是否剔除操作:value為GLU_TRUE,啟用剔除功效,使得曲面對(duì)象假如在觀察空間之外將不執(zhí)行網(wǎng)格化,以提升性能;Value為GLU_FALSE,不啟用剔除功效。第28頁(yè)294.2.2B樣條曲線曲面3.設(shè)置NURBS對(duì)象屬性Property屬性名稱與參數(shù)value取值以下屬性名稱為GLU_SAMPLING_METHOD,指定NURBS對(duì)象怎樣網(wǎng)格化:Value默認(rèn)值為GLU_PATH_LENGTH,指定網(wǎng)格化得到多邊形最大邊長(zhǎng)(單位為象素)不能超出屬性GLU_SAMPLING_TOLERANCE值;Value為GLU_PARAMETRIC_ERROR,指定網(wǎng)格化得到多邊形與原來曲線曲面距離(單位為象素)不能超出GLU_PARAMETRIC_TOLERANCE值;Value為GLU_OBJECT_PATH_LENGTH和GLU_OBJECT_PARAMETRIC_ERROR時(shí),與前類似,只是距離單位不是象素,而是物體空間坐標(biāo)單位長(zhǎng)度;Value為GLU_DOMAIN_DISTANCE,在u和v方向上分別依據(jù)屬性GLU_U_STEP和GLU_V_STEP值決定每個(gè)單位長(zhǎng)度內(nèi)有多少個(gè)樣本點(diǎn)。第29頁(yè)304.2.2B樣條曲線曲面3.設(shè)置NURBS對(duì)象屬性Property屬性名稱與參數(shù)value取值以下屬性名稱為GLU_SAMPLING_TOLERENCE,參數(shù)value指定經(jīng)網(wǎng)格化處理得到多邊形最大邊長(zhǎng);屬性名稱為GLU_PARAMETRIC_TOLERENCE,參數(shù)value指定經(jīng)網(wǎng)格化處理得到多邊形與原來曲線之間最大距離;以上兩個(gè)屬性將依據(jù)屬性GLU_SAMPLING_METHOD確定邊長(zhǎng)單位是象素還是物體空間坐標(biāo)長(zhǎng)度。第30頁(yè)314.2.2B樣條曲線曲面3.設(shè)置NURBS對(duì)象屬性Property屬性名稱與參數(shù)value取值以下屬性名稱為GLU_U_STEP和GLU_V_STEP,參數(shù)value指定在u或v方向上每單位長(zhǎng)度內(nèi)有多少采樣點(diǎn),其默認(rèn)值為100。注意是,采樣方式應(yīng)該置為GLU_DOMAIN_DISTANCE。第31頁(yè)324.2.2B樣條曲線曲面3.設(shè)置NURBS對(duì)象屬性Property屬性名稱與參數(shù)value取值以下屬性名稱為GLU_AUTO_LOAD_MATRIX,參數(shù)value值為GL_TRUE時(shí)從OpenGL服務(wù)器上下載用于觀察、投影和視區(qū)變換矩陣;不然,假如該值為GL_FALSE,則必須使用函數(shù)gluLoadSamplingMatrices()來提供這些矩陣。函數(shù)gluLoadSamplingMatrices()原型為VoidgluLoadSamplingMatrices(GLUnurbsObj*nobj,constGLfloatmodelMatrix[16],constGLfloatprojMatrix[16],constGlintviewport[4]);第32頁(yè)334.2.2B樣條曲線曲面3.設(shè)置NURBS對(duì)象屬性取得NURBS屬性值,使用函數(shù)voidgluGetNurbsProperty(GLUnurbsObj*nobj,GLenumproperty,GLfloat*value);經(jīng)過參數(shù)value返回NURBS對(duì)象nobjproperty屬性值。第33頁(yè)344.2.2B樣條曲線曲面4.錯(cuò)誤通知調(diào)用函數(shù)voidgluNurbsCallback(GLUnurbsObj*nobj,GLenumwhich,void(*fn)(GLenumerrorCode));將函數(shù)fn注冊(cè)為錯(cuò)誤回調(diào)函數(shù)。參數(shù)which指定回調(diào)函數(shù)類型,對(duì)于錯(cuò)誤檢驗(yàn),其取值為GLU_ERROR。當(dāng)NURBS函數(shù)檢測(cè)到錯(cuò)誤時(shí),將使用錯(cuò)誤代碼作為唯一參數(shù)調(diào)用函數(shù)fn。errorCode取值為37種錯(cuò)誤條件,能夠使用函數(shù)gluErrorString(errorCode)取得錯(cuò)誤代碼含義。第34頁(yè)354.2.2B樣條曲線曲面5.創(chuàng)建NURBS曲線曲面
曲線在
voidgluBeginCurve(GLUnurbsObj*nobj); voidgluEndCurve(GLUnurbsObj*nobj);之間一次或?qū)掖握{(diào)用函數(shù)gluNurbsCurve():第35頁(yè)4.2.2B樣條曲線曲面5.創(chuàng)建NURBS曲線曲面曲線voidgluNurbsCurve(GLUnurbsObj*nobj,GLintuknot_count,GLfloat*ukont,GLintu_stride,GLfloat*ctlarray,GLintuorder,GLenumtype);第36頁(yè)374.2.2B樣條曲線曲面5.創(chuàng)建NURBS曲線曲面
曲面:在
voidgluBeginSurface(GLUnurbsObj*nobj);voidgluEndSurface(GLUnurbsObj*nobj);之間調(diào)用gluNurbsSurface()
:第37頁(yè)4.2.2B樣條曲線曲面5.創(chuàng)建NURBS曲線曲面
曲面:voidgluNurbsSurface(GLUnurbsObj*nobj,GLintuknot_count,GLfloat*ukont,GLintvknot_count,GLfloat*vkont,GLintu_stride,GLintv_stride,GLfloat*ctlarray,GLintuorder,GLintvorder,GLenumtype);第38頁(yè)4.2.2B樣條曲線曲面例子教材【程序8-4】紅皮書surface.c第39頁(yè)401.GLUT庫(kù)中多面體函數(shù)4.3實(shí)體函數(shù)說明glutSolidTetrahedron()glutWireTetrahedron()繪制中心位于世界坐標(biāo)系原點(diǎn)實(shí)心四面體和線框四面體,四面體半徑為。glutSolidCube(size)glutWireCube(size)繪制中心位于世界坐標(biāo)系原點(diǎn)實(shí)心立方體和線框立方體,立方體半徑為size,size是一個(gè)雙精度浮點(diǎn)值。glutSolidOctahedron()glutWireOctahedron()繪制中心位于世界坐標(biāo)系原點(diǎn)實(shí)心八面體和線框八面體,八面體半徑為1.0。glutSolidDodecahedron()glutWireDodecahedron()繪制中心位于世界坐標(biāo)系原點(diǎn)實(shí)心12面體和線框12面體,12面體半徑為。glutSolidIcosahedron()glutWireIcosahedron()繪制中心位于世界坐標(biāo)系原點(diǎn)實(shí)心20面體和線框20面體,20面體半徑為1.0。表4.1GLUT生成規(guī)則多面體函數(shù)第40頁(yè)412.GLUT庫(kù)中二、三次曲面繪制實(shí)體或線框球面voidglutSolidSphere/glutWireSphere(GLdoubleradius,GLintslices,GLintstacks);繪制實(shí)體或線框圓錐面voidglutSolidCone/glutWireCone(GLdoubleradius,GLdoubleheight,GLintslices,GLintstacks);4.3實(shí)體第41頁(yè)422.GLUT庫(kù)中二、三次曲面繪制實(shí)體或線框圓環(huán)voidglutSolidTorus/glutWireTorus(GLdoubleinnerRadius,GLdoubleouterRadius
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025國(guó)際技術(shù)服務(wù)合同
- 2025年開封考貨運(yùn)資格證模擬試題
- 2025年河南貨物運(yùn)輸從業(yè)資格考試答題模板
- 2025年湖州貨運(yùn)從業(yè)資格證模擬考試
- 2025年百色貨運(yùn)資格證考試真題
- 2025加工承攬合同的范本
- 上海外國(guó)語大學(xué)賢達(dá)經(jīng)濟(jì)人文學(xué)院《品牌戰(zhàn)略傳播》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025nba史上最大合同
- 事業(yè)編離崗報(bào)告范文
- 呼吸道基礎(chǔ)解剖知識(shí)復(fù)習(xí)
- 料神外貿(mào)老鳥之路201407全整理
- 小學(xué)數(shù)學(xué)教師個(gè)人三年發(fā)展規(guī)劃(5篇)
- 神經(jīng)內(nèi)科年度發(fā)展規(guī)劃
- 煤礦安全責(zé)任清單
- 新高處安裝維護(hù)拆除作業(yè)專題培訓(xùn)課件
- 大眾朗逸2014款說明書
- 植物學(xué)單子葉植物胚的發(fā)育與結(jié)構(gòu)
- 新課標(biāo)下高中信息技術(shù)項(xiàng)目式學(xué)習(xí)教學(xué)評(píng)價(jià)體系初探 論文
- 行車時(shí)遇突發(fā)故障的應(yīng)急辦法演示
- 互聯(lián)網(wǎng)金融(同濟(jì)大學(xué))智慧樹知到答案章節(jié)測(cè)試2023年
- 超高大截面框架柱成型質(zhì)量控制
評(píng)論
0/150
提交評(píng)論