CG中的仿射(affine transformation)和法線變換

Note

這是對MIT Foundation of 3D Computer Graphics第3章的翻譯冠王,本章講解了仿射變換的基本概念,變換矩陣的由來以及分解舌镶、通用法線變換的推導(dǎo)等內(nèi)容柱彻。本書內(nèi)容仍在不斷的學(xué)習(xí)中豪娜,因此本文內(nèi)容會不斷的改進。若有任何建議哟楷,請不吝賜教ninetymiles@icloud.com

注:文章中相關(guān)內(nèi)容歸原作者所有瘤载,翻譯內(nèi)容僅供學(xué)習(xí)參考。
另:Github項目CGLearning中擁有相關(guān)翻譯的完整資料卖擅、內(nèi)容整理鸣奔、課程項目實現(xiàn)。


已經(jīng)完成的章節(jié)


仿射(并行)(Af?ne)

3.1 點和幀(Points and Frames)

將點和矢量看作是兩種不同的概念是有用的惩阶。點表示在幾何世界中的某種固定位置挎狸,而矢量表示世界中兩個點之間的運動。我們會使用兩種不同的標記區(qū)分點和矢量断楷。矢量\vec{v}會有一個箭頭在頂部伟叛,而點\tilde{p}會有波浪線在頂部。

如果我們認為矢量表達兩點之間的運動脐嫂,那么矢量操作(加法和標量乘法)就有明確的意義。如果我們把兩個矢量加起來紊遵,我們在表達兩個運動的串接(concatenation)账千。如果我們用一個標量乘以矢量,我們就在通過某個因子增加或減少運動暗膜。零矢量(zero vector)為一個特別矢量匀奏,其代表沒有運動。

這些操作對于點不會真正產(chǎn)生任何意義学搜。把兩個點加起來應(yīng)該表示什么含義娃善,比如說,哈佛廣場加上劍橋肯德爾廣場(這里是兩個地點名稱)是什么瑞佩?一個點被一個標量相乘又指得什么聚磺?什么是北極點的7倍?是否存在一個零點(zero point)和其它點的行為不一樣炬丸?

存在一種在兩個點之間確實有意義的操作:減法瘫寝。當我們從另一個點減去一個點,我們應(yīng)該會得到從第二個點到第一個點路徑之間的運動稠炬,
\tilde{p} - \tilde{q} = \vec{v}

反過來說焕阿,如果我們從一個點開始,然后移動一個矢量(位移)首启,我們應(yīng)該會到達另一個點暮屡。
\tilde{q} + \vec{v} = \tilde{p}

對一個點應(yīng)用線性變換同樣有意義。例如我們可以想象一個點圍繞某個固定原點的旋轉(zhuǎn)毅桃。而且平移點也是有意義的(但是這個概念對于矢量沒有任何意義)褒纲。要表達平移准夷,我們需要開發(fā)仿射變換(或并行變換 affine transformation)的概念。要完成這個任務(wù)外厂,我們借助4 \times 4矩陣冕象。這些矩陣不僅對于處理本章的仿射(并行)變換很方便,而且對于描述(隨后在第十章會看到的)相機投射變換也是很有幫助汁蝶。

3.1.1 幀(Frames)

在仿射空間(affine space)中渐扮,我們描述任何點\tilde{p}首先從某個原點\tilde{o}開始,然后給其加上一個矢量的線性組合掖棉。這些矢量使用坐標c_i和一個矢量基(basis of vectors)來表示墓律。

\tilde{p} = \tilde{o} + \sum_i c_i\vec_i = \begin{bmatrix} \vec幔亥_1 & \vec耻讽_2 & \vec_3 & \tilde{o} \end{bmatrix} \begin{bmatrix} c_1 \\ c_2 \\ c_3 \\ 1 \end{bmatrix} = \vec{\mathbf{f}}^t\mathbf{c}
此處1\tilde{o}被定義為\tilde{o}帕棉。

而下面這行表達
\begin{bmatrix} \vec针肥_1 & \vec_2 & \vec香伴_3 & \tilde{o} \end{bmatrix} = \vec{\mathbf{f}}^t
被稱為一個仿射幀(affine space)慰枕;它就像一個基(basis),但是由3個矢量和一個點組成即纲。

