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é)
- 第一章
- 第二章
- 第三章
- 第四章
- 第五章
- 第六章
- 第七章
- 第八章
- 第九章
- 第十章
- 第十一章
- 第十二章
- 第十三章
- 第十四章
- 第十五章
- 第十六章
- 第十七章
- 第十八章
- 第十九章
- 第二十章
- 第二十一章
- 第二十二章
- 第二十三章
- 附錄B-仿射函數(shù)基礎(chǔ)
仿射(并行)(Af?ne)
3.1 點和幀(Points and Frames)
將點和矢量看作是兩種不同的概念是有用的惩阶。點表示在幾何世界中的某種固定位置挎狸,而矢量表示世界中兩個點之間的運動。我們會使用兩種不同的標記區(qū)分點和矢量断楷。矢量會有一個箭頭在頂部伟叛,而點
會有波浪線在頂部。
如果我們認為矢量表達兩點之間的運動脐嫂,那么矢量操作(加法和標量乘法)就有明確的意義。如果我們把兩個矢量加起來紊遵,我們在表達兩個運動的串接(concatenation)账千。如果我們用一個標量乘以矢量,我們就在通過某個因子增加或減少運動暗膜。零矢量(zero vector)為一個特別矢量匀奏,其代表沒有運動。
這些操作對于點不會真正產(chǎn)生任何意義学搜。把兩個點加起來應(yīng)該表示什么含義娃善,比如說,哈佛廣場加上劍橋肯德爾廣場(這里是兩個地點名稱)是什么瑞佩?一個點被一個標量相乘又指得什么聚磺?什么是北極點的7倍?是否存在一個零點(zero point)和其它點的行為不一樣炬丸?
存在一種在兩個點之間確實有意義的操作:減法瘫寝。當我們從另一個點減去一個點,我們應(yīng)該會得到從第二個點到第一個點路徑之間的運動稠炬,
反過來說焕阿,如果我們從一個點開始,然后移動一個矢量(位移)首启,我們應(yīng)該會到達另一個點暮屡。
對一個點應(yīng)用線性變換同樣有意義。例如我們可以想象一個點圍繞某個固定原點的旋轉(zhuǎn)毅桃。而且平移點也是有意義的(但是這個概念對于矢量沒有任何意義)褒纲。要表達平移准夷,我們需要開發(fā)仿射變換(或并行變換 affine transformation)的概念。要完成這個任務(wù)外厂,我們借助矩陣冕象。這些矩陣不僅對于處理本章的仿射(并行)變換很方便,而且對于描述(隨后在第十章會看到的)相機投射變換也是很有幫助汁蝶。
3.1.1 幀(Frames)
在仿射空間(affine space)中渐扮,我們描述任何點首先從某個原點
開始,然后給其加上一個矢量的線性組合掖棉。這些矢量使用坐標
和一個矢量基(basis of vectors)來表示墓律。
此處被定義為
帕棉。
而下面這行表達
被稱為一個仿射幀(affine space)慰枕;它就像一個基(basis),但是由3個矢量和一個點組成即纲。
為了借助一個幀指定一個點具帮,我們使用擁有4個條目(entries)的4部件坐標矢量(coordinate 4-vector),其中最后一個條目總為1低斋。要借助一個幀表達一個矢量蜂厅,我們使用一個讓0作為第4坐標的坐標矢量(也就是說,它只是基矢量之和)膊畴。當我們建模針孔相機的行為時掘猿,要表達幾何形狀(還有矩陣),4部件坐標矢量的使用都會很便利唇跨。
3.2 仿射變換和
矩陣(Af?ne transformations and Four by Four Matrices)
相似于線性變換的情形术奖,我們想要通過在一個4部件坐標矢量和一個幀之間放置一個合適的矩陣的形式,來定義出仿射變換的概念轻绞。
讓我們將仿射矩陣定義為一個如下形式的矩陣
然后我們對一個點應(yīng)用仿射變換如下
或者簡寫為
我們可以驗證上面表達的第二行描述了一個有效的點既棺,因為乘法
給出了我們一個帶有1作為第4條目的4部件坐標矢量讽挟。另一方面,我們也能夠看到乘法
此處被定義為
佩番,給出了一個由3個矢量和一個原點組成的有效幀众旗。
同時也要注意到,如果矩陣的最后一行不是這種形式趟畏,變換就通常給出一個無效的結(jié)果贡歧。
類似于線性變換的情形,我們可以針對一個幀應(yīng)用仿射變換(affine transformation)為
或者簡寫為
3.3 對點應(yīng)用線性變換(Applying Linear Transformations to Points)
假如我們有一個表達線性變換的矩陣益眉。我們可以將其嵌入
矩陣的左上方角落,并且借助這個更大的矩陣對一個點(或者幀)應(yīng)用變換姥份。
這個變換在上擁有相同效果莹弊,就如之前其所參與的線性變換。如果我們把點
當作從原點
偏移矢量
涡尘,我們就明白這個變換和應(yīng)用線性變換到偏移矢量上具有相同效果忍弛。因而,以例子來說考抄,如果
矩陣為旋轉(zhuǎn)矩陣细疚,這個變換將圍繞原點旋轉(zhuǎn)這個點(參考圖示
)。正如下面我們將在第4章中看到的川梅,當對一個點應(yīng)用一個線性變換疯兼,幀的原點位置扮演了一個重要的角色然遏。
我們借助下列縮寫用于描述一個矩陣,其只是應(yīng)用了一個線性變換吧彪。
此處是一個
矩陣待侵,
是一個
矩陣,右上角的0代表
由0組成的矩陣姨裸,右下角的1是一個標量(scalar)秧倾。
Figure 3.1: 對一個點應(yīng)用線性變換±惭铮可以通過應(yīng)用線性變換到始于原點的偏移矢量上來完成中狂。
3.4 平移(Translations)
可以對點應(yīng)用平移變換是很有用的。這種變換不是線性的(參考課后練習(xí)6)扑毡。仿射變換的主要新威力就是在線性變換之上表達平移的能力胃榕。實際上,如果我們應(yīng)用變換
我們看到變換在坐標上的效果為
針對平移惯驼,我們使用簡寫
此處為 一個
矩陣蹲嚣,
為一個
同一矩陣(identity matrix),右上角的
為一個表達平移的
矩陣祟牲,左下角的0表示一個由0組成的
矩陣隙畜,右下角的1為一個變量。
注意如果在第4坐標中為0说贝,如此就表達了一個矢量而不是一個點议惰,從而不會被平移所影響。
3.5 匯總(Putting Them Together)
任何仿射矩陣(affine matrix)都可以被分解為線性部分和平移部分乡恕。
或者簡寫為
注意因為矩陣乘法不是可互換順序的言询,乘法中的順序很關(guān)鍵。一個仿射矩陣(affine matrix)也可以借助一個不同的平移矩陣
被分解為
(線性部分是不會發(fā)生變化的)傲宜,但是我們不會使用這種形式运杭。
如果,
的線性部分函卒,是一個旋轉(zhuǎn)县习,我們把這種形式記作
在這種情形中,我們稱矩陣為剛體矩陣(rigid body matrix),它所對應(yīng)的變化躁愿,剛體變換(rigid body transform)叛本,簡稱
。剛體變換保留了矢量之間的點積(dot product)彤钟,基的手(螺旋)性(handedness)来候,還有點之間的距離。
3.6 法線(Normals)
在計算機圖形學(xué)中逸雹,我們經(jīng)常借助表面法線確定一個表面點如何被著色营搅。所以當表面點經(jīng)歷由矩陣表示的仿射變換時,我們需要懂得表面法線是如何變換的梆砸。
你可能猜測我們只要用矩陣乘以法線的坐標就可以了转质。例如,如果我們旋轉(zhuǎn)幾何形狀帖世,法線會以完全相同的方式旋轉(zhuǎn)休蟹。但是事實上使用矩陣
不總是正確的。例如在圖示
中日矫,我們順著
軸擠壓一個球體赂弓。在這種情形中,實際的法線變換會順著
軸拉伸而不是擠壓哪轿。在這里我們要推導(dǎo)出可以應(yīng)用在所有情形中的正確變換盈魁。
Figure 3.2: 左側(cè):藍色的形狀擁有以黑色表示的法線。中間:現(xiàn)在在軸方向上被縮小同時(未標準化的)法線在軸方向被拉伸窃诉。右側(cè):法線被重新標準化從而給出被擠壓形狀的正確的單位法線杨耙。
讓我們定義位于點上平滑表面的法線為一個矢量,這個矢量正交于那個點表面的切線平面飘痛。切線平面是矢量平面珊膜,這個矢量平面通過臨近的(距離無限小地)表面點之間的減法來定義,所以敦冬,針對法線和兩個非常接近的點
和
,我們有如下表達唯沮。
在某種固定的正交標準化坐標系中脖旱,這可以被表達為
在這個公式中我們在前面的插槽中使用是因為它被0乘,從而和結(jié)果不相關(guān)介蛉。
假設(shè)存在一個由仿射矩陣表示的仿射變換萌庆,我們把這個變換應(yīng)用到所有的點上。什么矢量會和任意的切線矢量保持正交狀態(tài)币旧?讓我們重寫方程式(3.4)為
如果我們定義為被變換點的坐標践险,同時讓
,那么我們就得到如下表達
并且我們看到是被變換的幾何體法線的坐標(要依靠伸縮變換來獲得標準態(tài))。
注意因為我們不關(guān)注值巍虫,因而我們不需要關(guān)注
的第四列彭则。同時,因為A是一個仿射矩陣(affine matrix)占遥,所以
也是俯抖,進而剩下三列的第四行全部是0,從而可以安全地被忽略瓦胎。因而芬萍,參考簡寫方式
我們可以得到這種關(guān)系
此時調(diào)換整個表達式,我們就獲得最終表達式
此處是
矩陣的反轉(zhuǎn)加調(diào)換(等價于調(diào)換加反轉(zhuǎn))搔啊。注意如果
為一個旋轉(zhuǎn)矩陣柬祠,且這個矩陣是正交標準化的,那么它的反轉(zhuǎn)加調(diào)換事實上仍然是
负芋。在這種情形中法線的坐標表現(xiàn)的就像點的坐標一樣漫蛔。然而對于其它線性變換,法線的表現(xiàn)就不相同了示罗。(參考圖示
惩猫。)同時也要注意到A的平移部分對法線沒有影響。