PBRT-E2.8-應用變換
來自專欄 Way On PBRT1 人贊了文章
PBRT中可以被應用變換的對象有:點(Points)、向量(Vectors)、法向量(Normals)、射線(Rays)和包圍盒(Bounding boxes)。
PBRT中使用的是列向量,如果你使用的是列向量記得轉置下面給出的矩陣。
點(Points)
在對點進行變換時我們用其次坐標將其表示為列向量 ,然後使用變換矩陣 左乘該列向量即可得到變換後點的其次坐標:
最後通過除以權重 得到變換後點的非齊次坐標:
向量(Vectors)
向量的變換和點的變換類似,唯一的區別在於向量其次坐標的權重 為 而點的權重 為 :
由於對向量進行平移變換是沒有意義的,因此變換矩陣 第四行的前三個元素都為 ,得到的其次坐標的權重 也為 。因此我們可以只計算矩陣 的左上角的 的子陣與向量 的乘積,這樣只需要計算 次加法和乘法。
法向量(Normals)
對法向量的變換與點和向量不同,如果直接用變換矩陣去左乘,得到的結果如圖(b)所示,法向量不再與曲面垂直,而我們所期望的正確結果應該是像圖(c)那樣的。
我們知道曲面上任意一點處的法向量 與該處的任意一個切向量 是相互垂直的:
當我們對曲面上的點進行變換 後,該點處變換後的切向量 應該為 。變換後的法向量 可以表示 ,這裡 為另一個變換矩陣。由於變換後的法向量和切向量仍然是相互垂直的,所以:
由上面兩個式子可以知道:
因此:
這樣我們就得到了法向量的變換矩陣 。
射線(Rays)
由於射線是通過原點(Origin)和方向(Direction)進行定義的,因此只需要按照對點和向量進行變換的方法分別對其進行變換即可。
包圍盒(Boundings boxes)
對AABB(Axis-aligned bounding box)進行變換的方法是先對其8個頂點進行變換,然後再計算出一個新的包裹了變換後8個頂點的包圍盒。
變換的組合
考慮對一個向量先後進行變換 、 和 ,即 ,則我們可以用一個矩陣 來表示這個組合變換:
根據矩陣的性質,組合變換的逆變換為:
變換對坐標系統手性的影響
某些對標架的變換會改變坐標系統的手性,即坐標系統從左手系變成了右手系或從右手系變成了左手系,因此我們往往需要知道變換是否會改變手性。
而判斷變換是否改變手性的方法非常簡單:當變換矩陣左上角的 的子陣行列式的值為負時,變換會改變坐標系統的手性。
推薦閱讀:
※從零開始手敲次世代遊戲引擎(五十六)
※NPR中的透明物體bloom
※深入剖析MSAA
TAG:計算機圖形學 |