為了借助一個幀指定一個點具帮,我們使用擁有4個條目(entries)的4部件坐標矢量(coordinate 4-vector),其中最后一個條目總為1低斋。要借助一個幀表達一個矢量蜂厅,我們使用一個讓0作為第4坐標的坐標矢量(也就是說,它只是基矢量之和)膊畴。當我們建模針孔相機的行為時掘猿,要表達幾何形狀(還有4 \times 4矩陣),4部件坐標矢量的使用都會很便利唇跨。

3.2 仿射變換和4\times4矩陣(Af?ne transformations and Four by Four Matrices)

相似于線性變換的情形术奖,我們想要通過在一個4部件坐標矢量和一個幀之間放置一個合適的矩陣的形式,來定義出仿射變換的概念轻绞。

讓我們將仿射矩陣定義為一個如下形式的4 \times 4矩陣
\begin{bmatrix} a & b & c & d \\ e & f & g & h \\ i & j & k & l \\ 0 & 0 & 0 & 1 \end{bmatrix}

然后我們對一個點\tilde{p} = \vec{\mathbf{f}}^t\mathbf{c}應(yīng)用仿射變換如下
\begin{array}{rl} & \begin{bmatrix} \vec采记_1 & \vec_2 & \vec政勃_3 & \tilde{o} \end{bmatrix} \begin{bmatrix} c_1 \\ c_2 \\ c_3 \\ 1 \end{bmatrix} \\ \Rightarrow & \begin{bmatrix} \vec唧龄_1 & \vec_2 & \vec奸远_3 & \tilde{o} \end{bmatrix} \begin{bmatrix} a & b & c & d \\ e & f & g & h \\ i & j & k & l \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} c_1 \\ c_2 \\ c_3 \\ 1 \end{bmatrix} \end{array}

或者簡寫為
\vec{\mathbf{f}}^t\mathbf{c} \Rightarrow \vec{\mathbf{f}}^tA\mathbf{c}

我們可以驗證上面表達的第二行描述了一個有效的點既棺,因為乘法
\begin{bmatrix} x' \\ y' \\ z' \\ 1 \end{bmatrix} = \begin{bmatrix} a & b & c & d \\ e & f & g & h \\ i & j & k & l \\ 0 & 0 & 0 & 1\end{bmatrix} \begin{bmatrix} c_1 \\ c_2 \\ c_3 \\ 1 \end{bmatrix}
給出了我們一個帶有1作為第4條目的4部件坐標矢量讽挟。另一方面,我們也能夠看到乘法
\begin{bmatrix} \vec丸冕_1' & \vec耽梅_2' & \vec_3' & \tilde{o} \end{bmatrix} = \begin{bmatrix} \vec胖烛_1 & \vec眼姐_2 & \vec_3 & \tilde{o} \end{bmatrix} \begin{bmatrix} a & b & c & d \\ e & f & g & h \\ i & j & k & l \\ 0 & 0 & 0 & 1 \end{bmatrix}
此處0\tilde{o}被定義為\vec{0}佩番,給出了一個由3個矢量和一個原點組成的有效幀众旗。

同時也要注意到,如果矩陣的最后一行不是[0,0,0,1]這種形式趟畏,變換就通常給出一個無效的結(jié)果贡歧。

類似于線性變換的情形,我們可以針對一個幀應(yīng)用仿射變換(affine transformation)為
\begin{bmatrix} \vec赋秀_1 & \vec利朵_2 & \vec_3 & \tilde{o} \end{bmatrix} \Rightarrow \begin{bmatrix} \vec猎莲_1 & \vec哗咆_2 & \vec_3 & \tilde{o} \end{bmatrix}\begin{bmatrix} a & b & c & d \\ e & f & g & h \\ i & j & k & l \\ 0 & 0 & 0 & 1 \end{bmatrix}

或者簡寫為
\vec{\mathbf{f}}^t \Rightarrow \vec{\mathbf{f}}^tA

3.3 對點應(yīng)用線性變換(Applying Linear Transformations to Points)

假如我們有一個表達線性變換的3\times3矩陣益眉。我們可以將其嵌入4\times4矩陣的左上方角落,并且借助這個更大的矩陣對一個點(或者幀)應(yīng)用變換姥份。
\begin{array}{rl} & \begin{bmatrix} \vec郭脂_1 & \vec_2 & \vec澈歉_3 & \tilde{o} \end{bmatrix} \begin{bmatrix} c_1 \\ c_2 \\ c_3 \\ 1 \end{bmatrix} \\ \Rightarrow & \begin{bmatrix} \vec展鸡_1 & \vec_2 & \vec埃难_3 & \tilde{o} \end{bmatrix} \begin{bmatrix} a & b & c & 0 \\ e & f & g & 0 \\ i & j & k & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} c_1 \\ c_2 \\ c_3 \\ 1 \end{bmatrix} \end{array}

這個變換在c_i上擁有相同效果莹弊,就如之前其所參與的線性變換。如果我們把點\tilde{p}當作從原點\tilde{o}偏移矢量\vec{v}涡尘,我們就明白這個變換和應(yīng)用線性變換到偏移矢量上具有相同效果忍弛。因而,以例子來說考抄,如果3\times3矩陣為旋轉(zhuǎn)矩陣细疚,這個變換將圍繞原點旋轉(zhuǎn)這個點(參考圖示\text{Figure 3.1})。正如下面我們將在第4章中看到的川梅,當對一個點應(yīng)用一個線性變換疯兼,幀的原點位置扮演了一個重要的角色然遏。

我們借助下列縮寫用于描述一個4\times4矩陣,其只是應(yīng)用了一個線性變換吧彪。
L= \begin{bmatrix}l & 0 \\ 0 & 1\end{bmatrix}
此處L是一個4\times4矩陣待侵,l是一個3\times3矩陣,右上角的0代表3\times1由0組成的矩陣姨裸,右下角的1是一個標量(scalar)秧倾。

Figure3.1.png

Figure 3.1: 對一個點應(yīng)用線性變換±惭铮可以通過應(yīng)用線性變換到始于原點的偏移矢量上來完成中狂。

3.4 平移(Translations)

可以對點應(yīng)用平移變換是很有用的。這種變換不是線性的(參考課后練習(xí)6)扑毡。仿射變換的主要新威力就是在線性變換之上表達平移的能力胃榕。實際上,如果我們應(yīng)用變換
\begin{array}{rl} & \begin{bmatrix} \vec瞄摊_1 & \vec勋又_2 & \vec_3 & \tilde{o} \end{bmatrix} \begin{bmatrix} c_1 \\ c_2 \\ c_3 \\ 1 \end{bmatrix} \\ \Rightarrow & \begin{bmatrix} \vec换帜_1 & \vec楔壤_2 & \vec_3 & \tilde{o} \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} c_1 \\ c_2 \\ c_3 \\ 1 \end{bmatrix} \end{array}

我們看到變換在坐標上的效果為
\begin{array}{rcl} c_1 & \Rightarrow & c_1 + t_x \\ c_2 & \Rightarrow & c_2 + t_y \\ c_3 & \Rightarrow & c_3 + t_z \end{array}

針對平移惯驼,我們使用簡寫
T= \begin{bmatrix} i & t \\ 0 & 1 \end{bmatrix}

此處T為 一個4\times4矩陣蹲嚣,i為一個3\times3同一矩陣(identity matrix),右上角的t為一個表達平移的3\times3矩陣祟牲,左下角的0表示一個由0組成的1\times3矩陣隙畜,右下角的1為一個變量。

注意如果\mathbf{c}在第4坐標中為0说贝,如此就表達了一個矢量而不是一個點议惰,從而不會被平移所影響。

3.5 匯總(Putting Them Together)

任何仿射矩陣(affine matrix)都可以被分解為線性部分和平移部分乡恕。
\begin{bmatrix} a & b & c & d \\ e & f & g & h \\ i & j & k & l \\ 0 & 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} a & b & c & 0 \\ e & f & g & 0 \\ i & j & k & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & d \\ 0 & 1 & 0 & h \\ 0 & 0 & 1 & l \\ 0 & 0 & 0 & 1 \end{bmatrix}

或者簡寫為
\begin{bmatrix} l & t \\ 0 & 1 \end{bmatrix} = \begin{bmatrix} i & t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} l & 0 \\ 0 & 1\end{bmatrix} \tag{3.1}
A = TL \qquad\quad \tag{3.2}

注意因為矩陣乘法不是可互換順序的言询,乘法TL中的順序很關(guān)鍵。一個仿射矩陣(affine matrix)也可以借助一個不同的平移矩陣T'被分解為A=LT'(線性部分是不會發(fā)生變化的)傲宜,但是我們不會使用這種形式运杭。

如果LA的線性部分函卒,是一個旋轉(zhuǎn)县习,我們把這種形式記作
A=TR \tag{3.3} \qquad\quad

在這種情形中,我們稱A矩陣為剛體矩陣(rigid body matrix),它所對應(yīng)的變化躁愿,剛體變換(rigid body transform)叛本,簡稱RBT。剛體變換保留了矢量之間的點積(dot product)彤钟,基的手(螺旋)性(handedness)来候,還有點之間的距離。

3.6 法線(Normals)

在計算機圖形學(xué)中逸雹,我們經(jīng)常借助表面法線確定一個表面點如何被著色营搅。所以當表面點經(jīng)歷由矩陣A表示的仿射變換時,我們需要懂得表面法線是如何變換的梆砸。

你可能猜測我們只要用矩陣A乘以法線的坐標就可以了转质。例如,如果我們旋轉(zhuǎn)幾何形狀帖世,法線會以完全相同的方式旋轉(zhuǎn)休蟹。但是事實上使用矩陣A不總是正確的。例如在圖示\text{Figure 3.2}中日矫,我們順著y軸擠壓一個球體赂弓。在這種情形中,實際的法線變換會順著y軸拉伸而不是擠壓哪轿。在這里我們要推導(dǎo)出可以應(yīng)用在所有情形中的正確變換盈魁。

Figure3.2.png

Figure 3.2: 左側(cè):藍色的形狀擁有以黑色表示的法線。中間:現(xiàn)在在軸方向上被縮小同時(未標準化的)法線在軸方向被拉伸窃诉。右側(cè):法線被重新標準化從而給出被擠壓形狀的正確的單位法線杨耙。

讓我們定義位于點上平滑表面的法線為一個矢量,這個矢量正交于那個點表面的切線平面飘痛。切線平面是矢量平面珊膜,這個矢量平面通過臨近的(距離無限小地)表面點之間的減法來定義,所以敦冬,針對法線\vec{n}和兩個非常接近的點\tilde{p}_1\tilde{p}_2,我們有如下表達唯沮。
\vec{n}.(\tilde{p}_1 - \tilde{p}_2) = 0

在某種固定的正交標準化坐標系中脖旱,這可以被表達為
\begin{bmatrix} nx & ny & nz & * \end{bmatrix} \left( \begin{bmatrix} x1 \\ y1 \\ z1 \\ 1 \end{bmatrix} - \begin{bmatrix} x0 \\ y0 \\ z0 \\ 1 \end{bmatrix} \right) = 0 \tag{3.4}
在這個公式中我們在前面的插槽中使用'*'是因為它被0乘,從而和結(jié)果不相關(guān)介蛉。

假設(shè)存在一個由仿射矩陣A表示的仿射變換萌庆,我們把這個變換應(yīng)用到所有的點上。什么矢量會和任意的切線矢量保持正交狀態(tài)币旧?讓我們重寫方程式(3.4)為
(\begin{bmatrix} nx & ny & nz & * \end{bmatrix}A^{-1})(A \left( \begin{bmatrix} x1 \\ y1 \\ z1 \\ 1 \end{bmatrix} - \begin{bmatrix} x0 \\ y0 \\ z0 \\ 1 \end{bmatrix} \right)) = 0

如果我們定義[x',y',z',1]^t=A[x,y,z,1]^t為被變換點的坐標践险,同時讓[nx',ny',nz',*]=[nx,ny,nz,*]A^{-1},那么我們就得到如下表達
(\begin{bmatrix} nx' & ny' & nz' & * \end{bmatrix})( \left( \begin{bmatrix} x1' \\ y1' \\ z1' \\ 1 \end{bmatrix} - \begin{bmatrix} x0' \\ y0' \\ z0' \\ 1 \end{bmatrix} \right)) = 0

并且我們看到[nx',ny',nz']^t是被變換的幾何體法線的坐標(要依靠伸縮變換來獲得標準態(tài))。

注意因為我們不關(guān)注'*'值巍虫,因而我們不需要關(guān)注A^{-1}的第四列彭则。同時,因為A是一個仿射矩陣(affine matrix)占遥,所以A^{-1}也是俯抖,進而剩下三列的第四行全部是0,從而可以安全地被忽略瓦胎。因而芬萍,參考簡寫方式
A= \begin{bmatrix} l & t \\ 0 & 1 \end{bmatrix}

我們可以得到這種關(guān)系
\begin{bmatrix} nx' & ny' & nz' \end{bmatrix} = \begin{bmatrix} nx & ny & nz \end{bmatrix}l^{-1}

此時調(diào)換整個表達式,我們就獲得最終表達式
\begin{bmatrix} nx' \\ ny' \\ nz' \end{bmatrix} = l^{-t}\begin{bmatrix} nx \\ ny \\ nz \end{bmatrix}
此處l^{-t}3\times3矩陣的反轉(zhuǎn)加調(diào)換(等價于調(diào)換加反轉(zhuǎn))搔啊。注意如果l為一個旋轉(zhuǎn)矩陣柬祠,且這個矩陣是正交標準化的,那么它的反轉(zhuǎn)加調(diào)換事實上仍然是l负芋。在這種情形中法線的坐標表現(xiàn)的就像點的坐標一樣漫蛔。然而對于其它線性變換,法線的表現(xiàn)就不相同了示罗。(參考圖示\text{Figure 3.2}惩猫。)同時也要注意到A的平移部分對法線沒有影響。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚜点,一起剝皮案震驚了整個濱河市轧房,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绍绘,老刑警劉巖奶镶,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異陪拘,居然都是意外死亡厂镇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門左刽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捺信,“玉大人,你說我怎么就攤上這事欠痴∑浚” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵喇辽,是天一觀的道長掌挚。 經(jīng)常有香客問我,道長菩咨,這世上最難降的妖魔是什么吠式? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任陡厘,我火速辦了婚禮,結(jié)果婚禮上特占,老公的妹妹穿的比我還像新娘糙置。我一直安慰自己,他們只是感情好摩钙,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布罢低。 她就那樣靜靜地躺著,像睡著了一般胖笛。 火紅的嫁衣襯著肌膚如雪网持。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天长踊,我揣著相機與錄音功舀,去河邊找鬼。 笑死身弊,一個胖子當著我的面吹牛辟汰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阱佛,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼帖汞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凑术?” 一聲冷哼從身側(cè)響起翩蘸,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎淮逊,沒想到半個月后催首,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡泄鹏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年郎任,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情串结,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響韩脏,放射性物質(zhì)發(fā)生泄漏缩麸。R本人自食惡果不足惜铸磅,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阅仔,春花似錦吹散、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至羞迷,卻和暖如春界轩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背衔瓮。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工浊猾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人热鞍。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓葫慎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親薇宠。 傳聞我的和親對象是個殘疾皇子偷办,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 仿射變換 AffineTransform,在iOS中他的實現(xiàn)類是CGAffineTransform和CATrans...
    UILabelkell閱讀 3,770評論 1 8
  • 如果不熟悉線性代數(shù)的概念澄港,要去學(xué)習(xí)自然科學(xué)椒涯,現(xiàn)在看來就和文盲差不多÷”逐工,然而“按照現(xiàn)行的國際標準,線性代數(shù)是通過公...
    Drafei閱讀 1,553評論 0 3
  • 多久沒看書了漂辐? 這是一個直擊心靈的拷問泪喊。雖然時不時總要寫點什么,恰是每一次的絞盡腦汁讓我越來越意識到知識的匱乏髓涯。沒...
    灰公主閱讀 344評論 4 3
  • 22天纬纪,寫作22000字蚓再,收獲2次排里最佳,一次連里最佳包各,找到了繼續(xù)寫作的內(nèi)驅(qū)力摘仅,像有一種無形的力量在引導(dǎo)我前進。...
    e8d83e9aa398閱讀 280評論 8 8
  • 難得的好天氣问畅,陽光明媚娃属,帶孩子們一起去倒盞村看文俗廟會六荒。 一輛車坐了四個孩子,大的對成語接龍矾端,小的看手機玩游戲掏击。不...
    彭曉芬閱讀 85評論 0 0