yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2010-2-25, PM 9:18 星期四 文章主題: 3D遊戲程式設計入門第15章心得[未解之疑問篇] |
|
|
前言:此乃補丁文。只講解心得,不提供完整教學,有興趣的人請自行購買此書。
代碼: | 書名:3D遊戲程式設計入門-使用DirectX 9.0實作
作者:Frank D. Luna
譯者:黃聖峰
出版社:博碩文化 |
這一章又有看不懂的地方~"~
總之,先來說一下心得吧
Display函式中必須在
代碼: | static float angle = 0.0f; |
下面加個
代碼: | static bool add = true; |
然後把
代碼: | if( r >= 8.0f )
v = -v; // reverse direction
if( r <= 0.0f )
v = -v; // reverse direction |
改成
代碼: | if( r >= 8.0f && add )
{
v = -v; // reverse direction
add = false;
}
if( r <= 0.0f && !add )
{
v = -v; // reverse direction
add = true;
} |
為什麼呢?
因為不知為何,只要點中了茶壺,在
代碼: | ::MessageBox(0, "Hit!", "HIT", 0); |
呼叫出訊息視窗後,主視窗就不會再更新了
是因為卡住嗎?還是因為Device暫時遺失?或者其他原因?
我不清楚,總之,主視窗不會再更新
而當你等個30秒後才把訊息視窗點掉
使主視窗再次更新時
茶壺距離中心點的差距就會因為
上式中timeDelta的大增而直接爆出視窗外
爆出視窗外頂多點不到,重點是它還大於了8.0f這個界線
讓我們再看一次原本的算式:
代碼: | if( r >= 8.0f )
v = -v; // reverse direction |
我們可以看出來,當r >= 8.0f時,v就會反向
此時我們的r已經遠大於8.0f
而在正常情況下,一個frame中timeDelta的量不可能使r直接減回到小於8.0f的程度
因此,v就會再次反向,你就會發現r變成了減一次、加一次、減一次、加一次……
永遠也不會縮回來中心點了
這顯然是錯誤的
於是我們需要加個bool變數,來判斷目前v到底該是正數還是負數
也就是像上面所述那樣改善了
接著就要來說疑問了…
疑問一:
就是上面說過的,為什麼「呼叫出訊息視窗後,主視窗就不會再更新」?
是因為卡住嗎?還是因為Device暫時遺失?或者其他原因?
還請知道的大大幫忙解答一下
疑問二:
CalcPickingRay函式中,求得px、py的式子:
代碼: | px = ((( 2.0f*x) / vp.Width) - 1.0f) / proj(0, 0);
py = (((-2.0f*y) / vp.Height) + 1.0f) / proj(1, 1); |
為什麼要分別除以proj(0, 0)及proj(1, 1)呢?
或者說,為什麼只需要這樣做就可以從投影平面轉回到視覺空間?
書上是說「因為投射矩陣會縮放投射視窗上的點以便模擬不同的觀察區域」
但是難道投射矩陣就不會把點給平移或旋轉之類的嗎?
為什麼只要分別除以proj(0, 0)及proj(1, 1)就可以逆推回視覺空間?
疑問三:
承上,書上說這兩個式子是因為視埠轉化矩陣中的X及Y通常是0的關係
所以才可以簡化為這樣的式子
但是,為什麼視埠轉化矩陣中的X及Y通常為0?
又是什麼狀況下會不為0?
不為0時又該怎麼計算呢?
共三點疑問,謝謝。 |
|