圖形學——變換


二維平面上的變換

二維縮放

image

一個坐標左乘一個縮放矩陣,得到縮放變換后的坐標

切變

image

二維旋轉

image

默認為繞原點,逆時針旋轉

旋轉矩陣還是一個正交矩陣,正交矩陣滿足的性質是:矩陣的轉置=矩陣的逆
所以旋轉-θ角度,將旋轉矩陣轉置即可

縮放、切邊、旋轉均是線性變換,變換只包括數乘和加法
image

線性變換一定可以用上述形式表示

如何寫出變換的方程:
找到變換后的坐標和原始坐標的關系,並用矩陣乘積的形式來表達

二維平移

平移變換不能簡單地通過用線性變換(左乘一個2x2的矩陣)來表示
image
image

所以平移變換不是線性變換

二維齊次坐標系

齊次坐標系就是用來解決平移變換的特殊性,用統一的形式表達所有的變換

齊次坐標系的特點:
給二維的點和向量加上一個維度,用三個元素來表示
image

齊次坐標系可以保證以下事實
image
還有“向量平移后還是原來的向量”

給三維的向量(x,y,w),(w!=0)擴充定義,可以對其進行數乘,使得第三維為1,此時是一個標准形式的齊次坐標系表示
對任意一個w!=0的三維向量進行數乘不會改變它代表的點
這樣任意一個三維向量都可以用來表示一個點或者一個向量
而且任意一個二維點可以有無數種表示
image

而且利用這個擴充的定義很容易可以推出
point + point 的含義就是兩個點的中點

二維仿射變換

仿射變化用二維向量表示是如下形式
image

用齊次坐標系可以表示出一個仿射變換的矩陣
image

仿射變換的3x3矩陣中
左上角2x2的矩陣是二維向量中線性變換的矩陣,(1,3)是x方向上的位移量,(2,3)是y方向上的位移量,第三行在仿射變換中默認為(0,0,1),保證了點在仿射變換后還是點,向量還是向量

一個仿射變換的矩陣,表示的是先進行左上角2x2矩陣的線性變換,再進行平移變換,注意這個順序是確定的

逆變換

image

一個點或向量變換后,將這個變換矩陣求逆后左乘到當前的點或向量上,即可恢復原來的情況,也就是逆變換

變換的組合

一個變換的組合中變換的順序應該是確定的,變換了順序得到的變換結果是不一樣的
我們用矩陣的乘法來表示變換的組合
矩陣的乘法也是不滿足交換律的,和變換的組合一致

變換矩陣應該放在作用對象的左邊,即進行矩陣的左乘,而且從最靠近對象的變換矩陣開始運算
image

如上組合變換就是先旋轉,再平移

矩陣的乘法滿足結合律,可以把所有變換矩陣都乘起來,成為一個復雜的變換矩陣,而且這個復雜的變換矩陣始終和作用對象保持一致的大小。這說明無論變換多復雜,大小都不會發生變化
image

變換的分解

一個復雜的變換可以分解為一系列變換步驟,和變換的組合是相反的關系
一個非繞原點的旋轉就可以分解為 平移 + 繞原點旋轉 + 平移
image

三維空間中的變換

三維齊次坐標系

三維空間中的齊次坐標系和平面上的齊次坐標系概念一致,也是加多了一個維度
此時用四個元素來表示三維向量和點
image

同理任意(x,y,z,w)(w != 0)都可以通過數乘,使得w = 1,轉換為一個標准的三維點的表示方式,所以任意一個四維向量都可以用來表示一個三維的點或向量
任意一個三維點可以有無數種表示
image

三維仿射變換

image

左上角3x3表示的是線性變換
(1,4),(2,4),(3,4)表示的是三個坐標軸上的位移量

縮放

image

三維平移

image

三維旋轉

使用軸角表示旋轉

軸角也就是繞單軸旋轉
用(x,y,z,w)來表示
x,y,z用來表示軸的方向,是一個向量,w是標量,表示旋轉的角度
通過軸角可以完成所有的從一個方向變換到另一個方向的旋轉
和兩點之間直線最短一樣,兩個方向之間,繞單軸旋轉路徑最短

但這種旋轉方式適用情況不多

使用歐拉角表示旋轉

歐拉角是三個一組的角參量
由章動角θ、旋進角ψ和自轉角φ組成
分別對應繞三個坐標軸旋轉的角度
我們往往把單純繞y軸的旋轉叫做yaw
單純繞x軸旋轉叫做pitch
單純繞z軸旋轉叫做roll
image

我們采用的是右手笛卡爾坐標系
image

三維空間中繞原點的任意旋轉一定可以分解為三個繞軸旋轉的組合,由下方羅德里格斯旋轉公式證明
羅德斯格斯旋轉公式也提供了繞過原點的任意軸旋轉的計算方法
image

分別單獨繞x,y,z軸旋轉的矩陣如下
image

我們將三個矩陣組合起來,就得到了任意繞原點旋轉的公式
image

若三維空間中非繞原點旋轉,和二維空間一樣,可以分解為平移+旋轉+平移

歐拉角存在的問題

坐標系

