d3d矩陣變換

2021-06-20 21:24:35 字數 2420 閱讀 4510

1. d3d的繪製流水線

區域性座標系(模型空間)、世界座標系、觀察座標系、背面消隱、光照、裁剪、投影、視口變化、光柵化

每個3d模型都有自己的空間,空間的中心(原點)就是模型的中心。

世界空間就是物體(模型)存在的地方。世界的中心就是原點(0,0,0),注意螢幕中間的那一點不是世界空間的中心點,螢幕中間的那一點是由觀察座標系和投影的近裁剪平面決定的。

把模型放進世界空間,那麼這個模型就有了乙個世界座標。那麼這樣不同的模型就有了相對位置。需要注意的是旋轉和縮放是在模型空間中,平移是在世界空間裡面。

2.d3d設計到的三個矩陣

d3d的矩陣分為三種:世界座標矩陣(相當於opengl模型檢視矩陣),視矩陣,投影矩陣。他們的設定函式都是 pdevice->settransfrom();

direct3d 都使用以下順序依次將矩陣作用於場景:(1) 世界,(2) 觀察,(3) 對映。

(1).設定世界矩陣

d3dxmatrix matworld;

d3dxmatrixrotationy( &matworld, timegettime()/150.0f );

g_pd3ddevice->settransform( d3dts_world, &matworld );

第一步是通過呼叫 d3dxmatrixrotationy 函式使三角形繞 y-軸 旋轉。函式第乙個引數是指向 d3dmatrix 結構的指標用於返回操作結果。第二個引數是以弧度表示的旋轉角度。

下一步是呼叫 idirect3ddevice8::settransform 給 direct3d 裝置設定世界變換。settransform 接受的第乙個引數通知 direct3d 被設定的是哪個轉換。這個例子用 d3dts_world 巨集指定被設定的是世界變換。第二個引數是乙個指向被設為當前變換之矩陣的指標。

(2).設定觀察變換矩陣

在世界座標系中,我們需要設定乙個照相機模型來觀察物體,於是又有了觀察座標系。

d3dxmatrix *d3dxmatrixlookatlh(

d3dxmatrix* pout,

const d3dxvector3* peye,

const d3dxvector3* pat,

const d3dxvector3* pup

);pout:返回的檢視矩陣指標

peye:設定攝像機的位置

pat:設定攝像機的觀察點

pup:設定方向「上」

這個函式的字尾lh是表示左手系的意思,聰明的你一定能夠猜出肯定有個叫d3dxmatrixlookatrh的函式。

ex:d3dxmatrix matview;

d3dxmatrixlookatlh( &matview, &d3dxvector3( 0.0f, 3.0f,-5.0f ),

&d3dxvector3( 0.0f, 0.0f, 0.0f ),

&d3dxvector3( 0.0f, 1.0f, 0.0f ) );

g_pd3ddevice->settransform(d3dts_view, &matview );

(3).設定投影矩陣

在設定了觀察座標系之後,我們就需要設定投影矩陣了。投影是在觀察座標系裡面進行的。

定義投影矩陣很像是定義攝像機的鏡頭,下面看它的函式宣告:

d3dxmatrix *d3dxmatrixperspectivefovlh(

d3dxmatrix* pout,

float fovy,

float aspect,

float zn,

float zf

);pout:返回的投影矩陣指標

fovy:定義鏡頭垂直觀察範圍,以弧度為單位。對於這個引數,下面是我的理解:如果定義為d3dx_pi/4(90度角),那麼就是表示以攝像機的觀察方向為平分線,上方45度角和下方45度角就是攝像機所能看到的垂直範圍了。嗯,可以想象一下自己的眼睛,如果可以把自己眼睛的fovy值設為d3dx_pi/2(180度角),那麼我們就可以不用抬頭就看得見頭頂的東西了。如果設為d3dx_pi的話。。。我先編譯一下試試(building…)。哈哈,結果啥也看不見。很難想象如果自己能同時看到所有方向的物體,那麼將是乙個怎樣的畫面啊。

aspect:設定縱橫比。如果定義為1,那麼所看到的物體大小不變。如果定義為其它值,你所看到的物體就會變形。不過一般情況下這個值設為顯示器螢幕的長寬比。(終於明白為什麼有些人會說電視上的自己看起來會比較胖了……)

zn:設定攝像機所能觀察到的最遠距離

zf:設定攝像機所能觀察到的最近距離

ex:d3dxmatrix matproj;

d3dxmatrixperspectivefovlh( &matproj, d3dx_pi/4, 1.0f, 1.0f, 100.0f );

g_pd3ddevice->settransform( d3dts_projection, &matproj );

D3D的矩陣變換

物體座標 世界座標 視座標 投影座標 螢幕座標 這部分的說明已經不能再多了,但是有些細節其實d3d的文件中也比較難發現出來,還有些在文件中的解釋可能會讓人比較迷惑。1。視矩陣是什麼?參見 d3d的視矩陣是如何構造的 2。投影矩陣把z投影到 去了?我們在3d圖形學中學的投影矩陣是給出乙個平面,將3d空...

d3d矩陣總結

d3d中實現物件的基本渲染需要使用shader指令碼,而shader指令碼最低的的需求就是頂點與矩陣,在這裡主要討論矩陣 這個矩陣是3個矩陣運算得來的,分別是世界矩陣 視矩陣和投影矩陣 世界矩陣 世界矩陣就是標識者物體在世界座標系中的位置,預設下設為單位陣即可 視矩陣 視矩陣是攝像機位置和朝向的設定...

d3d 投影矩陣

這一節部落格 我將講述從乙個頂點從相機空間到到視平面的座標變化過程,理解這個過程座標值大小的範圍對於實現shadowmap,projectivetexture,pick技術來說至關重要。當然我還是省略掉大量詳細的推導過程,只是給出結果。如下面圖所示,紅色圈住的部分,就想下面的圖一樣 實際上d3d11...