二維平面上的變換
二維縮放
一個坐標左乘一個縮放矩陣,得到縮放變換后的坐標
切變
二維旋轉
默認為繞原點,逆時針旋轉
旋轉矩陣還是一個正交矩陣,正交矩陣滿足的性質是:矩陣的轉置=矩陣的逆
所以旋轉-θ角度,將旋轉矩陣轉置即可
縮放、切邊、旋轉均是線性變換,變換只包括數乘和加法
線性變換一定可以用上述形式表示
如何寫出變換的方程:
找到變換后的坐標和原始坐標的關系,並用矩陣乘積的形式來表達
二維平移
平移變換不能簡單地通過用線性變換(左乘一個2x2的矩陣)來表示
所以平移變換不是線性變換
二維齊次坐標系
齊次坐標系就是用來解決平移變換的特殊性,用統一的形式表達所有的變換
齊次坐標系的特點:
給二維的點和向量加上一個維度,用三個元素來表示
齊次坐標系可以保證以下事實
還有“向量平移后還是原來的向量”
給三維的向量(x,y,w),(w!=0)擴充定義,可以對其進行數乘,使得第三維為1,此時是一個標准形式的齊次坐標系表示
對任意一個w!=0的三維向量進行數乘不會改變它代表的點
這樣任意一個三維向量都可以用來表示一個點或者一個向量
而且任意一個二維點可以有無數種表示
而且利用這個擴充的定義很容易可以推出
point + point 的含義就是兩個點的中點
二維仿射變換
仿射變化用二維向量表示是如下形式
用齊次坐標系可以表示出一個仿射變換的矩陣
仿射變換的3x3矩陣中
左上角2x2的矩陣是二維向量中線性變換的矩陣,(1,3)是x方向上的位移量,(2,3)是y方向上的位移量,第三行在仿射變換中默認為(0,0,1),保證了點在仿射變換后還是點,向量還是向量
一個仿射變換的矩陣,表示的是先進行左上角2x2矩陣的線性變換,再進行平移變換,注意這個順序是確定的
逆變換
一個點或向量變換后,將這個變換矩陣求逆后左乘到當前的點或向量上,即可恢復原來的情況,也就是逆變換
變換的組合
一個變換的組合中變換的順序應該是確定的,變換了順序得到的變換結果是不一樣的
我們用矩陣的乘法來表示變換的組合
矩陣的乘法也是不滿足交換律的,和變換的組合一致
變換矩陣應該放在作用對象的左邊,即進行矩陣的左乘,而且從最靠近對象的變換矩陣開始運算
如上組合變換就是先旋轉,再平移
矩陣的乘法滿足結合律,可以把所有變換矩陣都乘起來,成為一個復雜的變換矩陣,而且這個復雜的變換矩陣始終和作用對象保持一致的大小。這說明無論變換多復雜,大小都不會發生變化
變換的分解
一個復雜的變換可以分解為一系列變換步驟,和變換的組合是相反的關系
一個非繞原點的旋轉就可以分解為 平移 + 繞原點旋轉 + 平移
三維空間中的變換
三維齊次坐標系
三維空間中的齊次坐標系和平面上的齊次坐標系概念一致,也是加多了一個維度
此時用四個元素來表示三維向量和點
同理任意(x,y,z,w)(w != 0)都可以通過數乘,使得w = 1,轉換為一個標准的三維點的表示方式,所以任意一個四維向量都可以用來表示一個三維的點或向量
任意一個三維點可以有無數種表示
三維仿射變換
左上角3x3表示的是線性變換
(1,4),(2,4),(3,4)表示的是三個坐標軸上的位移量
縮放
三維平移
三維旋轉
使用軸角表示旋轉
軸角也就是繞單軸旋轉
用(x,y,z,w)來表示
x,y,z用來表示軸的方向,是一個向量,w是標量,表示旋轉的角度
通過軸角可以完成所有的從一個方向變換到另一個方向的旋轉
和兩點之間直線最短一樣,兩個方向之間,繞單軸旋轉路徑最短
但這種旋轉方式適用情況不多
使用歐拉角表示旋轉
歐拉角是三個一組的角參量
由章動角θ、旋進角ψ和自轉角φ組成
分別對應繞三個坐標軸旋轉的角度
我們往往把單純繞y軸的旋轉叫做yaw
單純繞x軸旋轉叫做pitch
單純繞z軸旋轉叫做roll
我們采用的是右手笛卡爾坐標系
三維空間中繞原點的任意旋轉一定可以分解為三個繞軸旋轉的組合,由下方羅德里格斯旋轉公式證明
羅德斯格斯旋轉公式也提供了繞過原點的任意軸旋轉的計算方法
分別單獨繞x,y,z軸旋轉的矩陣如下
我們將三個矩陣組合起來,就得到了任意繞原點旋轉的公式
若三維空間中非繞原點旋轉,和二維空間一樣,可以分解為平移+旋轉+平移
歐拉角存在的問題
坐標系
實際中,物體旋轉應該按照物體自身的坐標系來旋轉,而不是絕對的坐標系,也就是說歐拉角應該用來標記物體自身坐標系下的旋轉量
但每一次旋轉都造成了物體自身坐標系與絕對坐標系的偏移,並不方便觀察,而且旋轉的組合是不能交換順序的,先發生的旋轉會在坐標系上對后發生的旋轉造成影響
萬向節死鎖
萬向節
用歐拉角旋轉,會造成萬向節死鎖的情況(具體原因不理解)
當出現死鎖,會喪失一維甚至兩維自由度,也就是只能在二維平面甚至是一維直線上旋轉了
使用四元數表示旋轉
四元數可以避免使用歐拉角出現的問題
四元數的定義
一個四元數q,形如(a,b,c,d)
q = a + bi + cj + dk
一個標量作為實部,虛部有三個部分
可以和四維空間上的點一一對應
a是在過原點且垂直於三維空間的一條實軸上的位移
i,j,k滿足
擴展一下加法的定義
四元數可以用標量加上向量的形式表示
四元數乘法公式
用四元數表示三維空間中的旋轉
q = a + v(向量),a=0時,q代表一個純四元數,也就是純三維空間上的一個向量
三維空間中的旋轉就是一個純四元數繞着另一個純四元數旋轉
v繞着u旋轉得到v'
旋轉的公式如下
觀測變換
我們對圖形進行變換的目的:將三維的物體轉換為二維的一張圖片
我們模擬得到一張照片的步驟
- 將觀測物體進行模型變換
- 將相機進行視圖變換
- 投影變換
簡稱為model-view-projection MVP變換
我們用觀測變換來描述第2和第3步,包括了視圖變換和投影變換
視圖變換
相機的幾個屬性
我們的相機需要滿足一個事實
當相機和觀測物體不發生相對運動時,拍出來的照片應該永遠是一樣的
我們可以假設,相機永遠放在原點
朝向-Z軸,up-direction是Y (約定俗成)
則將任意一個位置的相機,擺放到我們要求的位置,需要
先進行平移,平移矩陣如下
g作為一個不特定的方向,很難用矩陣表示g旋轉到-Z方向,但將-Z方向旋轉到任意方向的矩陣都好寫(t同理)
所以我們就寫出從標准位置旋轉到相機原位置的矩陣
可以觀察到
這個矩陣右乘X方向,得到了gxt
右乘Y方向,得到t
右乘Z方向,得到-g
和我們需要的變換恰好相反
再將矩陣求逆就是我們需要的旋轉矩陣
因為旋轉矩陣是正交矩陣,轉置即可得到逆矩陣
視圖變換由下式表達
先進行平移,再進行旋轉
不僅是相機做視圖變換,應該是相機和所有觀測物體組成的整體進行視圖變換,以保持相對位置一定,且相機位於標准位置
投影變換
投影變換分為正交投影和透視投影
透視投影下,兩條平行線會在遠處相交,可以產生近大遠小的效果,符合人眼的成像規律,正交投影下平行線不會相交,符合工程實際
將相機假設為一個點,通過這個點無限延伸出空間中的一個錐
我們規定這個錐上的一個far clip plane遠平面和一個near clip plane近平面,兩個平面中間的圖形叫做frustum
在照相時,我們希望frustum中的物體會被顯示到近平面上
frustum內部的物體通過視圖變換就會變小(注意相機的的透視投影成像是將實際物體變小)
在正交投影下,我們可以理解為相機無限遠,不存在變大或者變小,把深度信息忽略
正交投影
正交投影的一種理解
將相機放在標准位置
將z軸丟掉,所有三維物體將會被投影到xy平面上
我們將印有所有物體投影的xy平面縮放成以原點為中心的2x2的矩形,代表着相機成像
正交投影的通用理解
一個立方體有如下屬性
\(l,r\) 代表左右,是x軸上的坐標
\(b, t\)代表下上,是y軸上的坐標
\(f, n\)代表遠近,是z軸上的坐標
需要注意的是,\(z\)越小,離我們越遠,反之離我們越近
正交投影可以分為兩個步驟
- 將立方體中心平移到原點
- 將立方體縮放成2x2x2的正方體
則正交投影的矩陣如下
透視投影
在圖形學中更常見地是使用投影變換
投影變換中,我們對圖中的frustum先進行一個“擠壓”的變換
使得frustum變換為一個cuboid
再對cuboid進行正交投影,透視投影就完成了
對於一個frustum,我們將其壓縮成一個cuboid,可以列出以下兩個條件
除了特定點,我們並不知道z的變化情況(注意cuboid上,除了兩個平面上,其他點的z都會發生一定的變化)
用矩陣形式來表示這個線性變換
根據這兩個條件可以寫出變換的矩陣的一部分
此時要寫出第三行,我們還需要一些信息
注意到,在近平面,所有點都沒有發生變化,
而在遠平面,中心點沒有發生變化
通過上述兩個條件,就可以解出“壓縮”矩陣
而整個投影變換的矩陣就是正交矩陣左乘“壓縮”矩陣