ELBE
電話:021-58780503 微信:18017854633 郵箱:sales_fullyear@126.com 地址:上海市浦東新區(qū)城南路168弄3號峰匯商務廣場B座911室本文重點討論萬向節(jié)死鎖是什么,為什么會產(chǎn)生,因此,將逐步從旋轉(zhuǎn)的定義出發(fā)。
旋轉(zhuǎn)的定義在一個給定的三維坐標系中,圍繞一個不動點的旋轉(zhuǎn)可以定義為任何點在旋轉(zhuǎn)前后,到不動點的距離都是不變的。公式是:
因為三點可以確定一個平面,所以x, f(x), p(即旋轉(zhuǎn)前的點、旋轉(zhuǎn)后的點、不動點)構成一個平面,稱為旋轉(zhuǎn)平面。根據(jù)旋轉(zhuǎn)定義,我們可以知道,x, f(x)這兩點到不動點的距離是相等的,所以x, f(x)事實上,以不動點為中心的圓上有兩點。如下圖所示,旋轉(zhuǎn)程度的概念可以用圓中的角度來定義,稱為旋轉(zhuǎn)角。
從上面可以發(fā)現(xiàn),三維旋轉(zhuǎn)可以用旋轉(zhuǎn)平面、不動點、旋轉(zhuǎn)方向和旋轉(zhuǎn)角來定義。如果旋轉(zhuǎn)前的點是原始點,旋轉(zhuǎn)可以定義為:在旋轉(zhuǎn)平面上,以不動點為中心,以不動點到原始點的距離為半徑做一個圓,以原始點為起點在圓上畫一個弧。弧的中點為旋轉(zhuǎn)點。
旋轉(zhuǎn)代數(shù)表示我們已經(jīng)知道,旋轉(zhuǎn)可以用旋轉(zhuǎn)平面、不動點、旋轉(zhuǎn)方向和旋轉(zhuǎn)角來定義,但如果計算機想要表示旋轉(zhuǎn),它需要更多的代數(shù)表示,最好是向量和矩陣的排列。讓我們一個接一個地看看:
旋轉(zhuǎn)平面只是一個普通的平面,任何平面都可以用平面上的一點和垂直于平面的法向量來定義。我們知道原始點和不動點必須在旋轉(zhuǎn)平面上,所以用一個向量來表示旋轉(zhuǎn)平面就足夠了。不動點只是由相應的坐標值組成的向量。旋轉(zhuǎn)方向,我們可以定義旋轉(zhuǎn)方向平面的法向量,以滿足右手螺旋法則的方向。右手螺旋法則意味著舉起右手,豎起拇指,讓拇指向法向量方向,最后把剩下的四個手指放進手掌,然后四個手指的方向是旋轉(zhuǎn)的方向。旋轉(zhuǎn)角只是一個實數(shù)來表示大小。綜上所述,如果一個旋轉(zhuǎn)需要代數(shù)來表示,則需要四件事:一個表示旋轉(zhuǎn)平面法線方向的向量,一個表示不動點的向量,一個表示旋轉(zhuǎn)角度的實數(shù)。
如果我們規(guī)定不動點是原點,并使用右手螺旋法來尋求旋轉(zhuǎn)方向,并稱旋轉(zhuǎn)平面法向量為旋轉(zhuǎn)軸,那么旋轉(zhuǎn)只有兩件事:旋轉(zhuǎn)軸、旋轉(zhuǎn)角-一個向量和一個實數(shù)。當我們說旋轉(zhuǎn)時,我們指的是這樣一個旋轉(zhuǎn)只由旋轉(zhuǎn)軸和旋轉(zhuǎn)角表示。
旋轉(zhuǎn)的運算上面最后指出,旋轉(zhuǎn)只能通過旋轉(zhuǎn)軸和旋轉(zhuǎn)角來表示,因此它確實很容易被計算機存儲,但我們的最終目標是快速計算旋轉(zhuǎn)點的坐標。因此,我們不僅需要存儲,還需要一套方便的操作方法。
注:一般來說,旋轉(zhuǎn)操作有兩種方法,矩陣操作和四元數(shù)操作。這里只提到矩陣操作的想法,因為四元數(shù),必須解釋數(shù)學,更麻煩,適當使用,四元數(shù)不會帶來通用鎖的問題。
通過疊加實現(xiàn)計算機中的計算旋轉(zhuǎn)。首先,很容易理解,如果你先做一個旋轉(zhuǎn),然后做另一個旋轉(zhuǎn),那么這兩個旋轉(zhuǎn)疊加的效果實際上相當于一個等效的旋轉(zhuǎn),即兩個旋轉(zhuǎn)疊加或一個旋轉(zhuǎn)。這是因為根據(jù)旋轉(zhuǎn)的定義,兩點到不動點的距離不會改變兩次旋轉(zhuǎn)。具體來說,如果原點是x,第一次旋轉(zhuǎn)變成了x一、二次旋轉(zhuǎn)后x2,那么x, x1, x2到不動點的距離是相等的,所以我們可以把x到x整個過程被視為單獨旋轉(zhuǎn)。
其次,我們應該能夠更容易地接受一個結(jié)論:任何旋轉(zhuǎn)軸的旋轉(zhuǎn)都可以由三個單獨繞組x,y,z軸的旋轉(zhuǎn)疊加。也就是說,如果C是任意旋轉(zhuǎn),總會有繞x軸的旋轉(zhuǎn)X,繞y軸旋轉(zhuǎn)Y,旋轉(zhuǎn)z軸Z,使得C(p)=Z(Y(X(p)))。這里不展開這個結(jié)論。通過應用這個結(jié)論,計算機可以用三個旋轉(zhuǎn)疊加來表示任意旋轉(zhuǎn)。而繞x, y, z軸旋轉(zhuǎn)后的點比較容易得到。
以z軸為旋轉(zhuǎn)角θ例如,如果旋轉(zhuǎn)前點的坐標是
,旋轉(zhuǎn)后的坐標是
,則有
,如果以矩陣和向量的形式寫,那就是
。關于x, y軸的旋轉(zhuǎn)也可以用矩陣操作來表示。
矩陣之間可以通過乘法計算得到一個新的矩陣,所以如果繞組z,y,x軸的旋轉(zhuǎn)矩陣分別為Z,Y,X,所以它們的乘積ZYX也是旋轉(zhuǎn)矩陣。
萬向節(jié)死鎖從上面可以看出,我們總是可以用三個分別來表示繞組x,y,z軸旋轉(zhuǎn)矩陣的乘積表示任何旋轉(zhuǎn)操作。這似乎沒有問題。事實上,在大多數(shù)情況下,沒有問題。
這里要稍微偏離一下話題,考慮一下自己的手臂。通過觀察手臂的結(jié)構,我們可以發(fā)現(xiàn)它大致是肩膀-肩關節(jié)-上臂-肘關節(jié)-小臂-腕關節(jié)-手。也就是說,我們用三個關節(jié)連接四個部分,這為我們的手臂提供了靈活性,因為我們的骨頭可以在關節(jié)處旋轉(zhuǎn)。如果沒有關節(jié),手臂會筆直,不能彎曲。讓我們做一個不切實際的假設。假設肩關節(jié)只能沿z軸旋轉(zhuǎn)(上下抬起上臂),肘關節(jié)只能繞y軸旋轉(zhuǎn)(將手臂縮回胸部),腕關節(jié)只能繞x軸旋轉(zhuǎn)(讓拳頭像撥浪鼓一樣旋轉(zhuǎn)),然后攤開手,考慮手掌和手指的方向。假如我們的關節(jié)能360度旋轉(zhuǎn),那就和上面提到的三個坐標軸一樣。在轉(zhuǎn)動肩關節(jié)時,顯然我們的手掌也會轉(zhuǎn)動,改變方向,這表明肘關節(jié)的轉(zhuǎn)動作用于手的轉(zhuǎn)動。顯然,肘關節(jié)和腕關節(jié)的旋轉(zhuǎn)也會影響到手,也就是說,三個關節(jié)的旋轉(zhuǎn)疊加在手上。另一方面,我們的手掌和手指可以朝任何方向,因為上面提到的任何旋轉(zhuǎn)都可以由三個坐標軸的旋轉(zhuǎn)疊加而成。好像沒問題。
但此時考慮一種情況,如圖所示(模型使用) ** gic poser web),抬起上臂,把小臂抬到胸前。然后嘗試腕關節(jié)和肩關節(jié)的旋轉(zhuǎn),我們會發(fā)現(xiàn)這兩個不同關節(jié)的旋轉(zhuǎn)會使手掌的方向相同——它們都沿著z軸旋轉(zhuǎn),即肩關節(jié)周圍的軸,而手指的方向是固定的。換句話說,我們應該分別沿著x軸,z軸這兩個方向的旋轉(zhuǎn)現(xiàn)在變成了同一個方向的旋轉(zhuǎn)。
為什么會這樣?注意三個關節(jié)不是獨立的:肩關節(jié)的旋轉(zhuǎn)會帶動肘關節(jié)和腕關節(jié)的運動,肘關節(jié)的旋轉(zhuǎn)也會帶動腕關節(jié)的運動。就像這三個關節(jié)都會在手臂末端工作一樣,上面的關節(jié)也會影響下面的關節(jié)。同時旋轉(zhuǎn)肩關節(jié)會驅(qū)動肘關節(jié)和腕關節(jié),因此對肘關節(jié)和腕關節(jié)旋轉(zhuǎn)的影響是相同的。但肘關節(jié)只能帶動腕關節(jié),不能帶動肩關節(jié)。在上述情況下,將手臂抬到胸部的行為會轉(zhuǎn)動肘關節(jié),從而影響腕關節(jié),但不影響肩關節(jié),導致腕關節(jié)旋轉(zhuǎn)的效果與肩關節(jié)旋轉(zhuǎn)相同。
回到原來的問題,在計算機中使用三個矩陣來表示任意旋轉(zhuǎn)也會有同樣的問題嗎?之所以會出現(xiàn)上述問題,是因為中間的關節(jié)會影響底部的關節(jié),而不會影響頂部的關節(jié)。看看矩陣表示的旋轉(zhuǎn)。我們用它ZYX這個矩陣乘積表示任意旋轉(zhuǎn),即p'=ZYXp,我們將Z,Y,X,ZYX這四個矩陣都寫出來看看:
若我們?nèi)?/p>
,則乘積變?yōu)?/p>
,注意到,無論我們?nèi)绾涡薷乃覀兌甲⒁獾剿取ⅵ眨疾粫淖儂’的值,z’始終等于-x。也就是說,當我們沿y軸旋轉(zhuǎn)90時°時,此時X,Z兩個旋轉(zhuǎn)矩陣都在旋轉(zhuǎn)z軸。這和以前手臂的情況是一樣的。因為矩陣的相乘作用也是有序的,我們先左乘X,再左乘Y,所以在乘Y的時候,其實已經(jīng)乘進去了。X。乘Z時,會對X和Y同樣的影響。所以這里的p相當于我們手掌和手指的方向,X相當于腕關節(jié),Y相當于肘關節(jié),Z相當于肩關節(jié)。Y會影響X,但不會影響XZ,使X成為與Z同軸旋轉(zhuǎn)的矩陣。
結(jié)語本文介紹了計算機中旋轉(zhuǎn)的定義和操作方法,然后重點介紹了隨后的萬向節(jié)鎖問題。順便說一句,我想提一下萬向節(jié)。原萬向節(jié)之所以會出現(xiàn)萬向節(jié)死鎖問題,也是因為三個環(huán)不完全獨立,中間環(huán)會驅(qū)動最內(nèi)環(huán),但不會影響最外環(huán)。萬向節(jié)死鎖問題是一個不可避免的問題,只要使用不相互獨立的三次旋轉(zhuǎn)來表示任意旋轉(zhuǎn),就會帶來這個問題。然而,萬向節(jié)鎖并不可怕。它只會出現(xiàn)在極端值的中間旋轉(zhuǎn)中。如果我們只是想表示旋轉(zhuǎn),萬向節(jié)鎖不會帶來任何問題。畢竟,我們總能找到三個沿坐標軸旋轉(zhuǎn)的旋轉(zhuǎn)來表示任意旋轉(zhuǎn)。萬向節(jié)死鎖只會導致飛機控制、旋轉(zhuǎn)插值等問題,需要連續(xù)旋轉(zhuǎn)疊加。因此,本文未提及的四元數(shù)在這方面的應用中被廣泛引用。
什么是萬向節(jié)死鎖,為什么會出現(xiàn)這個問題,真的困擾了我很久。僅此而已 ** 如有不正之處,請指出記錄。