关于旋转(Rotation)
關(guān)于旋轉(zhuǎn)(Rotation)
很多萌新在接觸計(jì)算機(jī)圖形學(xué)的時(shí)候,不明白為啥要用四元數(shù)來表示旋轉(zhuǎn)角度,那這篇文章主要從比較各大旋轉(zhuǎn)角度,在比較中突出四元數(shù)的優(yōu)點(diǎn)和實(shí)用。
在計(jì)算機(jī)圖形學(xué)中,一個(gè)物體的位置很容易確定,直接拿到position就可以準(zhǔn)確地定位物品的位置,但是其方向(orientation)是一個(gè)值得探討的話題。那么通過旋轉(zhuǎn)角度來可以定義兩兩orientation之間的改變?!俺颉笔菭顟B(tài),“旋轉(zhuǎn)”是操作。
關(guān)于旋轉(zhuǎn)這個(gè)話題,接下來分成三個(gè)步驟,由淺入深地來討論:
1,旋轉(zhuǎn)矩陣
假設(shè)當(dāng)前的朝向方向是 (x, y, z) 那么旋轉(zhuǎn)可以由旋轉(zhuǎn)矩陣得到:
沿著X軸旋轉(zhuǎn):
沿著y軸旋轉(zhuǎn):
沿著z軸旋轉(zhuǎn):
先沿著X軸轉(zhuǎn)動(dòng)然后在沿著Y軸轉(zhuǎn)動(dòng),很可能就會(huì)導(dǎo)致一個(gè)問題萬向節(jié)死鎖問題(Gimbal Lock)
補(bǔ)充: 出現(xiàn)Gimbal Lock的本質(zhì)原因在于:當(dāng)?shù)诙涡D(zhuǎn)角度為90度時(shí),第三個(gè)軸和第一個(gè)軸轉(zhuǎn)到了同個(gè)方向,因此缺少了一個(gè)自由度,導(dǎo)致了運(yùn)動(dòng)空間的限制。
取代上面方案的是沿著任意軸進(jìn)行旋轉(zhuǎn)特定的角度
但這種方法也是不能完全解決萬向節(jié)死鎖問題
2,歐拉角
針對(duì)上面的旋轉(zhuǎn)問題,旋轉(zhuǎn)數(shù)據(jù)量大,且存在問題,那使用歐拉角可以使用vec3來存儲(chǔ)一個(gè)歐拉角
Vec3 EulerAngles(RotationX, RotationY, RotationZ);
歐拉角可以分為三個(gè)部分,俯仰角:圍繞x軸的pitch,偏航角:圍繞y軸的yaw,滾轉(zhuǎn)角:圍繞z軸的roll,
使用歐拉角可以表示任何種類的旋轉(zhuǎn)角度。但是仍存在著一個(gè)歐拉角的問題:
對(duì)兩個(gè)朝向進(jìn)行插值比較難,簡(jiǎn)單對(duì)x,y,z簡(jiǎn)單插值得到結(jié)果不理想;
實(shí)施多次旋轉(zhuǎn)很復(fù)雜且不準(zhǔn)確,必須計(jì)算出最終的旋轉(zhuǎn)矩陣,然后據(jù)此推測(cè)歐拉角
不同角度可產(chǎn)生同樣的旋轉(zhuǎn);
針對(duì)有些操作會(huì)很復(fù)雜;如繞指定的軸旋轉(zhuǎn)N角度。
3,四元數(shù),表示旋轉(zhuǎn)的好工具。
四元數(shù)是由4個(gè)數(shù)[x, y, z, w]構(gòu)成,表示了如下的旋轉(zhuǎn)
x = RotationAxis.x * sin(RotationAngle / 2)
y = RotationAxis.y * sin(RotationAngle / 2)
z = RotationAxis.z * sin(RotationAngle / 2)
w = cos(RotationAngle / 2)
其中 RotationAxis 旋轉(zhuǎn)軸,RotationAngle 旋轉(zhuǎn)的角度。
這樣四元數(shù)中實(shí)際上存儲(chǔ)了一個(gè)旋轉(zhuǎn)軸和一個(gè)旋轉(zhuǎn)角度。其中xyz分別代表了各個(gè)軸上的旋轉(zhuǎn)分量。
其中[0, 0, 0, 1]表示單位四元數(shù) (unit quaternion),表示沒有旋轉(zhuǎn)。
3. (1)如何從兩個(gè)方向向量得到旋轉(zhuǎn)角度:
r = v1 X v2 是旋轉(zhuǎn)軸
O = acos(v1 * v2) 是旋轉(zhuǎn)角度
然后帶入上面的公式即可。
3.(2)如果先轉(zhuǎn)動(dòng)了q1,再轉(zhuǎn)動(dòng)了q2, 那么結(jié)果轉(zhuǎn)動(dòng)了q’= q2 * q1。
3.(3)
四元數(shù)(quaternion)的好處是:使用角度和坐標(biāo)軸的表示方法來防止了Gimbal lock的出現(xiàn);避免了旋轉(zhuǎn)矩陣的運(yùn)算量和數(shù)據(jù)量;可以很容易的插值操作
總結(jié)
以上是生活随笔為你收集整理的关于旋转(Rotation)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: strcpy实现
- 下一篇: 机器学习中的评价指标