2013-03-26 67 views
2

我有一個以球體表面上的一個點爲中心的3D攝像頭。它遵循並完美地旋轉,除了在球體的兩極之外。請注意,球體實際上是投影到球體的立方體,以便於位置座標的管理。攝像頭看着一個球體 - 杆子包裹

如果對象在球體周圍水平移動,則攝像機按預期工作。但是,如果物體穿過球體的頂部或底部的極點,則攝像機會纏繞在極點上。如果它直線穿過杆子,它會在穿過杆子時轉動180度。

我明白爲什麼會發生這種情況 - 必須有一個全局的Up向量才能知道如何定位自己。如果我將其向上方向更改爲不同的方向,例如右側,相機將不再翻轉頂部或底部的杆,而是在球體的左右兩極展現相同的行爲。

我的問題是如何改變我的相機的行爲,這樣就不會發生。我想讓我的相機感覺到,相機處於一個恆定的位置,看着球體,球體在X軸和Z軸上旋轉。我知道這可能導致「錯誤的」方向 - 例如,如果用戶從球體的前表面開始,向上,然後離開,它們將最終在球體的左側,但是相機在其Z軸上旋轉90度,而如果它們從前面開始並直接移動到左側,則不會旋轉。這很好,因爲我可以檢測相機何時穿過臉部並緩慢「修復」相機的本地旋轉,或允許用戶解鎖相機,並且可以自己處理相機的角度。

僅供參考,我的相機是目前正在使用中這個問題的解決計算: Camera rotation aligned to arbitrary plane

任何有識之士將不勝感激!

+0

看看SketchUp的旋轉模型。當你穿過兩極時,它們會反轉向上的方向。 – 2013-03-26 14:01:53

+0

你如何做球體周圍的旋轉?矩陣或四元數? – Kobunite 2013-03-26 14:30:43

回答

1

如果您希望球體像軌跡球一樣工作,請將增量旋轉(例如,x軸和y軸)應用到用戶控件指定的旋轉矩陣。

更新後您仍然需要對旋轉矩陣進行「重新歸一化」 - 否則,數值誤差將蔓延,旋轉矩陣最終不會是旋轉矩陣。計算應該是這樣的:

update = RotX(userInput.dX) * RotY(userInput.dY) 
rawUpdatedRot = userRot * update 
newZ = Normalize(Cross(rawUpdatedRot.x, rawUpdatedRot.y)) 
newY = Normalize(Cross(newZ, rawUpdatedRot.x)) 
newX = Normalize(rawUpdatedRot.x) 
userRot = Matrix(newX, newY, newZ) 
+0

不幸的是,我不能這樣做,因爲相機,球體和球體上的物體必須位於世界空間中。我鏈接的線索解釋了我如何設置事物;我不明確的道歉。 – Stardreamer 2013-03-26 18:31:12

+0

是的,您可以:您只需要弄清楚應用旋轉的位置。實質上,您需要將您的相機放在球體的中心,並在那裏應用旋轉。 (請注意,相機轉換是從相應的父母層次結構的矩陣堆棧的「另一端」反向應用的) – comingstorm 2013-03-26 19:00:27