天天看點

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

第四章 Transforms 變換

​ 變換是一種操作,它接受點,向量或顔色等實體,并以某種方式對其進行轉換。 對于計算機圖形從業者來說,掌握轉換極為重要。 有了它們,您就可以定位,重塑形狀和設定對象,燈光和照相機的動畫。 您還可以確定所有計算都在同一坐标系中進行,并以不同方式将對象投影到平面上。 這些隻是可以通過轉換執行的操作中的少數操作,但是它們足以說明轉換角色在實時圖形或任何形式的計算機圖形中的重要性。

​ 線性變換是保留矢量加法和标量乘法的變換。

f(x) + f(y) = f(x + y), (4.1)

kf(x) = f(kx). (4.2)

​ 例如,f(x)= 5x是一個采用向量并将每個元素乘以5的變換。 為了證明這是線性的,需要滿足兩個條件(公式4.1和4.2)。 第一個條件成立,因為任何兩個向量乘以五然後相加将與将向量相加然後相乘相同。 标量乘法條件(方程式4.2)已明确滿足。 此功能稱為縮放變換,因為它可以更改對象的縮放比例(大小)。 旋轉變換是另一個線性變換,它使向量繞原點旋轉。 縮放和旋轉變換,實際上是三元素向量的所有線性變換,都可以使用3×3矩陣表示。

​ 但是,矩陣的大小通常不夠大。 三元素向量x的函數(例如f(x)= x +(7,3,2))不是線性的。 在兩個單獨的向量上執行此功能将把(7,3,2)的每個值相加兩次以形成結果。 将固定向量添加到另一個向量執行翻譯,例如,它将所有位置移動相同的數量。 這是一種有用的變換類型,我們想結合各種變換,例如,将對象縮放到一半大小,然後将其移動到其他位置。 到目前為止,将函數保持在簡單的形式上使很難輕松地組合它們。

可以使用仿射變換(affine transform)将線性變換和平移結合起來,通常以4×4矩陣形式存儲。 仿射變換是先執行線性變換然後執行平移的變換。 為了表示四元素向量,我們使用同構符号,以相同的方式表示點和方向(使用粗體小寫字母)。 方向向量表示為

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

點表示為

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

所有平移,旋轉,縮放,反射和剪切矩陣都是仿射的。 仿射矩陣的主要特征是它保留了線的平行性,但不一定保留長度和角度。 仿射變換也可以是各個仿射變換的串聯的任何序列。

本章将從最基本的基本仿射變換開始。 本部分可以看作是簡單轉換的“參考手冊”。 然後描述了更加專業的矩陣,随後對四元數(一種強大的轉換工具)進行了讨論和描述。 然後是頂點融合和變形,這是表達網格動畫的兩種簡單但有效的方法。 最後,描述了投影矩陣。 這些轉換中的大多數,它們的符号,功能和特性總結在表4.1中,其中正交矩陣是其逆矩陣為轉置矩陣。

變換是用于操縱幾何的基本工具。 大多數圖形應用程式程式設計接口允許使用者設定任意矩陣,有時庫可能與實作本章讨論的許多轉換的矩陣運算一起使用。 但是,仍然有必要了解函數調用背後的真實矩陣及其互相作用。 知道這樣的函數調用之後矩陣的功能是一個開始,但是了解矩陣本身的屬性将使您更進一步。 例如,這種了解使您可以辨識何時處理正交矩陣(正交是其轉置),進而可以更快地進行矩陣求逆。 這樣的知識可以導緻加速代碼。

4.1 Basic Transforms

​ 本節介紹最基本的變換,例如平移,旋轉,縮放,剪切,變換級聯,剛體變換,法線變換(不是很正常)和逆計算。

各種變換:

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

4.1.1 translation matrix T(t) 平移

從一個位置移動到另一個位置

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

點p =(px,py,pz,1)與T(t)相乘會産生一個新的點p’=(px + tx,py + ty,pz + tz,1),很顯然是平移。

平移矩陣的逆是T-1(t)= T(-t),即向量t取反。

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

4.1.2Rotation 旋轉