實際中,物體旋轉應該按照物體自身的坐標系來旋轉,而不是絕對的坐標系,也就是說歐拉角應該用來標記物體自身坐標系下的旋轉量

但每一次旋轉都造成了物體自身坐標系與絕對坐標系的偏移,並不方便觀察,而且旋轉的組合是不能交換順序的,先發生的旋轉會在坐標系上對后發生的旋轉造成影響

萬向節死鎖

萬向節
image

用歐拉角旋轉,會造成萬向節死鎖的情況(具體原因不理解)
image

當出現死鎖,會喪失一維甚至兩維自由度,也就是只能在二維平面甚至是一維直線上旋轉了

使用四元數表示旋轉

四元數可以避免使用歐拉角出現的問題

四元數的定義

一個四元數q,形如(a,b,c,d)
q = a + bi + cj + dk
一個標量作為實部,虛部有三個部分
可以和四維空間上的點一一對應
a是在過原點且垂直於三維空間的一條實軸上的位移
image

i,j,k滿足
image

擴展一下加法的定義
四元數可以用標量加上向量的形式表示
image

四元數乘法公式

image
image

用四元數表示三維空間中的旋轉

q = a + v(向量),a=0時,q代表一個純四元數,也就是純三維空間上的一個向量

三維空間中的旋轉就是一個純四元數繞着另一個純四元數旋轉
image

v繞着u旋轉得到v'
旋轉的公式如下
image

觀測變換

我們對圖形進行變換的目的:將三維的物體轉換為二維的一張圖片

我們模擬得到一張照片的步驟

  1. 將觀測物體進行模型變換
  2. 將相機進行視圖變換
  3. 投影變換
    簡稱為model-view-projection MVP變換
    我們用觀測變換來描述第2和第3步,包括了視圖變換和投影變換

視圖變換

相機的幾個屬性
image

我們的相機需要滿足一個事實
當相機和觀測物體不發生相對運動時,拍出來的照片應該永遠是一樣的
我們可以假設,相機永遠放在原點
朝向-Z軸,up-direction是Y (約定俗成)

則將任意一個位置的相機,擺放到我們要求的位置,需要
image

先進行平移,平移矩陣如下
image

g作為一個不特定的方向,很難用矩陣表示g旋轉到-Z方向,但將-Z方向旋轉到任意方向的矩陣都好寫(t同理)
所以我們就寫出從標准位置旋轉到相機原位置的矩陣
image

可以觀察到
這個矩陣右乘X方向,得到了gxt
右乘Y方向,得到t
右乘Z方向,得到-g
和我們需要的變換恰好相反

再將矩陣求逆就是我們需要的旋轉矩陣
因為旋轉矩陣是正交矩陣,轉置即可得到逆矩陣
image

視圖變換由下式表達
image
先進行平移,再進行旋轉

不僅是相機做視圖變換,應該是相機和所有觀測物體組成的整體進行視圖變換,以保持相對位置一定,且相機位於標准位置

投影變換

投影變換分為正交投影和透視投影

透視投影下,兩條平行線會在遠處相交,可以產生近大遠小的效果,符合人眼的成像規律,正交投影下平行線不會相交,符合工程實際

image

將相機假設為一個點,通過這個點無限延伸出空間中的一個錐
我們規定這個錐上的一個far clip plane遠平面和一個near clip plane近平面,兩個平面中間的圖形叫做frustum
在照相時,我們希望frustum中的物體會被顯示到近平面上
frustum內部的物體通過視圖變換就會變小(注意相機的的透視投影成像是將實際物體變小)
在正交投影下,我們可以理解為相機無限遠,不存在變大或者變小,把深度信息忽略

正交投影

正交投影的一種理解

image

將相機放在標准位置
將z軸丟掉,所有三維物體將會被投影到xy平面上
我們將印有所有物體投影的xy平面縮放成以原點為中心的2x2的矩形,代表着相機成像

正交投影的通用理解

一個立方體有如下屬性
image

\(l,r\) 代表左右,是x軸上的坐標
\(b, t\)代表下上,是y軸上的坐標
\(f, n\)代表遠近,是z軸上的坐標
image

需要注意的是,\(z\)越小,離我們越遠,反之離我們越近

正交投影可以分為兩個步驟

  1. 將立方體中心平移到原點
  2. 將立方體縮放成2x2x2的正方體
    image

則正交投影的矩陣如下
image

透視投影

在圖形學中更常見地是使用投影變換

image

投影變換中,我們對圖中的frustum先進行一個“擠壓”的變換
使得frustum變換為一個cuboid
再對cuboid進行正交投影,透視投影就完成了
image

對於一個frustum,我們將其壓縮成一個cuboid,可以列出以下兩個條件
image

除了特定點,我們並不知道z的變化情況(注意cuboid上,除了兩個平面上,其他點的z都會發生一定的變化)
用矩陣形式來表示這個線性變換
image
image

根據這兩個條件可以寫出變換的矩陣的一部分
image

此時要寫出第三行,我們還需要一些信息
注意到,在近平面,所有點都沒有發生變化,
image

而在遠平面,中心點沒有發生變化
image

通過上述兩個條件,就可以解出“壓縮”矩陣
image

而整個投影變換的矩陣就是正交矩陣左乘“壓縮”矩陣
image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM