PBRT-E2.7-變換(Transformations)
來自專欄 Way On PBRT1 人贊了文章
一般來說,一個變換(Transformation) 是指一個從點到點或者向量到向量間的映射:
一般來說變換可以分為以下三種:
- 線性(Linear):如果 是一個線性映射,那麼對於任意的標量 都有 且 。線性變換的這兩條性質能夠極大地簡化變換推導的過程。
- 連續(Continuous):簡單來說就是 將 和 的周圍區域相應的也映射到了 和 周圍的區域。
- 一對一(One-to-one)且可逆(Invertible):對每一個頂點 , 都只會將其映射到唯一的點 上,且存在一個從 到 的逆變換 。
藉由這些基本性質,一般我們可以使用一個 的矩陣來表示點和向量在同一個固定標架下的線性變換以及它們在標架之間的線性變換。
其次坐標(Homogeneous coordinates)
給定一個標架 ,該標架下 、 和 分量相同的點 和向量 之間存在明顯的二義性(Ambiguity)。在 E2.1-坐標系統 中我們知道點和向量分別被定義為:
將其分別寫成矩陣相乘的形式可以得到:
這樣由 、 、 以及 或者 組成的四維坐標被稱作是點和向量的其次(Homogeneous)表示,又稱其次坐標(Homogeneous coordinate)。其次坐標的第四個分量又被稱作權重(Weight),對於點它可以是任意的非零值:其次坐標 和 所描述都是同一個點 。將其次坐標轉換為普通坐標的方法就是將其次坐標的前三個分量除以它的權重(第四個分量):
點和向量在標架間的變換
給定一個矩陣 表示從一個標架到另一個標架的變換:
我們將變換 作用到 標準標架下的 軸 上:
同理可以得到
這樣我們通過矩陣 的每一列就能得到標準標架經過變換後得到標架的基向量和原點的坐標了。
通過下面的式子可以看到,直接將變換作用於點和向量等價於先將變換作用於其所處標架下的基向量和原點,然後再尋找其在變換後標架下的坐標,剛好這個坐標在變換的前後相等的。
PBRT中使用的是列向量,如果你使用行向量記得對轉置一下下面給出的變換矩陣。
平移變換(Translations)
- 定義:
- 性質:
- 變換矩陣:
縮放變換(Scaling)
- 定義:
- 性質:
- 變換矩陣:
繞坐標軸旋轉變換(Rotation)
定義: 、 和 表示繞 、 和 軸旋轉 角度。
性質:
變換矩陣:
繞任意軸旋轉變換(Rotation)
設旋轉軸的方向為 ,待旋轉向量為 ,旋轉轉的角度為
首先求解向量 在旋轉軸 上的分量 ,設向量 與旋轉軸 的夾角為 ,則有:
接下來計算向量 的末端繞軸 旋轉所得到圓盤所處的平面上的一組基向量 和 :
注意這裡的 為單位向量,因此基向量 和 的模長是相等的,都等於 ,根據前面的推導我們知道對點和向量的變換等價於對其所處標架的原點和進行變換再用同樣的係數進行線性表示:
因此我們可以得到 旋轉後的向量 ,這樣就能算出 旋轉後的向量 :
然後我們將標準標架的基向量 、 和 作為 分別帶入上面的式子進行計算得到旋轉後的向量,並依次作為旋轉矩陣的列,這樣就能夠得到繞任意軸旋轉的變換矩陣了。
以 為例:
同理可以計算得到另外兩個基向量變換後的坐標。
最終得到繞任意旋轉的旋轉矩陣為:
不過PBRT中給出的這個示意圖的旋轉方向好像和前面繞軸旋轉給出的示意圖的旋轉方向是相反的:
所以為了統一,上面的旋轉矩陣應該寫成之前算出來矩陣的逆矩陣(事實上PBRT的實現里用的就是下面的矩陣):
推薦閱讀:
※製作簡易碰撞體線框
※[gdc18]farcry5的地形渲染技術
※一篇光線追蹤的入門
※多邊形的布爾運算-或 與 異或 減法
※【GPU精粹與Shader編程】(三) 《GPU Gems 1》全書核心內容提煉總結 · 下篇
TAG:計算機圖形學 |