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

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

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


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

2639.56 果凍幣

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

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

此章的範例code跟書上印的code在walk函式與fly函式裡有不同之處
我覺得範例code較為正確,所以下面將以範例code來修改
首先是walk函式,範例code如下:
代碼:
void Camera::walk(float units)
{
   // move only on xz plane for land object
   if( _cameraType == LANDOBJECT )
      _pos += D3DXVECTOR3(_look.x, 0.0f, _look.z) * units;

   if( _cameraType == AIRCRAFT )
      _pos += _look * units;
}

這種寫法,當_look被pitch到越高或越低時(或說當攝影機視線越往上看或越往下看時)
因為_look.y的絕對值越來越大,所以會導致_look.x及_look.z的值變小(因為_look是單位向量)
也就會造成當_cameraType是LANDOBJECT時
攝影機的移動速度會越來越慢
理論上當你90度看著天空或者90度看著地下時,你就會無法移動
這顯然是不正確的,而修改法如下:
代碼:
void Camera::walk(float units)
{
   // move only on xz plane for land object
   if( _cameraType == LANDOBJECT )
   {
      D3DXVECTOR3 landLook( _look.x, 0.0f, _look.z );
      D3DXVec3Normalize( &landLook, &landLook );
      _pos += landLook * units;
   }

   if( _cameraType == AIRCRAFT )
      _pos += _look * units;
}

只要將xz平面的向量加以正規化,使其成為單位向量即可讓它維持正確的移動速度

同理,strafe函式也要做一樣的處理,將
代碼:
void Camera::strafe(float units)
{
   // move only on xz plane for land object
   if( _cameraType == LANDOBJECT )
      _pos += D3DXVECTOR3(_right.x, 0.0f, _right.z) * units;

   if( _cameraType == AIRCRAFT )
      _pos += _right * units;
}

改成
代碼:
void Camera::strafe(float units)
{
   // move only on xz plane for land object
   if( _cameraType == LANDOBJECT )
   {
      D3DXVECTOR3 landRight( _right.x, 0.0f, _right.z );
      D3DXVec3Normalize( &landRight, &landRight );
      _pos += landRight * units;
   }

   if( _cameraType == AIRCRAFT )
      _pos += _right * units;
}


至於fly函式,沒有需要修改的地方,但要注意書中的code並不完整,請使用範例code

在執行範例程式時,會發現VK_UP鍵反而會導致攝影機往下看,而VK_DOWN鍵會導致攝影機往上看
這個不太符合直覺,所以請將Display函式裡的
代碼:
if( ::GetAsyncKeyState(VK_UP) & 0x8000f )
   TheCamera.pitch(1.0f * timeDelta);

if( ::GetAsyncKeyState(VK_DOWN) & 0x8000f )
   TheCamera.pitch(-1.0f * timeDelta);

這幾行改成如下:
代碼:
if( ::GetAsyncKeyState(VK_UP) & 0x8000f )
   TheCamera.pitch(-1.0f * timeDelta);

if( ::GetAsyncKeyState(VK_DOWN) & 0x8000f )
   TheCamera.pitch(1.0f * timeDelta);

如此一來,VK_UP、VK_DOWN即可符合直覺地執行了
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
Okerofujin
喜歡上這裡的冒險者


註冊時間: 2007-10-19
文章: 77

226.90 果凍幣

發表發表於: 2010-2-20, PM 10:44 星期六    文章主題: 引言回覆

這本書還買的到嗎???
之前有想要買
但去問店家時都說已經絕版了
回頂端
檢視會員個人資料 發送私人訊息
yag
Site Admin


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

2639.56 果凍幣

發表發表於: 2010-2-21, PM 1:22 星期日    文章主題: 引言回覆

HPkon 寫到:
這本書還買的到嗎???
之前有想要買
但去問店家時都說已經絕版了

不知道耶
不過店家買不到的話
可以上網拍看看
應該很多二手書
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
Okerofujin
喜歡上這裡的冒險者


註冊時間: 2007-10-19
文章: 77

226.90 果凍幣

發表發表於: 2010-2-22, AM 1:24 星期一    文章主題: 引言回覆

yag 寫到:
不知道耶
不過店家買不到的話
可以上網拍看看
應該很多二手書

網拍看過了...都沒有!!!
二手書店的老闆連聽都沒聽過
所以這本是我的怨念啊!!!


Okerofujin 在 2013-11-7, PM 10:15 星期四 作了第 2 次修改
回頂端
檢視會員個人資料 發送私人訊息
yag
Site Admin


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

2639.56 果凍幣

發表發表於: 2010-2-22, AM 11:33 星期一    文章主題: 引言回覆

HPkon 寫到:
yag 寫到:
不知道耶
不過店家買不到的話
可以上網拍看看
應該很多二手書

網拍看過了...都沒有!!!
二手書店的老闆連聽都沒聽過
所以這本是我的怨念啊!!!

0.0 這麼難找啊
那只能去圖書館借來看看囉
很多圖書館好像都有
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

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


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