OpenGL 02 尤拉角 萬向鎖 四元數

2022-09-14 14:33:12 字數 2110 閱讀 3197

在learnopengl**學習,記錄一下學習筆記

目錄

引用部落格尤拉角與旋轉矩陣的轉換關係

尤拉角就是我們日常生活中常用的表示旋轉的三維向量的乘積。

在unity中,用zxy的順序來表示旋轉,即選旋轉z軸、x軸、y軸的方式來表示旋轉。在給出逆時針旋轉的角度為正時(與右手系旋轉方向相同的為旋轉正方向),繞不同軸的旋轉的矩陣表示:

按照不同軸進行旋轉的時候,乘以相應的矩陣即可。

例如:依次按照x-y-z軸的順序進行分別旋轉特定的角度 \(\psi\)、\(\phi\)、\(\theta\) 。旋轉矩陣為:

在尤拉角的旋轉計算過程中,會發生兩個座標系重合,然後尤拉角描述的旋轉會喪失旋轉維度的現象

如圖所示:

引用部落格四元數——基本概念

引用部落格如何形象地理解四元數?

我們將二維空間表示為(x,y),當y=0時,其實可以看成是一維的,只不過它表示成(x,0)這種形式。推到四維,(w,x,y,z),當w=0時,(0,x,y,z)就是乙個三維子空間,這也是為什麼我們可以用單位四元數對三維向量進行操作,其實我們是將三維向量對映到四維的三維子空間(w=0,這種形式也成純四元數),然後對其進行旋轉,最終得到的向量結果依然是這個三維子空間中的,因而可以對映回三維空間。

四元數的表示式為:

\[q=w+xi+yj+zk

\]其中,$$i2=j2=k^2=ijk=-1$$

所以,四元數原本是用來描述在四維空間中的點的位置,可以用來描述四維空間中的旋轉,也可以用來描述子空間(三維空間)的旋轉。

所以可以用純四元數來描述三維空間中的點。表示式為:

\[qw = (0,wx,wy,wz)

\]如果你想算乙個點在這個旋轉下新的座標,需要進行如下操作,

1.定義純四元數

2.進行四元數運算

3.產生的\(qw^\)一定是純四元數,也就是說它的第一項為0,有如下形式:

4.\(qw^\)中的後三項就是:、

那麼,它對應乙個以向量\(v=(vx,vy,vz)\)為軸,旋轉角度\(\theta\)的旋轉操作(右手法則的旋轉)。

裡面用的是\(\frac\)而不是\(\theta\)。這是因為\(q\)做的就是乙個\(\frac\)的旋轉,而\(q^\)也做了乙個\(\frac\)的旋轉。我們進行了兩次旋轉,而不是一次,這兩次旋轉的結果是乙個旋轉角為\(\theta\)的旋轉。

示意圖:

引用文章四元數矩陣的乘法及其可易性

已知矩陣\(p\)的運算如下,

所以,如果有兩個四元數\(q_1=a+bi+cj+dk\)和\(q_2=e+fi+gj+hk\)

那麼它們的乘積為

同理,\(q_2\)與\(q_1\)的乘積為

OpenGL總結9 萬向鎖

在使用opengl進行模型旋轉的時候乙個比較經典的問題就是萬向鎖,這是在使用opengl的旋轉函式時會面臨的問題。glrotatef rot,x,y,z 這是opengl的旋轉函式,第乙個引數代表角度,其餘引數分別代表旋轉軸x,y,z。正常情況下,選擇繞乙個軸旋轉是沒有問題的,不管怎麼旋轉都是符合我...

關於尤拉角與萬向鎖的理解

要理解萬向鎖,如果從定義上去解釋,那理解起來會非常困難,我們不如從萬向鎖會導致什麼問題入手。萬向鎖其實是就是導致物體的旋轉不按我們的意願進行轉動,如乙個人體,從站立到平躺,只需乙個軸的動動可以完成,但由於萬向鎖,這個軸被鎖定了,所以需要另外兩個軸的運 動才可以輔助完成轉動,目的一樣能達到,但這個過程...

尤拉角表示方位與萬向鎖問題

用尤拉角表示方位將會比矩陣更加的直觀而且易於使用,尤拉角的基本思想是將角位移分解為繞三個互相垂直軸的三個旋轉組成的序列.那麼這個三個互相垂直的軸是如何定義的呢?其實任意三個軸和任意順序都是可以的,但是最常用的就是使用笛卡爾座標系並且按照一定順序組成的旋轉序列.最常用的約定,就是所謂的 heading...