在我的Direct3D應用程序中,可以使用鼠標或箭頭鍵移動相機。但是,如果我在LookAtLH
中將(0,1,0)硬編碼爲向上方向矢量,則該幀在相機的某些方向上變爲空白。在相機不斷移動時定義在Direct3D視圖矩陣中
我剛剛學會了沿着Y軸看時,(0,1,0)不再作爲向上方向(看起來很明顯?)的難題。我正在考慮爲這些特殊情況中的每一個切換我的向上方向。有沒有更優雅的方式來處理這個問題?
在我的Direct3D應用程序中,可以使用鼠標或箭頭鍵移動相機。但是,如果我在LookAtLH
中將(0,1,0)硬編碼爲向上方向矢量,則該幀在相機的某些方向上變爲空白。在相機不斷移動時定義在Direct3D視圖矩陣中
我剛剛學會了沿着Y軸看時,(0,1,0)不再作爲向上方向(看起來很明顯?)的難題。我正在考慮爲這些特殊情況中的每一個切換我的向上方向。有沒有更優雅的方式來處理這個問題?
假設你可以計算一個向前指向的向量(你正在看的是 - 你的位置)和一個向右的向量(總是在XZ平面上,除非你可以滾動)。標準化這兩個向量,然後向上x向右(其中x是交叉乘積)。一般來說,你可以插入你的偏航,俯仰和滾動到一個旋轉矩陣,並旋轉軸矢量來得到正確的,向上和向前的,但我想這就是你使用LookAtLH來避免的。
見http://en.wikipedia.org/wiki/Rotation_matrix#The_3-dimensional_rotation_matricies
的優雅的方式來處理,這是使用單位四元。四元數是4值的矢量,其編碼3D空間中的方向(不像某些文章斷言那樣旋轉),並且單位四元數是其中矢量長度爲sqrt(x^2 + y^2 + z^2 + w^2)是1.0。有一組數學運算用於處理四元數,類似於使用矩陣來編碼旋轉,四元數不能代表退化方向。當需要將結果反饋給GPU時,可以自由地將四元數轉換爲3x3或4x4矩陣。
您的問題是,當您移動相機時,您會在相機的向上方向上引入一點點扭曲。通過強制相機在每次迭代時重新對準(0,1,0)矢量,您實際上旋轉相機,然後將相機的方向夾緊以保持在球體的表面上,但是當相機擊中這個球體的極點沒有一個好的方向叫做「向上」,而且你的矩陣變得單一,並給你零大小的多邊形(因此黑色屏幕)。四元數有能力通過這些極點進行插值,並且可以很好地從另一側出來,從而爲您始終提供有效的矩陣。你所要做的就是控制「扭曲」。
要測量這種扭曲,你應該閱讀Ken Shoemake在「圖形寶石4」一書中的文章「Fiber Bundle Twist Reduction」。他展示了一種衡量這種累積扭曲的好方法,以及在冒犯時如何去除它。
我目前使用的解決方案是這樣的:i)最初定義爲(0,1,0)或適合的東西並將其存儲在向量中ii)當用戶改變相機方向時,相應地旋轉存儲的矢量並且將其設置爲新的向上矢量 – 2008-11-06 04:57:00