2013-03-19 61 views
1

我有我認爲是相機一個相當簡單的場景,但我的穴居人大腦拒絕在任何超過兩個維度思考。相機旋轉對齊到任意飛機

我的3D相機需要在物體後面對齊。這個對象可以堅持任何表面,因此攝像機關於「up」的概念可以是任意的矢量。這與這個問題非常相似,但由於我不是直接控制'player'對象,而是試圖使用CreateLookAt,所以我無法理解解決方案:How can I calculate the rotation when using a quaternion camera?

爲了簡化測試,我們假設該對象在一個球體上。

我目前有:

  • 目標對象在三維空間中的絕對位置。
  • 一個單位矢量,表示對象當前所在表面的法線。在這種情況下,球體上的三角形的法線。
  • X和Y角描述攝像機應如何繞軌道運動。

我相信這是所有必需的,但我不知道如何把它放在一起,以一種有效的方式。我知道,我需要通過對象的norMy最好的嘗試改造angle'd相機如下:

Matrix orientation = Matrix.CreateRotationY(OrbitYaw) * Matrix.CreateRotationX(OrbitPitch); 

orientation.Up = CurrentNormal; 
orientation.Right = Vector3.Cross(orientation.Forward, orientation.Up); 
orientation.Right = Vector3.Normalize(orientation.Right); 
orientation.Forward = Vector3.Cross(orientation.Up, orientation.Right); 
orientation.Forward = Vector3.Normalize(orientation.Forward); 

Vector3 Target = ObjectPosition; 

Vector3 Position = Vector3.Transform(new Vector3(0,50,0), orientation); 

Matrix View = Matrix.CreateLookAt(Position, Target, CurrentNormal); 

定位代碼似乎是正確的,但它是很難說,因爲第二個問題組成:當位置改變時,相機看起來會「滾動」。這是有道理的 - 所有相機知道它的位置和在哪裏看,我沒有明確告訴它它應該如何旋轉。這是我需要做的,以便相機在跟蹤對象時保持不變的對齊(除了保持相同相對位置所必需的對齊外)。

+0

球體上的物體是否「直立」?也許你可以使用與球體上的物體相同的旋轉。 – 2013-03-19 13:04:12

回答

0

Tim S在他的評論中說了些什麼,你可以從相機所追隨的物體中借用一些方面來獲取相機的方向。

cameraPosition = objectPosition + (objectOrientation.Backward * 50); 
cameraTarget = objectPosition; 

Matrix cameraArc = Matrix.CreateFromAxisAngle(objectOrientation.Up, orbitYaw) * Matrix.CreateFromAxisAngle(objectOrientation.Right, orbitPitch);//assumes objectOriention is a ortho-normal matrix 

cameraPosition = Vector3.Transform(cameraPosition - cameraTarget, cameraArc) + cameraTarget; 

view = Matrix.CreateLookAt(cameraPosition, cameraTarget, Vector3.Up); 

儘管堵漏Vector3.Up到最後一行(你應該在你的情況一樣),視圖矩陣的方向向量將在對準對象的向上向量。

+0

我的問題是沒有創建對象方向矩陣 - 它只是一個支點,所以我相信我仍然需要創建它的旋轉矩陣,然後才能使用它。 我試過你的解決方案,但它給了我類似的行爲,我自己的嘗試 - 我猜這意味着我的方向矩陣有問題?它是使用我的第一篇文章中的代碼創建的。 – Stardreamer 2013-03-19 15:46:25

+0

看來問題不在於你的代碼,而在於我的正常代。我試圖在XNA heightmap示例中創建相同類型的相機,並且它完美地工作。在我的測試中,我仍然從相機中獲得非常奇怪的行爲。但是,當我畫出法線時,它們看起來是正確的 - 是否有我缺少的特殊情況? – Stardreamer 2013-03-19 23:03:58

+0

Steve H的解決方案是正確的。我遇到的問題完全是由於我的正常世代。 :) – Stardreamer 2013-03-26 13:42:31