計算機圖形學曲線和曲面造型_第1頁
計算機圖形學曲線和曲面造型_第2頁
計算機圖形學曲線和曲面造型_第3頁
計算機圖形學曲線和曲面造型_第4頁
計算機圖形學曲線和曲面造型_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第三專題 曲面造型的發(fā)展趨勢曲面造型的發(fā)展趨勢 曲線的參數(shù)方程 )( )( )( tzz tyy txx 給定一個t值,就得到曲線上一點的坐標。當t在參 數(shù)域a,b內連續(xù)變化時,就得到了曲線。為了方便起見, 可以將a,b區(qū)間規(guī)范化成0,1。 kjip)()()()(tztytxt 曲線參數(shù)表示矢量方程式 )()()()(tztytxt, pp 給定一個t值,就得到曲線上一點的坐標。當t在參 數(shù)域a,b內連續(xù)變化時,就得到了曲線。為了方便起見, 可以將a,b區(qū)間規(guī)范化成0,1。 螺旋線的參數(shù)方程可以寫為螺旋線的參數(shù)方程可以寫為 bz ay ax sin cos ),( v bt 螺旋線的重要性質

2、:螺旋線的重要性質: ,: 00 ,: 00 bbbz 上升的高度與轉過的角度成正比即上升的高度與轉過的角度成正比即 上升的高度上升的高度 bh2 螺距螺距 ,2 tax cos tay sin vtz 或 曲線參數(shù)方程實例曲線參數(shù)方程實例 ),( ),( ),( vuzz vuyy vuxx 雙參數(shù)描述表達式 曲面的范圍通常用兩個參數(shù)u和v的變化區(qū)間的矩形區(qū)域 2121 ,vvvuuu 給出。這種曲面通常叫做矩形域曲面。參數(shù)u和v的變化區(qū)間一般規(guī)范為0,1, ),(),(),(),vuzvuyvuxvu s(s ),(zyx 矢量方程式為 當參數(shù)u,v在參數(shù)域0,1中連續(xù)變化時,其對應點 就

3、形成一張曲面。 向線稱為曲面的參數(shù)曲線(等參數(shù)線)。u,v 分別等于0,1時的參數(shù)曲線。 ),(),(),() 0000 vuzvuyvuxvu s(s v ),(),(),(),( 0000 vuzvuyvuxvu ss uv ) 1 ,(),0 ,(), 1 (), 0(ususvsvs ) 1 , 1 (),0 , 1 (),1 , 0(),0 , 0(ssss 當u=u0時, 表示曲面上一條沿V方向的空間曲線,稱為 向線, 向線和 曲面的邊界曲線 曲面的四個角點 u 向線。當v=v0時, 類似地,可以定義 nk du udp du udp uu k k uu k k , 1 , 0 )