旋轉變換将矢量(位置或方向)繞經過原點的給定軸旋轉給定角度。 像平移矩陣一樣,它是一個剛體變換,即它保留了變換後的點之間的距離,并保留了慣用性(即,它不會導緻左右兩側互換)。 這兩種類型的轉換在計算機圖形學中用于定位和定向對象顯然非常有用。 方向矩陣是與錄影機視圖或對象相關聯的旋轉矩陣,它定義其在空間中的方向,即其向上和向前的方向。

在二維上,旋轉矩陣很容易得出。 假設我們有一個向量v =(vx,vy),我們将其參數化為v =(vx,vy)=(rcosθ,rsinθ)。 如果将那個矢量旋轉φ弧度(逆時針),則将得到u =(r cos(θ+φ),r sin(θ+φ))。 可以改寫成

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

所有可以得到分别按照X Y Z軸旋轉的公式

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

例子: 假設我們想繞着z軸旋轉一個φ弧度的對象,并且旋轉中心是某個點p。 什麼是轉換? 圖4.2中描述了這種情況。 由于繞點旋轉的特征在于該點本身不受旋轉的影響,是以變換首先通過平移對象使p與原點重合開始,這是通過T(-p)完成的。 此後跟随實際旋轉:Rz(φ)。 最後,必須使用T(p)将對象平移回其原始位置。 然後,得到的變換X由下式給出

X = T(p)Rz(φ)T(-p)。

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

4.1.3 Scaling 縮放

縮放矩陣S(s)= S(sx,sy,sz)分别沿x,y和z方向縮放因子為sx,sy和sz的實體。 這意味着可以使用縮放矩陣來放大或縮小對象。 si(i∈{x,y,z})越大,則按比例縮放的實體在該方向上越大。 将s的任何分量設定為1自然可以避免在該方向上縮放比例發生變化。 公式4.10顯示S:

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

4.1.4 Shearing 剪裁

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

4.1.5 Concatenation of Transform 轉換的級聯

由于矩陣的乘法運算具有不可交換性,是以矩陣出現的順序很重要。 是以,變換的級聯被認為是順序相關的。

作為一個順序相關性的示例,考慮兩個矩陣S和R。S(2,0.5,1)将x分量縮放2倍,将y分量縮放0.5倍。 Rz(π/ 6)繞z軸逆時針旋轉π/ 6弧度(在右手坐标系中從本書的頁面向外指向)。 這些矩陣可以用兩種方法相加,結果完全不同。 這兩種情況如圖4.4所示。

将一系列矩陣連接配接成單個矩陣的明顯原因是為了提高效率。 例如,假設您的遊戲場景具有數百萬個頂點,并且場景中的所有對象都必須縮放,旋轉并最終平移。 現在,不是将所有頂點與這三個矩陣中的每一個相乘,而是将這三個矩陣連接配接到一個矩陣中。 然後将此單個矩陣應用于頂點。 該複合矩陣為C = TRS。 注意這裡的順序。 比例矩陣S應該首先應用于頂點,是以在合成中顯示在右側。 該排序意味着TRSp =(T(R(Sp))),其中p是要轉換的點。 順便說一句,TRS是場景圖系統常用的順序。

值得注意的是,雖然矩陣級聯是依賴于順序的,但是矩陣可以根據需要進行分組。 例如,假設使用TRSp,您隻需計算一次剛體運動變換TR。 将這兩個矩陣(TR)(Sp)分組在一起并用中間結果替換是有效的。 是以,矩陣級聯是關聯的。

4.1.6 The Rigid-Body Transform 剛體變換

​ 當一個人抓住一個堅固的物體時,例如從桌子上用筆将其移動到另一個位置,也許移動到襯衫的口袋裡,隻有物體的方向和位置會發生變化,而物體的形狀通常不會受到影響。 這種僅由平移和旋轉的串聯組成的變換稱為剛體變換。 它具有保留長度,角度和慣用性的特性。

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

例子:

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

