2013-11-01 48 views
1

我有一臺需要在物體周圍局部圍繞軌道的攝像機。該對象具有任意旋轉,由法向量描述。設想一個球形行星,用相機低頭看着那個星球上的某個三角形。正常矢量的旋轉矩陣,圍繞着極點翹曲

我目前的實現是使用經典的矢量交叉法從三角形的法線生成旋轉矩陣,然後使用該矩陣作爲標準軌道相機的基礎。這個星球在赤道附近工作的很好,但是一旦它接近極點,它就會開始爆炸,相機的行爲越來越不規律,越接近極點的中心。

我確定這是由於第一個矢量叉,因爲在這種情況下兩個矢量彼此靠近 - 我不確定這個現象的技術名稱是什麼。如果第一個矢量是0,1,0,當法線接近0,1,0或0,-1,0時發生瘋狂。

我發現這個問題的相當多的描述,但沒有工作方案。我來的最近的是這裏:http://xboxforums.create.msdn.com/forums/p/13278/13278.aspx它提到,爲了處理'奇點',當它被檢測到時使用不同的矢量。我可以很容易地確定攝像機在行星表面上何時會導致這種情況發生(因爲我的行星球體是從投影到球形座標的6個四叉樹產生的),但是當我切換到新的矢量時,會有一個非常明顯的瞬間。

下面是當前的代碼:

Vector3 triNormal; //the current normal of the target vertex 
Vector3 origin = Vector3.Forward; 
Matrix orientation.Forward = origin; 

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

我和檢測時三正是極面的一個,並設置「原點」到別的東西,如權試點。一旦它在臉上,照相機就會正常運行,但是當它穿過時,它會立即捕捉到新的旋轉。這是有道理的,因爲它的參考向量剛剛發生了變化,但爲了順利的用戶體驗需要消除。我試圖找出如何抵消相機對軌道相機的偏航以抵消新的座標系,但它似乎不是一個常數值,這取決於相機當前瞄準的球體的位置。我不知道我怎麼能計算出差別。

還要注意,因爲它在XNA和C#中,所以我使用的是右手座標系。

回答

0

我不明白你爲什麼這樣做:

orientation.Forward = Vector3.Cross(orientation.Right, orientation.Up); 
orientation.Forward.Normalize(); 
當您已經使用了以前 orientation.Forward獲得 orientation.Right


(如果你是「穿越」法線我不認爲你需要正常化他們。)

無論如何,如果triNormal是當前正常的目標頂點的,和你的攝像機觀察到它,我認爲你應該有:

orientation.Forward = -triNormal 
+0

規範化可能是不必要的;這更像是一個理智的檢查,以確保這不可能是問題。 採取第二個交叉它似乎並沒有太大的影響。它在那裏,因爲它在我見過的用於從旋轉中生成旋轉矩陣的其他所有算法中都存在 - 我還沒有找到一個合適的解釋來說明它究竟做了什麼。 將前向量設置爲-triNormal不起作用。如果我把它放在那裏,向上設置爲+ triNormal,矩陣似乎是無效的,因爲它不顯示任何東西。如果它是唯一被設置的,那麼它是相同的。 – Stardreamer

+0

當然如果你設置'Forward = -triNormal',你不能離開'Up = triNormal',但我無法弄清楚其他法線。 – pinckerman