4、()( 00 | 0)()( ii upup )( iii upupup )()( 2 n i nii uuBDuP 0 , 10)()( 其中)( , uB ni 被稱為Bernstein基函數(shù)。 ni in uu ini n in uuCuB ii i nni ,1 , 0)1 ( )!( ! ! )1 ()( , ) 1(*) 1(lk ), 1 , 0;,1 , 0( , ljkiD ji lk * lk * k i l j jlikji vuvBuBDvuS 00 , 1 , 0,)()(),( 。 )( , uB ik ik uuCuB i i kik )1 ()( , )( ,

5、vB jl jl j j ljl uuCvB )1 ()( , 為u向Bernstein基函數(shù), 為v向Bernstein基函數(shù), ), 1 , 0(niDi n i kii uufDuB 0 , 10),()( )( , uf ki 110 ki uuu ), 1 , 0(niDi 稱為B樣條基函數(shù),是由節(jié)點矢量U: 所決定的k次分段多項式。順序連接控制頂點 所形成的多邊形成為控制多邊形。 移動定點對B樣條曲線的影響 k次B樣條曲線與k+1個頂點有關 )()( , vfuf ljki 與 ), 1, 0;, 1, 0(njmiDij ) 1() 1(nm), 1, 0;, 1, 0(njmi

6、Dij 110 , km uuuU 110 , ln vvvV n i m j nlmkljkiij uuvuuuvfufDvuS 00 11, , )()(),(, n j kjj kii ki n i kii uB uB uR uRduP 0 , , , 0 , )( )( )( )()( )( , uR ki )( , uR ki 式中稱為k次有理基函數(shù), 具有和k次B樣條基函數(shù)相同的性質 n i kii n i kiii uB uBd uP 0 , 0 , )( )( )( ni i , 1 , 0, nidi, 1 , 0, 0, 0, 0 in 其余 )( , uB ki , 11

7、0 kn uuuU 式中:分別與 首、末權因子 。 為由節(jié)點矢量 節(jié)點矢量中的節(jié)點數(shù)為m=n+k+1,n為控制點數(shù),k為B樣條基函數(shù)的次數(shù)。 決定的k次B樣條基函數(shù)。 控制頂點 相聯(lián)系。 權因子 n i m j ljkiji n i m j ljkijiji vBuB vBuBd vuP 00 , 00 , )()( )()( ),( ji d , ji, )( , uB ki )( , vB lj 式中:控制頂點網(wǎng) 權因子 :v向節(jié)點矢量 :沿v向的l次B樣條基函數(shù) :沿u向的k次B樣條基函數(shù) :u向節(jié)點矢量u v NurbsNurbs曲線數(shù)據(jù)結構圖曲線數(shù)據(jù)結構圖 NurbsNurbs曲面數(shù)

8、據(jù)結構圖曲面數(shù)據(jù)結構圖 classCurve public: intCurveNo; *曲線號* intk; *曲線次數(shù)* ControlPointCP; *控制點指針* KnotVectorKV; *節(jié)點矢量指針* classControlPoint public: intVertexNo; *控制點序號* doubleVertex3; *控制點坐標* doubleWeight; *控制點權因子* public: voidFormatControl(CStringstr); ; classKnotVector public: intKnotNo; *節(jié)點序號* intMultiplicity

9、; *節(jié)點重復度* doubleKnotValue; *節(jié)點值* public: voidFormatKnot(CStringstr); ; VCVC寫的寫的NURBSNURBS曲線數(shù)據(jù)結構曲線數(shù)據(jù)結構 classSurface ControlPoint*Up; ControlPoint*Vp; KnotVector*KU; KnotVector*KV; VCVC寫的寫的NURBSNURBS曲面的數(shù)據(jù)結構曲面的數(shù)據(jù)結構 控制點、節(jié)點的可視化實現(xiàn)控制點、節(jié)點的可視化實現(xiàn) 為實現(xiàn)對控制點、節(jié)點鏈表實時進行插入、刪除和修改 等操作,可將這些操作同對話框聯(lián)系起來。并通過操作對話框 上的控件,實現(xiàn)對控制

10、點、節(jié)點鏈表實時插入、刪除和修改等 操作過程的可視化。 利用VC實現(xiàn)控制點鏈表的插入、刪除和修改等操作 過程的可視化的過程如下: (2)建立與對話框相聯(lián)系的類CmodifierVertex,同時編寫與按 鈕相關的成員函數(shù)OnAdd()、OnInsert()、OnUpdate()、 OnRemoveAt()和OnRemoveAll(); (1)建立如圖1所示的對話框,對話框中有按鈕Add、Insert、 Update、RemoveAt、RemoveAll,可對控制點鏈進行操作;有組合 框可顯示控制點鏈表中的數(shù)據(jù); (3)將控制點鏈表中的數(shù)據(jù)在組合框中顯示出來。 voidCModifierVert

11、ext:OnAdd() TODO:Addyourcontrolnotificationhandlercode here if(UpdateData()!TRUE) return; ControlPoint*pControlnewControlPoint; pControlVertexNom_VertexNo; pControlVertex0m_Vertexx; pControlVertex1m_Vertexy; pControlVertex2m_Vertexz; pControlWeightm_Weight; ControlPoint_ListAddTail(pControl); AddToL

12、istBox(pControl);*將數(shù)據(jù)添加到組合框* 添 加 操 作 的 程 序 設 計 實 例 PIXELFORMATDESCRIPTOR pixelDesc; /像素存儲格式化, 對結構變量進行了填充; pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);/pfd的大小 pixelDesc.nVersion = 1; /版本號 pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | /支持窗 口 PFD_SUPPORT_OPENGL| /支持OpenGL PFD_DOUBLEBUFFER; /支持雙緩存 pixelD

13、esc.iPixelType = PFD_TYPE_RGBA; /RGBA類型 pixelDesc.cColorBits = 32; /32位色深度 pixelDesc.cRedBits = 8; /各顏色位 pixelDesc.cRedShift = 16; pixelDesc.cGreenBits = 8; pixelDesc.cGreenShift = 8; pixelDesc.cBlueBits = 8; pixelDesc.cBlueShift = 0; pixelDesc.cAlphaBits = 0; /無alpha緩存 pixelDesc.cAlphaShift = 0; /忽

