????????變換(Transformation)可分為模型(Model)變換和視圖(Viewing)變換。在3D虛擬場景中相機的移動和旋轉,角色人物動畫都需要變換,用來描述物體運動。將三維世界投影變換到2D屏幕上成像出來,也需要變換。
?1.縮放變換
????????縮放(Scale)變換:
? ? ? ? 如上圖所示,如果想把一個圖形縮小為原來的0.5倍,那么就需要x坐標變為0.5倍,y坐標也變為0.5倍,可以用以下表達式表示:
????????可以用矩陣的形式表示如下:
????????上面的矩陣表達式針對x軸和y軸進行相同比例的縮放,實際中兩個方向上的縮放可能不盡相同,這時只需要把矩陣表達式稍作修改即可:
????????Sx表示在x軸方向上縮放的倍數,Sy表示在y軸方向上縮放的倍數。
2.反射變換
? ? ? ? 反射(Reflection)變換也可稱為鏡像變換,如下圖所示:
????????如上圖需要將物體以y軸進行鏡像,那么可以用以下表達式表達:
????????用矩陣形式的表達如下:
????????當然還有其他方向的反射矩陣。
3.切變變換
????????如上圖這個變換好像是拽著圖形的右上角沿著x軸向右拉了一段距離,稱為切變(Shear)變換。
????????提示:
? ? ? ? 1.y=0時,水平位移為0
? ? ? ? 2.y=1時,水平位移為a(當y=0.5時,水平位移是0.5a,即y*a)
? ? ? ? 3.垂直位移總是0
????????通過以上三個提示的規律可得出任何x軸上的位移為a*y,表示移動距離等于原本x位置加上a*y,即x’=x+a*y,而y軸的值始終不變,即y’=y。用矩陣表達為如下:
4.旋轉變換
????????說旋轉(Rotation),默認指的是繞原點(0,0)逆時針旋轉,下圖是物體繞原點逆時針旋轉θ角的示意圖:
????????以上變換同樣可以寫成矩陣的形式:
推導如下
? ? ? ? 1.首先確認要達到的目標位置(x’,y’),假設原點(x,y)。
? ? ? ? 2.用矩陣形式表示:
????????如此需要求得a,b,c,d四個未知數。
? ? ? ? 3.所有旋轉的點都要符合最終公式,包括特殊點。先找出特殊點A(1,0),將A點旋轉度,通過三角定律可得A的坐標變成(
,
),假設當前就是以A點為原始點,進行了
度的旋轉。那么帶入后矩陣表示:
。通過矩陣相乘可得:cos
=a*1+b*0,sin
=c*1+d*0,所以a=cos
,c=sin
。
? ? ? ? 4.同理使用B(0,1)這個特殊點旋轉度,求得b=-sin
,d=cos
。
5.線性變換
????????前面提到的變換都可以使用以下表達式表示:
? ? ? ? 用矩陣都可以如下表示:
????????繼而表示為:輸出坐標 = 變換矩陣 × 輸入坐標 的形式:
????????滿足以上條件的變換稱為線性(Linear)變換。
5.齊次坐標
5.1仿射變換
? ? ? ? 如上圖所示,沿x軸平移tx,沿y軸平移ty,這樣是一個平移變換。可以用以下表達式表示:
? ? ? ?你會發現,它無法用前面熟悉的線性變換矩陣的形式表示,也就是說平移變換是非線性變換。 只能用以下矩陣形式表示,上面把這種變換稱為非線性變換,其實它有專門的名字叫仿射(Affine)變換。
? ? ? ? 為了方便統一,不希望平移變換是一個特例,那么是否有一個統一的方式來表示所有的變換?通過不斷探索,引入了齊次坐標(Homogeneous coordinates)。
5.2什么是齊次坐標
? ? ? ? 我們可以在現在二維上,再增加一個維度,變成三維,在坐標系上添加第三個坐標(W坐標),如果在卡爾坐標系上有點(x,y),當轉換為齊次坐標后這個點變為(wx,wy,w)。反過來同樣適用,如果在其次坐標系中有一個點(x,y,w),轉換到笛卡爾坐標系下,這個點應該表示為(x/w,y/w)。如此,對于任何一個點和任意一個向量,我們都可以表示如下:
? ? ? ?注意:這里為什么點是加1,而向量是加0呢?因為向量是個方向,平移后還是原來的向量,具有平移不變性質。如果有一個向量(x,y,0),同樣經過上圖矩陣這么一個變換,得到的結果仍然希望是(x,y,0),添加0是為了保護向量在平移變換過程中不發生變化。
將點(x,y)表示成(x,y,1),平移變換可寫成如下矩陣形式:
?????????所以像如下這種仿射變換表達式:
????????通過引入齊次坐標后,可以使用線性變換的形式表達(根據上圖所示,表示先線性變換再平移變換的)。
????????所以就有了統一所有變換的表達式。可以發現最后變換矩陣最后一行都是0,0,1。
6.二維主要變換總結
?????????引入了齊次坐標后,二維變換表達式分別變成了如下:
????????縮放矩陣
????????旋轉矩陣
? ? ? ? 以上為繞原點逆時針旋轉的矩陣,當順時針旋轉時,如下:
????????平移矩陣
7.逆變換
????????一個物體做一個變換,變換完以后要恢復到原來的位置,變換回原來的位置的過程稱為逆(Inverse)變換,逆變換在數學上的實現是乘以變換矩陣的逆矩陣。
8.組合變換
? ? ? ? 組合(Composite)變換就是對一個物體進行多個變換。如下圖所示,左邊圖片通過某些變換后變成右邊的圖片。
可以有兩種變換:
????????1.先向右平移1個單位,再旋轉45度(默認都是繞原點、逆時針旋轉)。
????????2.先旋轉45度,后向右平移1個單位。
????????發現第一種變換方式并沒有達到想要的效果,而第二種方式達到了目的。
得出兩個結論:
????????1.一個復雜的變換,可以通過幾個簡單的變換得到。
????????2.變換的順利不同最終的結果也會不同,因為矩陣相乘是不滿足交換律的,矩陣相乘順序不同結果就會不同(特殊除外)。
注意:矩陣的應用是從右到左的,將上述組合變換用矩陣表達如下(先旋轉,再平移):
組合變換矩陣相乘應用的順序
????????上圖中A1,A2一直到An表示變換矩陣,一個點進行組合變換時,應用在該點的矩陣是從右到左。即矩陣An乘An-1一直乘到A1,實際應用到點的順序是A1,A2一直到An。
矩陣乘法結合律使用
? ? ? ? 矩陣相乘無法使用交換律,但是可以使用結合律。
????????一個點做多個變換即多個矩陣相乘再乘以這個點,根據矩陣乘法結合律,可以先把這些矩陣相乘,乘完在與這個點相乘,只要保證矩陣相乘的順序不變即可。假設A1到An都為3*3的矩陣,那么相乘的結果還是3*3的一個矩陣,那么就可以把很多個矩陣合成一個矩陣,簡化了公式。
????????所以上述例子的表達式可以簡化為:
????????同理,矩陣不僅能合成,還能夠分解。前面最開始圖就是把變換分解成了旋轉變換和平移變換。
9.非原點的旋轉變換
? ? ? ? 在上述中,默認旋轉變換是繞原點進行的,那么不是繞原點的變換該怎么實現呢?可以先把變換分解,分為三個步驟變換:
? ? ? ? 1.將旋轉中心移動到原點(所有點移動)
? ? ? ? 2.在原點做旋轉變換
? ? ? ? 3.平移到原點的位置
? ? ? ? 綜上得出結論,先平移T(-c)到原點,然后旋轉R(α),最后平移到原來位置T(c)。矩陣變換作用在物體上的順序是從右到左,所以矩陣表達式表示: