上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 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 文章: 71
-40.53 果凍幣
|
發表於: 2010-2-20, PM 10:44 星期六 文章主題: |
|
|
問題
Okerofujin 在 2018-7-5, PM 11:56 星期四 作了第 1 次修改 |
|
回頂端 |
|
|
yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2010-2-21, PM 1:22 星期日 文章主題: |
|
|
HPkon 寫到: | 這本書還買的到嗎???
之前有想要買
但去問店家時都說已經絕版了 |
不知道耶
不過店家買不到的話
可以上網拍看看
應該很多二手書 |
|
回頂端 |
|
|
Okerofujin 略有貢獻的成員
註冊時間: 2007-10-19 文章: 71
-40.53 果凍幣
|
發表於: 2010-2-22, AM 1:24 星期一 文章主題: |
|
|
問題
Okerofujin 在 2018-7-5, PM 11:57 星期四 作了第 4 次修改 |
|
回頂端 |
|
|
yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2010-2-22, AM 11:33 星期一 文章主題: |
|
|
HPkon 寫到: | yag 寫到: | 不知道耶
不過店家買不到的話
可以上網拍看看
應該很多二手書 |
網拍看過了...都沒有!!!
二手書店的老闆連聽都沒聽過
所以這本是我的怨念啊!!! |
0.0 這麼難找啊
那只能去圖書館借來看看囉
很多圖書館好像都有 |
|
回頂端 |
|
|
|