對準相機:圖形中的常見任務是調整相機的方向,使其對準特定位置。在這裡,我們将介紹gluLookAt()(來自OpenGL Utility Library,簡稱GLU)的作用。即使現在很少使用此函數調用,該任務仍然很常見。假設錄影機位于c處,我們希望錄影機看着目标l,并且錄影機的給定方向為u’,如圖4.5所示。我們要計算一個由三個向量{r,u,v}組成的基礎。我們首先以v =(c − l)/ ||| c − l ||計算視點矢量,即從目标到錄影機位置的歸一化矢量。然後可以将向右看的向量計算為r = −(v×u’)/ || v×u’||。通常不能保證u’向量正好指向上,是以最終的向上向量是另一個叉積u = v×r,由于v和r都通過構造進行了歸一化和垂直處理,是以可以保證歸一化。在我們将建構的相機變換矩陣M中,其思想是首先轉換所有内容,使相機位置位于原點(0,0,0),然後更改基數,以使r與(1 ,0,0),u(0、1、0)和v(0、0、1)。這是通過

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

4.1.7 Normal Transform 正态變換

單個矩陣可用于一緻地變換點,線,三角形和其他幾何形狀。 同一矩陣還可以沿這些線或在三角形的曲面上變換切向量。 但是,此矩陣不能始終用于變換一個重要的幾何特性,即表面法線(和頂點照明法線)。 圖4.6顯示了如果使用相同的矩陣會發生什麼。

适當的方法不是使用矩陣本身乘以,而是使用矩陣的伴随項的轉置[227]。 伴随的計算在我們的線上線性代數附錄中進行了描述。 伴随關系始終保證存在。 規範不保證變換後具有機關長度,是以通常需要将其标準化。

轉換法線的傳統答案是計算逆矩陣的轉置[1794]。 此方法通常有效。 但是,完全逆不是必需的,并且有時無法建立。 逆是伴随數除以原始矩陣的行列式。 如果該行列式為零,則矩陣是奇異的,并且不存在逆。

即使隻計算一個完整的4×4矩陣的伴随,也可能很昂貴,并且通常沒有必要。 由于法線是矢量,是以翻譯不會對其産生影響。 此外,大多數模組化轉換都是仿射的。 它們不更改傳入的齊次坐标的w分量,即不執行投影。 在這些(常見)情況下,正常變換所需的全部是計算左上3×3分量的伴随。

4.2特殊矩陣變換和運算

在圖形學程式設計裡,都是用四元數來表示一個頂點,下面兩節介紹了為什麼用四元數而不是三元數。

在本節中,将介紹和導出對實時圖形必不可少的幾種矩陣變換和運算。 首先,我們介紹歐拉變換(及其參數提取),這是描述方向的直覺方法。 然後,我們談到從單個矩陣中檢索一組基本變換。 最後,推導了一種繞任意軸旋轉實體的方法。

4.2.1 歐拉變換

這種轉換是構造矩陣以将自己(即錄影機)或任何其他實體定向到某個方向的一種直覺方法。 它的名字來自偉大的瑞士數學家萊昂哈德·歐拉(Leonhard Euler,1707–1783)。

首先,必須建立某種預設的視圖方向。 如圖4.7所示,它通常沿負z軸放置,頭部沿y軸放置。 歐拉變換是三個矩陣的乘積,即圖中所示的旋轉。 更正式地說,表示為E的變換由下式給出

E(h,p,r) = Rz®Rx§Ry(h).

本質思想是把物體的旋轉(在圖形學中的應用比如相機的旋轉)分解為繞三個互相垂直軸(x,y,z)的三個旋轉組成的序列。

矩陣的順序可以以24種不同的方式選擇[1636];這可以通過選擇矩陣的順序來實作。 我們介紹這個是因為它是常用的。 由于E是旋轉的級聯,是以它也顯然是正交的。 是以,它的逆可以表示為

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換
Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

盡管當然,更容易直接使用E的轉置。歐拉角h,p和r表示頭,俯仰和橫滾應以哪種順序以及繞其各自的軸旋轉多少。 有時,所有角度都稱為“側傾”,例如,我們的“頭”為“ y側”,而我們的“俯仰”為“ x側”。 同樣,“頭部”有時也稱為“偏航”,例如在飛行模拟中。

