簡體   English   中英

為什么我的相機會用這個數學圍繞一個點旋轉?

[英]Why does my camera rotate around a point with this math?

當我嘗試更改方向時,我的相機圍繞一個點旋轉。 如果我旋轉我的相機,比如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]

最后,我將它乘以模型視圖矩陣堆棧,然后渲染我的所有對象。 我很確定這個數學是正確的,但它不會產生我期待的結果。 很明顯,向前和向右的向量是問題,所以我唯一的問題是它們為什么是錯的,如果我想得到我期望的結果,應該如何設置它們。 謝謝。

編輯:我找到了這個家伙的四元數相機類的解決方案。 首先,我構建一個旋轉矩陣,就像我之前做的那樣,但后來我從第一列,第二列和第三列(分別為xa,ya和za)獲取矩陣的列向量。 然后我像這樣設置矩陣的平移分量:

[...  ...  ...  -xa.dotProduct(cameraPos)]
|...  ...  ...  -ya.dotProduct(cameraPos)|
|...  ...  ...  -za.dotProduct(cameraPos)|
[...  ...  ...  ...                      ]

然后,生成的矩陣可以乘以模型視圖矩陣堆棧,並且它可以完美地工作。

編輯:我找到了這個家伙的四元數相機類的解決方案。 首先,我構建一個旋轉矩陣,就像我之前做的那樣,但后來我從第一列,第二列和第三列(分別為xa,ya和za)獲取矩陣的列向量。 然后我像這樣設置矩陣的平移分量:

 [... ... ... -xa.dotProduct(cameraPos)] |... ... ... -ya.dotProduct(cameraPos)| |... ... ... -za.dotProduct(cameraPos)| [... ... ... ... ] 

然后,生成的矩陣可以乘以模型視圖矩陣堆棧,並且它可以完美地工作。

是的,這正是我所建議的,只是有點不同。 你必須明白,OpenGL沒有攝像頭,而是你只是向相反的方向移動世界,所以你需要找到逆變換矩陣。

相機只是旋轉並移動。 這使事情變得非常簡單。 平移的tnverse是具有相反符號的相同向量,旋轉矩陣的倒數是它的轉置(列和行交換)。 現在看一下像OpenGL這樣的同質變換矩陣:

R t
0 1

左上3×3是旋轉部分,最右邊的列是平移矢量。 我認為其余的你已經想到了自己。

說實話,試圖找到一個矩陣來乘以模塊 - 視圖矩陣是非常復雜和非常容易出錯的。 有很多混亂和特殊情況。 例如,如果你向上看90度,你的兩個軸會變得相同。 一個合乎邏輯的問題是:如果你向后滾動,那么你通過頂點,你的向上矢量應該倒置,對吧? 但如果錯過了0.0001度呢? 然后你應該轉過頭去那么你的向上矢量仍然是向上的。

在我看來,最好的方法是從另一個角度來解決問題。 我們假設兩種情況:

  • 顛倒不可能:
    • 保持相機位置和方向的緯度/經度。 通過簡單的sin / cos運算,您可以獲得方向向量。 你的向上矢量是(0,1,0)
    • 轉彎只是改變緯度和經度
  • 顛倒可能:
    • 除了相機位置,保持向上和目標向量。
    • 轉彎時,向右計算=目標x向上,然后將目標改為x *向右+向上*
    • 然后,您需要規范化目標向量並計算新的向上。 很多案件要處理。

完成所有這些之后,您只需致電gluLookAt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM