當我嘗試改變方向時,我的相機圍繞一個點旋轉。如果我旋轉我的相機,例如說,在Y軸上旋轉30度,而不是相機朝右看30度,相機將旋轉它正在看的點。爲什麼我的相機用這個數學旋轉一點?
o is the camera, A and B are 3D models. The lines show line-of-sight.
This is what I expect:
A B
| >/
|/
|/
|/
o
This is what actually happens:
A B
|\
| \
| \
| > \
o
現在,根據我的理解,爲了移動相機,我必須以相反的量移動世界。所以如果我想在Z軸上移動+1,我會在Z軸上翻譯世界-1。由於我使用四元數來表示方位,因此我使用相機四元數的倒數(因爲方向總是單位四元數,我使用共軛進行優化,而不是計算倒數)以適當的量旋轉世界。
這裏是我怎麼轉換四元數矩陣,其中q是倒四元數:
[1 - 2 * (q.y * q.y + q.z * q.z) 2 * (q.x * q.y - q.w * q.z) 2 * (q.x * q.z + q.w * q.y) 0]
|2 * (q.x * q.y + q.w * q.z) 1 - 2 * (q.x * q.x + q.z * q.z) 2 * (q.y * q.z - q.w * q.x) 0|
|2 * (q.x * q.z - q.w * q.y) 2 * (q.y * q.z + q.w * q.z) 1 - 2 * (q.x * q.x + q.y * q.y) 0|
[0 0 0 1]
在那之後,我設置的矩陣的平移分量:
[... ... ... -x]
|... ... ... -y|
|... ... ... -z|
[0 0 0 1]
最後我將它乘到模型視圖矩陣堆棧上,然後渲染所有對象。 我很確定這個數學是正確的,但它不會產生我期待的結果。顯然,向前和向右的向量是問題,所以我唯一的問題是爲什麼他們錯了,如果我想要得到我期待的結果,應該如何設置它們。謝謝。編號: 我從this guy's quaternion camera class找到解決方案。首先我構造一個旋轉矩陣,就像我之前做的那樣,但是我從第一,第二和第三列(分別爲xa,ya和za)獲取矩陣的列向量。然後,我這樣設置矩陣的平移分量:
[... ... ... -xa.dotProduct(cameraPos)]
|... ... ... -ya.dotProduct(cameraPos)|
|... ... ... -za.dotProduct(cameraPos)|
[... ... ... ... ]
然後將所得矩陣可乘以到模型視圖矩陣堆棧,它完美。
使您的編輯解決方案,並接受它。這就是我們如何標記在這裏解決的問題。我想你應該得到一些解釋。我會爲此寫一個答案。 – datenwolf 2012-02-02 08:41:10