這種轉換很直覺,是以很容易用外行的語言進行讨論。 例如,改變頭角度會使觀看者搖頭“否”,改變音高會使他們點頭,而滾動則會使他們的頭向側面傾斜。 與其談論繞x軸,y軸和z軸的旋轉,不如談論改變頭,俯仰和橫滾。 請注意,此變換不僅可以定向攝影機,還可以定向任何對象或實體。 可以使用世界空間的全局軸或相對于局部參考系執行這些變換。

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

重要的是要注意,一些歐拉角的表示将z軸作為初始向上方向。 這種差異純粹是一種符号上的變化,盡管可能會造成混淆。 在計算機圖形學中,如何看待世界以及如何形成内容有一個區分:y向上或z向上。 大多數制造技術(包括3D列印)都認為z方向在世界範圍内是向上的。 航空和海上交通工具認為-z上升。 建築和GIS通常使用z-up,因為建築平面圖或地圖是二維的x和y。 與媒體相關的模組化系統通常将y方向視為世界坐标上的向上方向,以比對我們始終在計算機圖形學中描述相機的螢幕向上方向的方式。 這兩個世界矢量選擇之間的差異僅相差90°旋轉(并且可能是反射),但不知道假定哪個會導緻問題。 在本卷中,除非另有說明,否則我們使用y向上的世界方向。

我們還想指出,相機在其視野中的向上方向與世界的向上方向沒有特别關系。 轉動頭,視野就會傾斜,其世界空間向上方向與世界方向不同。 再舉一個例子,假設世界使用y-up,而我們的相機則直視下方的地形,鳥瞰。 此方向表示相機已向前傾斜90o,是以其在世界空間中的向上方向為(0,0,−1)。 在這種方向上,相機沒有y分量,而是認為-z在世界空間中向上,但根據定義,“ y在上方”在視圖空間中仍然适用。

歐拉角雖然适用于較小的角度變化或觀看者方向,但還有其他一些嚴重的限制。 很難同時使用兩組歐拉角。 例如,在一組和另一組之間進行插值并不是對每個角度進行插值的簡單問題。 實際上,兩組不同的歐拉角可以給出相同的方向,是以任何插值都不應旋轉對象。 這些是使用本章稍後讨論的替代方向表示形式(例如四元數)值得追求的一些原因。 使用歐拉角,您還可以獲得稱為萬向鎖,将在第4.2.2節中對其進行說明。

4.2.2 Extracting Parameters from the Euler Transform 從Euler變換中提取參數

當您使用Euler變換時,可能會發生萬向鎖,當發生萬向鎖的之後,再發生旋轉的時候,會失去了一個自由度。

例如,假設轉換順序為x / y / z。 考慮繞π/ 2旋轉,隻是y軸,這樣做會将本地z軸旋轉為與原始x軸對齊,是以圍繞z的旋轉消失了。

歐拉角在模組化中通常以x / y / z順序表示圍繞每個局部軸的旋轉,其他排序是可行的。 例如,z / x / y用于動畫,z / x / z用于動畫和實體。 對于某些應用最後一個z / x / z可能更好,僅當繞x旋轉π弧度時(半旋轉)。

但沒有一個完美的序列可以避免萬向鎖發生。盡管如此,歐拉還是經常被使用,因為動畫師更喜歡曲線編輯器來指定角度如何随時間變化。

關于萬向鎖,

可以參考這個視訊:

“歐拉角旋轉”産生“萬向鎖”的來源,以及如何避免萬向鎖

4.2.3矩陣分解

到目前為止,我們一直在假設我們知道所使用的變換矩陣的起源和曆史的情況下進行工作。 通常情況并非如此。

例如,僅将級聯矩陣與某個變換後的對象相關聯。 從級聯矩陣中檢索各種變換的任務稱為矩陣分解。

檢索一組轉換的原因很多。 用途包括:

•僅提取對象的比例因子。

•查找特定系統所需的轉換。 (例如,某些系統可能不允許使用任意4×4矩陣。)

•确定模型是否僅經曆了剛體變換。

•在動畫的關鍵幀之間進行插值,其中僅用于對象可用。

•從旋轉矩陣上移除剪子。

我們已經提出了兩種分解方法,即推導用于剛體變換的平移和旋轉矩陣(第4.1.6節)和從正交矩陣推導Euler角(第4.2.2節)。

如我們所見,轉換矩陣很簡單,因為我們隻需要4×4矩陣的最後一列中的元素。 我們還可以通過檢查矩陣的行列式是否為負來确定是否發生了反射。 要分離出旋轉,縮放和剪切需要花費更多的精力。

幸運的是,有幾篇關于該主題的文章以及線上提供的代碼。 托馬斯[1769]和戈德曼[552,553]各自針對不同類型的轉換提出了一些不同的方法。 Shoemake [1635]改進了他們的仿射矩陣技術,因為他的算法與參考系無關,并嘗試分解矩陣以獲得剛體變換。

4.2.4繞任意軸旋轉

有時,使用使實體繞任意軸旋轉某個角度的過程會很友善。 假設旋轉軸r已歸一化,并且應該建立一個圍繞r旋轉α弧度的變換。

為此,我們首先變換到一個空間,我們要圍繞其旋轉的軸是x軸。 這是通過一個稱為M的旋轉矩陣完成的。然後執行實際旋轉,然後使用M-1變換回[314]。 此過程如圖4.8所示。

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

我們create了一個旋轉矩陣,如下,此矩陣将向量r轉換為x軸,将s轉換為y軸,将t轉換為z軸。

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

是以,圍繞标準化向量r旋轉α弧度的最終變換成

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換
Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

4.3 Quaternions 四元數

因為三元數有萬向鎖的問題,是以引入了四元數表示一個頂點

Real-Time Rendering讀書筆記 第四章: Transforms 變換 (未完成)第四章 Transforms 變換

公式太多,知乎上有人翻譯過,直接貼一下連結:

https://zhuanlan.zhihu.com/p/97186723

有個視訊介紹

四元數的可視化

4.4 Vertex Blending 頂點混合

想象一下,數字角色的手臂使用前臂和上臂兩部分進行動畫處理,如圖4.11左側所示。 該模型可以使用剛體變換進行動畫處理(第4.1.6節)。 但是,這兩個部分之間的關節将不會像真正的肘部。 這是因為使用了兩個單獨的對象,是以,關節由來自這兩個單獨的對象的重疊部分組成。 顯然,最好隻使用一個對象。 但是,靜态模型零件無法解決使接頭具有柔性的問題。

頂點混合是解決此問題的一種流行方法[1037,1903]。該技術還有其他幾個名稱,例如線性混合蒙皮,包絡或骨架子空間變形。盡管此處介紹的算法的确切來源尚不清楚,但定義骨骼并讓皮膚對變化做出反應是計算機動畫中的一個古老概念[1100]。在最簡單的形式中,前臂和上臂像以前一樣分别進行動畫處理,但是在關節處,兩個部分通過有彈性的“皮膚”相連。是以,該彈性部件将具有一組由前臂矩陣轉換的頂點和另一組由上臂矩陣轉換的頂點。與每個三角形使用單個矩陣相比,這會導緻三角形的頂點可以通過不同的矩陣進行變換。見圖4.11。

通過進一步執行此步驟,可以使單個頂點可以由幾種不同的矩陣進行變換,并将得到的位置權重并混合在一起。 這是通過為動畫對象設定骨骼骨骼來完成的,其中每個骨骼的變換可能會通過使用者定義的權重影響每個頂點。 由于整個手臂可能是“彈性的”,即所有頂點可能受到一個以上矩陣的影響ß,是以整個網格通常稱為皮膚(在骨骼上)。 見圖4.12。 許多商業模組化系統具有相同的骨架骨骼模組化功能。 盡管名稱如此,骨骼并不一定必須是剛性的。 例如,Mohr和Gleicher [1230]提出了添加附加關節以實作諸如肌肉隆起等效果的想法。 James和Twigg [813]讨論了使用可以擠壓和拉伸的骨骼的動畫蒙皮。

4.5 Morphing : 變形

在執行動畫時,從一個三維模型變形到另一個三維模型可能會很有用。 假設一個模型在時間t0顯示,我們希望它在時間t1變成另一個模型。 對于介于t0和t1之間的所有時間,都使用某種插值獲得了連續的“混合”模型。 變形的一個例子如圖4.14所示。

變形涉及解決兩個主要問題,即頂點對應問題和插值問題。 給定兩個任意模型,它們可能具有不同的拓撲,不同數量的頂點以及不同的網格連接配接,通常必須從建立這些頂點對應關系開始。 這是一個困難的問題,并且在該領域已經進行了很多研究。 我們推薦感興趣的讀者閱讀Alexa的調查。

但是,如果兩個模型之間已經存在一對一的頂點對應關系,則可以在每個頂點的基礎上進行内插。 也就是說,對于第一個模型中的每個頂點,在第二個模型中必須僅存在一個頂點,反之亦然。 這使插值變得容易。 例如,線性插值可以直接在頂點上使用(有關插值的其他方法,請參見第17.1節)。 為了計算時間t∈[t0,t1]的變形頂點,我們首先計算s =(t-t0)/(t1- t0),然後線性頂點混合,

4.6 Geometry Cache Playback. 幾何緩存播放

​ 在剪輯場景中,可能希望使用極高品質的動畫,例如,對于無法使用上述任何方法表示的運動。簡單的方法是存儲所有幀的所有頂點,從磁盤讀取它們并更新網格。但是,對于短動畫中使用的30,000個頂點的簡單模型,這可能達到50 MB / s。 Gneiting [545]提出了幾種将記憶體成本降低到大約10%的方法。

首先,使用量化。例如,位置和紋理坐标使用每個坐标的16位整數存儲。在執行壓縮後無法恢複原始資料的意義上,這一步驟是有損的。為了進一步減少資料,進行了空間和時間預測,并對差異進行了編碼。對于空間壓縮,可以使用平行四邊形預測[800]。對于三角形帶,下一個頂點的預測位置就是在目前三角形邊緣周圍的三角形平面中反射的目前三角形,進而形成平行四邊形。與這個新位置的差異然後被編碼。有了良好的預測,大多數值将接近零,這對于許多常用的壓縮方案是理想的。與MPEG壓縮類似,在時間次元上也進行預測。即,每n幀執行一次空間壓縮。在這兩者之間,将在時間次元上進行預測,例如,如果某個特定頂點通過增量矢量從幀n-1移動到幀n,則很可能以與幀n + 1相似的量移動。這些技術減少了存儲量足以使該系統可用于實時流資料。

4.7 Projection: 投影

4.7.1 Orthographic Projection 正投影

正投影投影的一個特征是,平行線在投影之後保持平行。 當使用正射投影觀看場景時,無論與相機的距離如何,對象都保持相同的大小。 矩陣Po,如下所示,是一個簡單的正交投影矩陣,它使一個點的x和y分量保持不變,而将z分量設定為零,即正交投影到平面z = 0上:

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-exFvtyIU-1597571129046)(/Users/yangrong/Library/Application Support/typora-user-images/image-20200815154415990.png)]

4.7.2 Perspective Projection 透視投影

透視投影比正交投影更複雜的變換是透視投影,它通常在大多數計算機圖形應用程式中使用。 在此,平行線在投影後通常不平行;相反,在投影之後平行。 相反,它們可能會在極端情況下收斂到單個點。 透視更緊密地比對我們如何感覺世界,即,更遠的物體更小。

首先,我們将對投影到平面z = -d,d> 0上的透視投影矩陣進行有益的推導。我們從世界空間中推導,以簡化對世界視圖轉換的了解。 此推導之後是例如OpenGL中使用的更正常的矩陣

​ 假設錄影機(視點)位于原點,并且我們要将一個點p投影到平面z = -d,d> 0,進而産生一個新點q =(qx,qy,-d) 。 圖4.19描繪了這種情況。 從該圖所示的相似三角形中,得出q的x分量的以下推導:

​ [外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-8evn43sD-1597571129047)(/Users/yangrong/Library/Application Support/typora-user-images/image-20200816172357224.png)]