版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章頂點(diǎn)坐標(biāo)變換空間中的物體需要使用三維坐標(biāo)來(lái)描述,而顯示器是一個(gè)二維的表面,所以在屏幕上渲染一個(gè)三維場(chǎng)景時(shí),首先需要將描述空間物體的三維坐標(biāo)變換為二維坐標(biāo),這在Direct3D中稱為頂點(diǎn)坐標(biāo)變換。頂點(diǎn)坐標(biāo)變換通常通過(guò)矩陣來(lái)完成。4.1頂點(diǎn)坐標(biāo)變換和光照流水線概述Direct3D標(biāo)準(zhǔn)的圖形顯示過(guò)程可分為兩個(gè)階段。第一階段稱為坐標(biāo)變換和光照(TraansformingandLinghting簡(jiǎn)稱T&L)。第二階段稱為光柵化處理階段。坐標(biāo)變換和光照階段(T&L)這個(gè)階段,每個(gè)對(duì)象的頂點(diǎn)被從一個(gè)抽象的、浮點(diǎn)坐標(biāo)空間轉(zhuǎn)換到基于像素的屏幕空間,并根據(jù)場(chǎng)景中的光源和物體表面的材質(zhì)對(duì)物體頂點(diǎn)應(yīng)用不同類型的光照效果。還有裁剪和視口縮放也在第一階段進(jìn)行。通過(guò)設(shè)置一個(gè)虛擬相機(jī),世界空間的三維坐標(biāo)轉(zhuǎn)換成屏幕空間以像素為單位的整數(shù)坐標(biāo)(坐標(biāo)變換不只是物體頂點(diǎn)位置的坐標(biāo)變換,它還可能包括頂點(diǎn)法線向量、紋理坐標(biāo)等坐標(biāo)變換),然后通過(guò)計(jì)算當(dāng)時(shí)場(chǎng)景中的光照屬性,賦予頂點(diǎn)相應(yīng)的顏色值。光柵化處理階段
Direct3D將經(jīng)過(guò)T&L處理的頂點(diǎn)組織為以點(diǎn)、線、面為基礎(chǔ)的圖元,應(yīng)用紋理貼圖和物體頂點(diǎn)的顏色屬性,根據(jù)相關(guān)渲染狀態(tài)設(shè)置,決定每個(gè)像素的最終顏色值,并在屏幕上顯示出來(lái)。頂點(diǎn)變換流水線(T&L)
T&L過(guò)程在Direct3D中通常稱為頂點(diǎn)變換流水線,在這個(gè)過(guò)程中,未經(jīng)過(guò)變換和光照的頂點(diǎn)從一端進(jìn)入,在內(nèi)部這些頂點(diǎn)將完成幾個(gè)連續(xù)操作,然后經(jīng)過(guò)轉(zhuǎn)換和光照的頂點(diǎn)從另一端出來(lái)。模型幾何變換和世界坐標(biāo)系物體在三維空間的運(yùn)動(dòng)和變形過(guò)程稱之為模型幾何變換,如平移、旋轉(zhuǎn)和縮放等。我們將物體在其中運(yùn)動(dòng)的三維實(shí)質(zhì)問(wèn)題稱為世界空間,它的三維坐標(biāo)系表示為世界坐標(biāo)系,物體頂點(diǎn)在世界的坐標(biāo)系里的坐標(biāo)表示稱為世界坐標(biāo)。取景變換和觀察坐標(biāo)系把圖形顯示想象成攝像過(guò)程,取景變換就像攝影中攝像機(jī)的擺入一樣,在三維圖形顯示中,需要設(shè)置一個(gè)虛擬攝像機(jī),屏幕顯示的圖形就是虛擬攝像機(jī)拍攝在膠片上的景物。以攝像機(jī)為參考原點(diǎn),攝像機(jī)觀察的方向?yàn)樽鴺?biāo)坐標(biāo)軸,建立的坐標(biāo)系稱為觀察坐標(biāo)系,物體在觀察坐標(biāo)系中相對(duì)坐標(biāo)稱為觀察坐標(biāo),頂點(diǎn)從世界坐標(biāo)到觀察坐標(biāo)的轉(zhuǎn)換稱為取景變換。投影變換和投影坐標(biāo)系物體從世界坐標(biāo)描述轉(zhuǎn)換到觀察坐標(biāo)后,我們可以將三維物體投影到二維平面上,即投影到虛擬相機(jī)的膠片上,這個(gè)過(guò)程稱為投影變換。以膠片中心為參考原點(diǎn)的空間坐標(biāo)系稱為投影坐標(biāo)系,物體在投影坐標(biāo)系中的坐標(biāo)表示稱為投影坐標(biāo)。坐標(biāo)變換和屏幕表示物體在投影坐標(biāo)系中的表示為浮點(diǎn)坐標(biāo),通過(guò)定義屏幕顯示區(qū)域(一般為屏幕大小),將浮點(diǎn)坐標(biāo)轉(zhuǎn)化為像素坐標(biāo)的過(guò)程稱為社區(qū)變換,該像素坐標(biāo)值稱為屏幕坐標(biāo)。三維物體建模,非T&L頂點(diǎn)世界坐標(biāo)系表示取景,觀察坐標(biāo)系表示投影,投影坐標(biāo)系表示圖形繪制屏幕坐標(biāo)表示屏幕坐標(biāo)表示屏幕坐標(biāo)表示設(shè)置頂點(diǎn)變換矩陣HRESULTIDirect3DDevice9::SetTransform(D3DTRANSFORMSTATETYPEstate,CONSTD3DMATRIX*pMatrix);state取值:D3DTRANSFORMSTATE_WORLD世界變換矩陣D3DTRANSFORMSTATE_VIEW取景變換矩陣D3DTRANSFORMSTATE_PROJECTION投影變換矩陣pMatrix指向變換矩陣的內(nèi)存地址。設(shè)置變換的視區(qū)信息HRESULTSetViewport(CONSTD3DVIEWPORT9*pViewport)4.2矩陣類型及操作在D3D中頂點(diǎn)坐標(biāo)變換通常是借助于矩陣實(shí)現(xiàn)的,D3D中提供了許多矩陣類型和相關(guān)的矩陣運(yùn)算函數(shù)。D3DMATRIX矩陣類型D3DMATRIX是D3D中最簡(jiǎn)單的矩陣類型:typedef
struct_D3DMATRIX{union{
struct{float_11,_12,_13,_14;float_11,_12,_13,_14;float_11,_12,_13,_14;float_11,_12,_13,_14;}floatm[4][4];}}D3DXMATRIX矩陣類型typedef
structD3DXMATRIX{FLOAT_11,FLOAT_12,FLOAT_13,FLOAT_14;FLOAT_21,FLOAT_22,FLOAT_23,FLOAT_24;FLOAT_31,FLOAT_32,FLOAT_33,FLOAT_34;FLOAT_41,FLOAT_42,FLOAT_43,FLOAT_44;}注:這個(gè)結(jié)構(gòu)體只能用于C++而不能用于C。其它矩陣類型D3D除上述的矩陣類型外還有以下類型:D3DXMATRIXA16:16字節(jié)對(duì)齊矩陣D3DXMATRIX及D3DXMATRIXA16擴(kuò)展矩陣類型。常見(jiàn)矩陣運(yùn)算函數(shù)因?yàn)榫仃嚨倪\(yùn)算相對(duì)比較復(fù)雜,所以D3D提供了一組去處函數(shù),例如,通過(guò)函數(shù)通過(guò)D3DXMatrixTranslation()構(gòu)造一個(gè)平移矩陣,通過(guò)函數(shù)D3DXMatrixRotationX()構(gòu)造繞x軸轉(zhuǎn)動(dòng)一定角度的矩陣;4.3世界變換世界變換就是將物體頂點(diǎn)坐標(biāo)從模型空間轉(zhuǎn)換到世界空間。在模型空間里,所有模型的頂點(diǎn)共用一個(gè)原點(diǎn),即世界坐標(biāo)系原點(diǎn)。事實(shí)上,世界變換就是將一個(gè)模型從本地空間重新定位到世界空間內(nèi)。從模型空間到世界空間的轉(zhuǎn)換實(shí)際上就是對(duì)模型進(jìn)行平衡、旋轉(zhuǎn)、縮放以及它們的組合變換。世界變換矩陣在處理三維圖像的應(yīng)用程序中,可使用世界變換完成一個(gè)物體的平衡、旋轉(zhuǎn)和縮放。當(dāng)然了可以完成這三種變換的任意組合。平移變換#include<d3dx9.h>D3DXMATRIX*D3DXMatrixTranslation(D3DXMATRIX*pOut,FLOATx,FLOATy,FLOATz)平移代碼片段D3DXMATRIX
matTranslat;D3DXMatrixTranslation(matTranslate,tx,ty,tz);g_pd3dDevice->SetTransform(D3DTS_WORLD,
&matTranslate);旋轉(zhuǎn)變換D3DXMATRIX*WINAPID3DXMatrixRotationX(D3DXMATRIX*pOut,FLOATAngle);D3DXMATRIX*WINAPID3DXMatrixRotationY(D3DXMATRIX*pOut,FLOATAngle);D3DXMATRIX*WINAPID3DXMatrixRotationZ(D3DXMATRIX*pOut,FLOATAngle);*Angle為弧度值旋轉(zhuǎn)變換代碼片段#include<d3dx9.h>D3DXMATRIXmatRotate;FLOATfAngle=90*(2.0f*D3DX_PI)/360.0f;//g_pd3dDevice為一個(gè)有效的Direct3D設(shè)備指針。g_pd3dDevice->SetTransform(D3DTS_WORLD,
&matRotate);縮放變換D3DXMATRIX*D3DXMatrixScaling(D3DXMATRIX*pOut,FLOATsx,FLOATsy,FLOATsz);縮放變換代碼片段#include<d3dx9.h>D3DMATRIXmatScale;D3DXMatrixScaling(&matScale,1.0f,0.5f,1.0f);//g_pd3dDevice為一個(gè)有效的Direct3D指針g_pd3dDevice->SetTransform(D3DTS_WORLD,&matSclale);復(fù)合變換大多數(shù)情況下,作用于物體的不只是一個(gè)幾何變換,而往往是各種幾何變換的組合。這時(shí),就需要將每個(gè)單一的幾何變換矩陣依次相乘形成復(fù)合三維變換。矩陣乘函數(shù)D3DXMATRIX*D3DXMatrixMultiply( D3DMATRIX*pOout, CONSTD3DXMATRIX*pM1, CONSTD3DXMATRIX*pM2)將一個(gè)物體縮小1/3,然后沿Z軸旋轉(zhuǎn)60°最后平移(10,0,0)。的復(fù)合變換的代碼片段:#include<d3dx9.h>D3DXMATRIXmatWorld;D3DXMATRIXmatScale,matTranslate,matRotate;D3DXMatrixScaling(&matScale,2/3.0f,,2/3.0f,2/3.0f);FLOATfAngle=60*(2.0f*D3D_PI)/360.0f;D3DXMatrixRotationZ(&matRotate,fAngle);D3DXMatrixMutiply(&matWorld,&matScale,&matRotate);D3DXMatrixTranslation(&matTranslate,10.0f,0.0f,0.0f);D3DXMatrixMutiply(&matWorld,&matWorld,&matTranslate);g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);4.4取景變換:為了使三維景物在屏幕上成像,我們必須設(shè)置一個(gè)觀察點(diǎn),它相當(dāng)于一個(gè)虛擬相機(jī),三維物體從世界空間到虛擬空間的坐標(biāo)變換過(guò)程稱為取景變換。設(shè)定虛擬相機(jī)函數(shù)D3DXMATRIX*D3DXMatrixLookAtLH( D3DXMATRIX*pOut, CONSTD3DXVECTOR3*pEye, CONSTD3DXVECTOR3*pAt, CONSTD3DXVECTOR3*pUp);參數(shù)說(shuō)明pOut:生成的觀察矩陣pEye:攝影機(jī)位置pAt:觀察點(diǎn)的位置。pUp:攝像機(jī)上向量設(shè)置虛擬相機(jī)的代碼片段#include<d3dx9.h>D3DXVECTOR3vEye(0.0f,3.0f,-5.0f);D3DXVECTOR3vLookatPt(0.0f,0.0f,0.0f);D3DXVECTOR3vUpVec(0.0f,1.0f,0.0f);D3DXMATRIXA16matView;D3DXMatrixLookAtLH(&matView,&vEyePt,
&vLookatPt,&vUpVec);g_pd3dDevice->SetTransform(D3DTS_VIEW,
&matView);4.5投影變換投影變換是將三維景物投射到一個(gè)二維平面上。正交投影在正交投影中,投影向量與觀察平面垂直,觀察點(diǎn)與觀察平面的距離不會(huì)影響物體的大小。創(chuàng)建正交投影矩陣D3DXMATRIX*D3DXMatrixOrthoLH( D3DXMATRIX*pOut, FLOATw, FLOATh, FLOATznear, FLOATzfar);參數(shù)說(shuō)明pOut:指向生成的正交投影矩陣w、h:取景長(zhǎng)文體的寬和高zenar、zfar:取景長(zhǎng)方體距離攝影機(jī)的最近和最遠(yuǎn)距離。創(chuàng)建正交投影代碼片段:D3DXMATRIXmatProject;D3DXMatrixOthoLH(&matProj,width,
height,Znear,Zfar);g_pd3dDevice->SetTranform(D3DTS_PROJECTION,&matProject);透視投影透視投影的特點(diǎn)是遠(yuǎn)處的物體在投影平面上的成像被縮小了。物體離視點(diǎn)的越遠(yuǎn),物體的像就越小。創(chuàng)建透視投影矩陣函數(shù)D3DXMATRIX*D3DXMatrixPerspectiveFovLH( D3DXMATRIX*pOut,//生成的透視投影矩陣
FLOATfovY,//在y軸上的成像角度(弧度) FLOATAspect,//截頭體的縱橫比
FLOATznear,//截頭體距點(diǎn)的最近距離
FLOATzfar//截頭體距視點(diǎn)的最遠(yuǎn)距離);生成透視矩陣代碼片段D3DXMATRIXmatProject;D3DXMatrixPerspectiveFovLH(&matProject,
fovY,(float)height/width,Znear,Zfar);g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProject);視區(qū)變換視區(qū)變換是Direct3D頂點(diǎn)變換流水線的最后一步,通過(guò)定義屏幕顯示區(qū)域的實(shí)際寬、高等參數(shù),它將頂點(diǎn)從投影坐標(biāo)轉(zhuǎn)換為最終顯示的以像素為單位的屏幕坐標(biāo)。它主要有2個(gè)作用:頂點(diǎn)裁剪將頂點(diǎn)投影坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo)。視區(qū)結(jié)構(gòu)typedef
struct_D3DVIEWPORT9{ DWORDX;//視區(qū)左上角x坐標(biāo),StartX DWORDY;//視區(qū)左上角y坐標(biāo),StartY DWORDWidth;//視區(qū)寬度
DWORDHeight;//視區(qū)高度
floatMinZ;//視區(qū)內(nèi)景物的最小深度值,0~1.0f之 //間,一般為0 floatMaxZ;//視區(qū)內(nèi)景物的最大深度值,0~1.0f之 //間,一般為1.0f}D3DVIEWPORT9;設(shè)置視區(qū)函數(shù)IDirect3DDevice9::SetViewport(CONSTD3DVIEWPORT9*pViewport);SetViewport()的作用相當(dāng)于頂點(diǎn)乘以下矩陣Width/20000-Height/20000MaxZ-MinZ0StartX+Width/2StartY+Height/2MinZ1RECTrect;GetClientRect(hWnd,&rect);D3DVIEWPORT9vp;vp.X=0;vp.Y=0;vp.Width=rect.right;vp.Height=rect.bottom;vp.MinZ=0.0f;vp.MaxZ=1.0f;g_pd3dDevice->SetViewport(&vp);GetClientRect( HWNDhWnd,//窗口句柄
LPRECTlpRect//存儲(chǔ)返回的窗口信息
//RECT結(jié)構(gòu)地址);清空視區(qū)一般情況下,在繪制每一幀圖形前都要先清空視區(qū),即清空渲染目標(biāo)表面上的視區(qū)矩形的內(nèi)容:顏色緩沖區(qū)、深度緩沖區(qū)或者模板緩沖區(qū)。使用函數(shù)IDirect3DDevice9::Clear()來(lái)清空視區(qū)。IDirect3DDevice::Clear函數(shù)聲明HRESULTIDirect3DDevice9::Clear(DWORDCount,constD3DRECT*pRect,DWORDFlags,D3DCOLORColor,floatz,DWORDStencil)參數(shù)說(shuō)明Count:重置的矩形區(qū)域pRect:重置的矩形區(qū)域數(shù)組指針Flags:重置緩沖區(qū)標(biāo)志Color:重置的顏色值z(mì):重置的深度值Stencil:重置的模板值當(dāng)把Count設(shè)為0,而pRects設(shè)為NULL時(shí)為清空整個(gè)視區(qū)。Flags:可以取D3DCLEAR_TARGET、D3DCLEAR_ZBUFFER和D3DCLEAR_STENCIL的任意組合,指定對(duì)顏色緩沖區(qū)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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年度個(gè)人貸款合同補(bǔ)充協(xié)議(逾期罰息調(diào)整)4篇
- 2025個(gè)人合伙企業(yè)股份回購(gòu)與出售合同4篇
- 二零二五年物流行業(yè)市場(chǎng)調(diào)研與分析合同模板3篇
- 歸還合同范本(2篇)
- 二零二五年度鋁型材門窗加工節(jié)能減排技術(shù)創(chuàng)新合同4篇
- 安全知識(shí)講座模板
- 興仁別墅建造施工方案
- 家風(fēng)建設(shè)不足
- 2025年物流公司正式員工勞動(dòng)合同解除及經(jīng)濟(jì)補(bǔ)償金合同3篇
- 2024年中級(jí)經(jīng)濟(jì)師考試題庫(kù)含答案(培優(yōu))
- 2025年上半年江蘇連云港灌云縣招聘“鄉(xiāng)村振興專干”16人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- DB3301T 0382-2022 公共資源交易開(kāi)評(píng)標(biāo)數(shù)字見(jiàn)證服務(wù)規(guī)范
- 人教版2024-2025學(xué)年八年級(jí)上學(xué)期數(shù)學(xué)期末壓軸題練習(xí)
- 江蘇省無(wú)錫市2023-2024學(xué)年八年級(jí)上學(xué)期期末數(shù)學(xué)試題(原卷版)
- 俄語(yǔ)版:中國(guó)文化概論之中國(guó)的傳統(tǒng)節(jié)日
- 2022年湖南省公務(wù)員錄用考試《申論》真題(縣鄉(xiāng)卷)及答案解析
- 婦科一病一品護(hù)理匯報(bào)
- 2024年全國(guó)統(tǒng)一高考數(shù)學(xué)試卷(新高考Ⅱ)含答案
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(yíng)(吳洪貴)任務(wù)四 引起受眾傳播內(nèi)容要素的掌控
- 繪本《汪汪的生日派對(duì)》
- 助產(chǎn)護(hù)理畢業(yè)論文
評(píng)論
0/150
提交評(píng)論