2017-10-13 123 views
0

我正在用鼠標編程相機控件。我希望用戶能夠上下或左右觀看,但不能「傾斜」到一邊。換句話說,我想讓Yaw和Pitch改變,但將Roll限制爲0.用四元數來防止繞某個軸旋轉

如何防止四元數繞某個軸旋轉?當我只允許自己旋轉x軸或y軸時,一切正常,但是當我同時出於某種原因允許兩者旋轉時,Y軸旋轉會受到影響,並且相機會向一側傾斜。

+1

這是一個共同的問題,由於在相同的物體上增加了偏航和俯仰而使其滾動。我不記得如何解決它,但你需要有一個對象作爲父母,並讓該對象做例如音高,然後適用於偏向子對象或相反,我不太確定。如果將兩個不同物體的偏航和俯仰分開,它應該可以工作。 – CNuts

+0

看起來當你有兩個四元組並且組成它們時,你應該能夠得到所得的四分之一,將它的軸投影到滾軸上並使用它去除滾軸組件。但是,這是一個基於對涉及的線性代數的直覺感受的最佳答案。 – Omnifarious

回答

4

如CNuts所解釋的,連接多個偏航和俯仰旋轉可導致滾轉。但是,如果偏航和俯仰旋轉嚴格按乘法順序分開,則不會發生這種情況。例如。

Yaw1 * Yaw2 * Yaw3 * Pitch1 * Pitch2 

只有當另一個偏航旋轉添加到結尾時,纔會出現問題。但是你可以很容易地避免這種情況:如果你想添加一個偏航旋轉,把它乘以左邊。如果你想添加一個音調旋轉,把它乘以右邊。即如果當前的照相機旋轉R,則:

R = additionalYaw * R 

R = R * additionalPitch 

由於所有的偏航旋轉是繞同一軸線,這些變換實際上通勤。所以它們出現的順序並不重要(同樣適用於所有其他關於同一軸的旋轉)。當然,您也可以切換順序(即先調後偏航)。取決於你想要什麼樣的控制。

CNuts也描述了一種替代方法。如果您有變換層次結構,則可以爲相機變換設置兩個節點。然後,向其中的一個添加偏航旋轉並將旋轉調整到另一個。這將具有與上述相同的效果,有效地分離圍繞不同軸的旋轉。

+0

我希望我能想到四元數變換的非交換性質。優秀的答案。 – Omnifarious