電腦遊戲製作開發設計論壇 首頁 電腦遊戲製作開發設計論壇
任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

Google
3D遊戲程式設計入門第11章心得

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫
上一篇主題 :: 下一篇主題  
發表人 內容
yag
Site Admin


註冊時間: 2007-05-02
文章: 688

2673.35 果凍幣

發表發表於: 2010-2-9, PM 6:34 星期二    文章主題: 3D遊戲程式設計入門第11章心得 引言回覆

前言:此乃補丁文。只講解心得,不提供完整教學,有興趣的人請自行購買此書。
代碼:
書名:3D遊戲程式設計入門-使用DirectX 9.0實作
作者:Frank D. Luna
譯者:黃聖峰
出版社:博碩文化

Bounding Volumes這個範例中
邊界球體跟邊界箱的位置都不對
並沒有完全包覆住戰機
請依下述方式修正

首先,在
代碼:
ID3DXMesh* SphereMesh = 0;
ID3DXMesh* BoxMesh    = 0;

bool RenderBoundingSphere = true;

中間插入兩個全域變數,變成下面這樣
代碼:
ID3DXMesh* SphereMesh = 0;
ID3DXMesh* BoxMesh    = 0;

D3DXMATRIX SphereTranslation;
D3DXMATRIX BoxTranslation;

bool RenderBoundingSphere = true;

這兩個變數是要拿來記錄邊界球體跟邊界箱的正確偏移量

接著在Setup函式中
代碼:
D3DXCreateBox(
   Device,
   boundingBox._max.x - boundingBox._min.x,
   boundingBox._max.y - boundingBox._min.y,
   boundingBox._max.z - boundingBox._min.z,
   &BoxMesh,
   0);

上面這個函式後面,插入
代碼:
D3DXMatrixTranslation( &SphereTranslation, boundingSphere._center.x, boundingSphere._center.y, boundingSphere._center.z );

D3DXVECTOR3 BoxCenter;

BoxCenter.x = ( boundingBox._max.x + boundingBox._min.x ) / 2.0f;
BoxCenter.y = ( boundingBox._max.y + boundingBox._min.y ) / 2.0f;
BoxCenter.z = ( boundingBox._max.z + boundingBox._min.z ) / 2.0f;

D3DXMatrixTranslation( &BoxTranslation, BoxCenter.x, BoxCenter.y, BoxCenter.z );

第一行是設定邊界球體的中心點
後面則是設定邊界箱的中心點
因為D3DXCreateBox傳入的參數只有長、寬、高
它會預設把邊界箱的中心點設在原點上
所以我們必須求得正確的中心點,並把邊界箱移過去
中心點的算法很簡單,我們已有最小頂點跟最大頂點
只要把最小+最大除以2就是中心了(國小數學?)

最後在Display函式中,將
代碼:
if( RenderBoundingSphere )
   SphereMesh->DrawSubset(0);
else
   BoxMesh->DrawSubset(0);

改成
代碼:
if( RenderBoundingSphere )
{
   World = SphereTranslation * World;
   Device->SetTransform(D3DTS_WORLD, &World);
   
   SphereMesh->DrawSubset(0);
}
else
{
   World = BoxTranslation * World;
   Device->SetTransform(D3DTS_WORLD, &World);

   BoxMesh->DrawSubset(0);
}

即完成,現在邊界箱跟邊界球體都會出現在正確的位置了。

要注意的是,世界矩陣相乘要照著 T * R 的順序( 平移 * 旋轉 )
因為飛機的中心點並不在原點
所以飛機繞著Y軸旋轉後,中心點也會跟著改變
因此我們必須先把邊界箱跟邊界球體的中心點與飛機的中心點對準
然後再來旋轉才會得到正確的結果
而矩陣相乘的順序即為其執行的順序,所以我們必須使用
代碼:
World = SphereTranslation * World;

來取得正確的World矩陣,不能使用
代碼:
World = World * SphereTranslation;
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
可以 在這個版面附加檔案
可以 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作