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的平移部分對法線沒有影響。