還是關於矩陣的碎碎念,接上篇:
思考:矩陣及變換,以及矩陣在directx和opengl中的運用問題:左乘/右乘,行優先/列優先,...
5。矩陣的級聯順序與座標系的關係:
1). 變換的時候,座標系的選取是必需的
舉個例子:伸出左手,手掌水平,掌心向上,大拇指向左,其餘四指向前。此時選定物體的區域性座標系(cl(ol,xl,yl,zl))為:掌心為原點(ol),x軸(xl)指向四指指向,z(zl)軸指向大拇指指向,y軸(yl)指向掌心向上。全域性座標系(cg(og,xg,yg,zg))選定為和本地座標系重合。那麼,移動你的左手,區域性座標系就會隨手而動。全域性座標系還是原先的方位。為什麼選定座標系對於變換重要?因為相對於哪種座標系做變換得出的結果是不一定相同的。
還是上面那個例子:現在開始做變換,給你個指令:沿x軸旋轉手掌90度使得掌心向右,然後手掌沿y軸向+y方向移動10厘公尺。
你做完後,得出的結果可能有3種:
1. 手的位置比原先高了10厘公尺,這部分人居多。
2. 手的位置比原先靠右10厘公尺,這部分人居少。
3. 還有部分數人傻在那,變換不來,這部分人其實不傻。
其實這個變換指令沒有指定參考座標系,是變換不出來的。1類的是自己選了全域性座標系,2類是選了區域性座標系,3類的沒自己選。
所以,變換的時候,座標系的選取是必需的。
2). 級聯順序與座標系選取的關係
回到矩陣變換,一般我們說的對物體x進行m1變換,即x』= x*m1 (使用column matrix約定),隱含了選取全域性座標系的約定。單一變換的沒有級聯順序的問題。如果再進行乙個m2變換,此時,x』= x*m1*m2 還是x』= x*m2*m1呢?我們可能都知道是x』= x*m1*m2。顯然嘛,先做的變換先乘,但深層的原因是什麼呢?答案是隱含的全域性座標系的選定,如果選定的是區域性座標系,那麼x』= x*m2』*m1』。後面乙個變換反而要先進行。不信,看例子:
還是手掌例子,先旋轉後平移, 給你個指令:沿xg軸旋轉手掌90度使得掌心向右,然後手掌沿yg軸向+yg方向移動10厘公尺。
這下清楚不過了,完成後手掌比原先高了10厘公尺。此時變換公式:x』= x*r(xg)*t(yg)
手掌沿yl軸向+yl方向移動10厘公尺,然後沿xl軸旋轉手掌90度使得掌心向右。
看看完成後的結果,手是不是和上面的方位一樣?此時變換公式:x』= x*t(yl)*r(xl)
正序級聯是相對於全域性座標系,逆序級聯相對於區域性座標系,殊途同歸。下次有變換矩陣需要級聯的時候,先看看變換的矩陣是相對於全域性還是區域性的座標系。
一般規律:假定對物體x施加m1變換和m2變換,兩個變換矩陣均為相對於全域性座標系。有:
x』 = x*m1(g)*m2(g)
可以看作是將
x先經過
m1(g)
變換,再進行
m2(g)
變換,得到x』
由矩陣的結合律,上面等式等價於:
x』 = x*m2(g)*(m2(g)-1*m1(g)*m2(g))
(m2(g)-1
為m2(g)
的逆矩陣)
所以,這個過程也可以這麼看,先對x進行
m2(g)(
也即m2(l))
變換(m2(g)
為相對於全域性座標系,但此時全域性和區域性座標系的重合,所以
m2(g)=m2(l)
),再對x進行
m2(g)-1*m1(g)*m2(g)變換(
也即m1(l)變換)
,這個變換實際上相當於先將物體退回到原方位(此刻區域性座標系退回到原始方位,也就是全域性座標系方位)進行
m1(g)
變換後,再進行
m2(g)
變換回來。
m2(g)-1*m1(g)*m2(g)
整體的效果就是
相對於此時的區域性座標系的進行
m1(l)
變換。故:
x』 = x*m2(l)*m1(l)
即,如果將變換認為是相對於區域性座標系而進行的,那麼矩陣級聯順序正好相反。
(注:上面推導有個這樣的前提:即初始變換時,選定區域性座標系和全域性座標系重合。如果區域性座標系是一般選取,即區域性座標系相對於全域性座標系的變換m(l/g) != identity呢,答案是結論一樣。因為m(l/g)可以認作是對於物體的變換。將x換成x(new)=x*m(l/g)而已。)
3). 如何選取,如何級聯
碰到的場景:
l 人手的運動
手有很多關節,每個關節的一端可以繞著關節處運動,關節本身也可以運動,要表達手指尖相對於人體的運動,使用相對於區域性座標系(關節)的變換比選取全域性座標系(人體)的變換要簡單清晰得多。
比如:乙個從手臂下垂到做出向上抬手手的動作之間,現在用矩陣變換來表達手掌的變換(x->x』)。
如果你選定區域性座標系(各個關節)做變換,那麼其表達就是:
上手臂繞肩關節旋轉90度(m1(肩)),下手臂繞肘關節轉45度(m2(肘)),手掌繞踝關節轉30度(m3(踝)),那麼:
x』 = x*m3(踝)*m2(肘)*m1(肩)
(注意和x』 = x*m1(肩)*m2(肘)*m3(踝)的不同)
如果你選定全域性座標系(人體/肩關節)做變換,那麼其表達就是:
上手臂繞肩關節旋轉90度(m1(肩)),下手臂繞肩關節(m2(肩)), 手掌繞肩關節(m3(肩))。。繞不過來了吧(m2(肩), m3(肩)很難表示出來)
x』 = x*m1(肩)*m2(肩)*m3(肩)
l 矩陣分解與 級聯順序
|r 0|
|t 1|
= r*t (先進行旋轉變換,後進行平移變換, 基於global座標系)
= t*r (先進行平移變換,後進行旋轉變換, 基於local座標系)
= r*t' (先進行旋轉變換,後進行平移變換, 基於local座標系, t'= r-1*t*r)
= t*r' (先進行平移變換,後進行旋轉變換, 基於global座標系, r' = t-1*r*t)
4). 結論
注意矩陣級聯順序和座標系選取的關係。在整體/部分相對運動較多的地方,選取區域性座標系描述變換。
OpenGL中的座標系與矩陣
1.opengl圖形管線 顯示流程 模型變換 modeling transformation mc 模型座標 child parent wc 世界座標 標準c語言的矩陣為行主序,即m i j 表示第i行 第j列。opengl中的矩陣為 列主序,即m i j 表示第i列 第j行。以下所有矩陣都為列主序...
地理座標系與投影座標系的區別
平時開展gis開發 研究 應用工作,總會接觸到座標系,也會遇到座標轉換的問題,如地理座標系 投影座標系等。地理座標系是球面座標,參考平面是橢球面,座標單位是經緯度 投影座標系是平面座標系,參考平面是水平面,座標單位是公尺 千公尺等。地理座標系轉換到投影座標系的過程理解為投影,即將不規則的地球曲面轉換...
向量 座標系旋轉的矩陣表示
在cartesian座標系中,存在向量 textbf a textbf b textbf a quad b 現在將座標系按原點逆時針旋轉 theta 注意 不是將 textbf 逆時針旋轉 textbf 在新座標系內的表示如下 mathbf begin cos theta sin theta sin...