14、略轉換位 pixelDesc.cAccumBits = 64; /各累計位 pixelDesc.cAccumRedBits = 16; pixelDesc.cAccumGreenBits = 16; pixelDesc.cAccumBlueBits = 16; pixelDesc.cAccumAlphaBits = 0; pixelDesc.cDepthBits = 32; /32位深度緩存 pixelDesc.cStencilBits = 0; /無模版緩存 pixelDesc.cAuxBuffers = 0; /無輔助緩存 pixelDesc.iLayerType = PFD_MAIN_P

15、LANE; /主層 pixelDesc.bReserved = 0; /保留 pixelDesc.dwLayerMask = 0; pixelDesc.dwVisibleMask = 0; pixelDesc.dwDamageMask = 0; /設置一個線程的當前繪圖描述表 wglMakeCurrent(hDC,m_hGLContext); /對自由曲線曲面的繪制 DoNURBS(); /釋放繪圖描述表 wglMakeCurrent(hDC,NULL); /釋放RC(一般在WM_DESTORY消息響應函數(shù)OnDestory()中 進行) wglDeleteContext(m_hGLConte

16、xt); 至此,一個基于OpenGL的基本程序框架構造完畢,具體對 自由型曲線曲面的構造工作在DoNURBS()中完成。 在繪制自由曲線曲面之前用wglCreateContext()創(chuàng)建一個渲染 上下文RC并將其作為參數(shù),通過wglMakeCurrent()來建立一 個當前的繪圖描述表,并在繪制完畢后將其釋放。 /節(jié)點序列 GLfloat Notes8=0.0f,0.0f,0.0f,0.0f,1.0f,1.0f,1.0f,1.0f; /定義控制點 for(int i=0;i4;i+) for(int j=0;j4;j+) LinchpinPtij0=(GLfloat)(3.0f*(i-0.5f

17、); LinchpinPtij1=(GLfloat)(3.0f*(j-0.5f); if(0i else LinchpinPtij2=-4.0f; /創(chuàng)建NURBS曲面對象 Nurb=gluNewNurbsRenderer(); /設置NURBS曲面對象屬性 gluNurbsProperty(Nurb,GLU_SAMPLING_TOLERANCE,30.0f); gluNurbsProperty(Nurb,GLU_DISPLAY_MODE,GLU_FILL); /開始NURB區(qū)間繪制 gluBeginSurface(Nurb); /定義NURBS曲面的形狀 gluNurbsSurface(Nu

18、rb,8,Notes,8, Notes,4*3,3, /結束曲面繪制 gluEndSurface(Nurb); glPopMatrix(); /強制繪圖,不駐留緩存 glFlush(); void gluNurbsSurface( GLUnurbsObj * nobj, /NURBS曲面對象 GLint sknot_count, /u方向節(jié)點數(shù)目 GLfloat * sknot, /u方向節(jié)點數(shù)組指針 GLint tknot_count, /v方向節(jié)點數(shù)目 GLfloat * tknot, /v方向節(jié)點數(shù)組指針 GLint s_stride, /u方向控制點數(shù)據(jù)跨度 GLint t_strid

19、e, /v方向控制點數(shù)據(jù)跨度 GLfloat * ctlarray, /控制點數(shù)組指針 GLint sorder, /u方向上多項式階數(shù) GLint torder, /v方向上多項式階數(shù) GLenum type /確定求值器類型 ); 另有gluNurbsCurve()函數(shù)也可用于NURBS曲線曲面的定義,使用方法與之類似。 GLfloat Light_position=1.0f,1.0f,1.0f,0.0f,; GLfloat Light_diffuse=1.0f,1.0f,0.0f,1.0f,; glLightfv(GL_LIGHT0,GL_POSITION,Light_position); /定義 光源位置 glLightfv(GL_LIGHT0,GL_DIFFUSE,Light_diffuse); /定義光 源漫射光 glEnable(GL_AUTO_NORMAL); /自動生成曲面法向量 glEnable(GL_LIGHTING); /啟動光照模型; glEnable(GL_LIGHT0); /使光源GL_LIGHT0有效 OpenGL中所指的材質均指構成三維實體的材料在光照模型中對 于R、G、B三原色的反射率。與光源的定義類似,材質的定義 分環(huán)境、漫射、 鏡面

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論