DirectX 圖形介面指南(4) (轉)

worldblog發表於2007-12-12
DirectX 圖形介面指南(4) (轉)[@more@]

指南三:使用矩陣:namespace prefix = o ns = "urn:schemas--com::office" />

 

本指南介紹矩陣的概念及演示如何使用它們。Vertices 例程透過呈遞2D的頂點畫出了一個三角形。然而,在這個指南中,你將透過頂點變換在 3-D 環境下工作。矩陣和變換也同樣用於設定攝影頭與視口(Viewport)。

 

在 Matrices 例程呈遞幾何物體之前,它自定義 SetupMatrices 建立並設定用於演示 3-D 三角形的矩陣變換。作為代表,三種型別的變換同時被設定到一個 3-D 場景。建立這些典型變換的步驟如下表:

 

·第一步:定義世界變換矩陣

·第二步:定義觀察變換矩陣

·第三步:定義對映變換矩陣

注意:Matrices 示例程式的路徑為:

(SDK )SamplesMultimediaDirect3DTutorialsTut03_Matrices.

 

建立這三種變換的順序並不影響場景元素的輸出。無論如何,Direct3D 都使用以下順序依次將矩陣作用於場景:(1) 世界,(2) 觀察,(3) 對映。

 

Matrices 工程的示例程式碼幾乎與 Vertices 工程的程式碼相同。該“使用矩陣”指南僅僅關注那些有關矩陣的獨特程式碼,而不重複初始化 Direct3D,處理 Microsoft 訊息,演示,以及清除。關於這些工作的資訊,請見 指南一:建立裝置

 

本指南使用自定義頂點格式和單個頂點緩衝區呈遞幾何模型,關於更多的有關選擇自定義頂點型別以及頂點緩衝區的資訊,見 指南二:演示頂點

 

第一步:定義世界變換矩陣(World Tranormation Matrix

 

世界變換矩陣定義了怎樣轉換、縮放、以及旋轉 3-D 模擬空間中的幾何物體。

 

以下程式碼片段為 Microsoft Direct3D 裝置設定當前的世界變換並且使三角形繞 y-軸 旋轉。

 

D3DXMATRIX matWorld;

D3DXMatrixRotationY( &matWorld, timeGetTime()/150.0f );

g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );

 

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

 

下一步是呼叫 IDirect3DDevice8::SetTransfo給 Direct3D 裝置設定世界變換。SetTransform 接受的第一個引數通知 Direct3D 被設定的是哪個轉換。這個例子用 D3DTS_WORLD 宏指定被設定的是世界變換。第二個引數是一個指向被設為當前變換之矩陣的指標。

 

關於世界變換的更多資訊,見:SDK: World Transformation

 

定義完場景的世界變換後,你可以準備觀察變換矩陣了。再一次請注意:定義任一變換的順序不是關鍵。無論如何,Direct3D 採用以下順序將這些矩陣作用於場景:(1) 世界,(2) 觀察,(3) 對映。

 

定義觀察變換矩陣請參看 第二步:定義觀察變換矩陣

 

第二步:定義觀察變換矩陣(View Transformation Matrix

 

觀察變換矩陣定義了觀察的位置和旋轉角度。此觀察矩陣就相當於場景的攝影機。

 

以下程式碼片段建立了一個觀察變換矩陣並將其設定為 Microsoft Direct3D 裝置的當前觀察矩陣。

 

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 );

 

第一步是透過呼叫 D3DXMatrixLookAtLH 定義觀察矩陣。第一個引數是一個指向 D3DXMATRIX 結構的指標,用來接受操作結果。第二、三、四個引數定義了觀察點、注視點、以及方向“上”。這兒設定觀察點為沿 Z-軸 反方向 5 單位再往上 3 單位,注視點為原點,以及作為“上”的方向為 Y-軸。

 

下一步是呼叫 IDirect3DDevice8::SetTransform 給 Direct3D 裝置設定觀察矩陣。SetTransform 接受的第一個引數通知 Direct3D 哪一個變換將要被設定。該例程使用 D3DTS_VIEW 標記指定為觀察矩陣。第二個引數是一個指向矩陣的指標,它被設為當前的變換。

 

關於觀察矩陣的更多資訊,見:SDK: View Transformation

 

定義了場景的世界變換後,你可以開始準備對映變換矩陣了。再一次提醒,定義每一變換的順序不是關鍵性的。無論如何,Direct3D 總是採用以下順序將矩陣應用於場景:(1) 世界,(2) 觀察,(3) 對映。

 

定義對映變換矩陣的工作被描述在 第三步:定義對映變換矩陣

 

第三步:定義對映變換矩陣(Projection Transformation Matrix

 

對映變換矩陣定義了將 3-D 觀察空間轉換為 2-D 視口空間的幾何學方法。

 

以下程式碼片段建立對映變換矩陣並將其設為 Microsoft Direct3D 裝置的當前對映變換。

 

D3DXMATRIX matProj;

D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );

g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );

 

第一步是呼叫 D3DXMatrixPerspectiveFovLH 設定對映矩陣。函式第一個引數是一個指向 D3DXMATRIX 的結構,用於接受操作的結果。第二個引數定義視場,它說明物體如何隨著距離而縮小。一個典型的視場是 1/4 π,就像這個例子使用的一樣。第三個引數定義了螢幕縱橫比。本示例採用典型的縱橫比 1。第四和第五個引數定義最近和最遠剪下平面。這是用於確定位於何種距離之外的幾何物體無需再繪製。本 Matrices 示例設定它的最近剪下平面為 1,最遠剪下平面為 100。

 

下一步是呼叫 IDirect3DDevice8::SetTransfrom 對 Direct3D 應用變換。SetTransfrom 接受的第一個引數通知 Direct3D 何種變換被設定。本例程使用 D3DTS_PROJECTION 標誌指定對映變換將被設定。第二個引數是一個指向矩陣的指標,它將被設定為當前的變換。

 

關於對映變換的更多資訊,參見:“對映變換”

 

本指南已經提示你如何使用矩陣。指南四:建立和使用光源 將揭示如何在你的場景中新增光源以增加真實性。

 

指南四:建立和使用光源 見本文第五部分)

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992155/,如需轉載,請註明出處,否則將追究法律責任。

相關文章