PBRT-E2.8-應用變換

PBRT-E2.8-應用變換

來自專欄 Way On PBRT1 人贊了文章

PBRT中可以被應用變換的對象有:點(Points)向量(Vectors)法向量(Normals)射線(Rays)包圍盒(Bounding boxes)

PBRT中使用的是列向量,如果你使用的是列向量記得轉置下面給出的矩陣。

點(Points)

在對點進行變換時我們用其次坐標將其表示為列向量 mathbf{p}= left[egin{matrix} x&y&z&1 end{matrix}
ight] ^T ,然後使用變換矩陣 mathbf{M} 左乘該列向量即可得到變換後點的其次坐標: mathbf{p}= mathbf{M} left[egin{matrix} x\ y\ z\ 1\ end{matrix}
ight] = left[egin{matrix} x\ y\ z\ w\ end{matrix}
ight] \

最後通過除以權重 w 得到變換後點的非齊次坐標: (x,y,z,w)Rightarrow(frac{x}{w},frac{y}{w},frac{z}{w})

向量(Vectors)

向量的變換和點的變換類似,唯一的區別在於向量其次坐標的權重 w0 而點的權重 w1

mathbf{v}= mathbf{M} left[egin{matrix} x\ y\ z\ 0\ end{matrix}
ight] = left[egin{matrix} x\ y\ z\ 0\ end{matrix}
ight] \

由於對向量進行平移變換是沒有意義的,因此變換矩陣 mathbf{M} 第四行的前三個元素都為 0 ,得到的其次坐標的權重 w 也為 0 。因此我們可以只計算矩陣 mathbf{M}的左上角的 3	imes3 的子陣與向量 left[egin{matrix} x&y&z\ end{matrix}
ight] ^T 的乘積,這樣只需要計算 9 次加法和乘法。

法向量(Normals)

對法向量的變換與點和向量不同,如果直接用變換矩陣去左乘,得到的結果如圖(b)所示,法向量不再與曲面垂直,而我們所期望的正確結果應該是像圖(c)那樣的。

(a)初始狀態;(b)直接左乘得到的結果;(c)正確的結果

我們知道曲面上任意一點處的法向量 mathbf{n} 與該處的任意一個切向量 mathbf{t} 是相互垂直的: mathbf{n}cdotmathbf{t}=mathbf{n}^Tcdotmathbf{t}=0

當我們對曲面上的點進行變換 mathbf{M} 後,該點處變換後的切向量 mathbf{t} 應該為 mathbf{Mt} 。變換後的法向量 mathbf{n} 可以表示 mathbf{Sn} ,這裡 mathbf{S} 為另一個變換矩陣。由於變換後的法向量mathbf{n}和切向量mathbf{t}仍然是相互垂直的,所以: egin{align} 0&=(mathbf{n})^Tmathbf{t}\ &=(mathbf{Sn})^Tmathbf{Mt}\ &=(mathbf{n})^Tmathbf{S}^Tmathbf{Mt} end{align}

由上面兩個式子可以知道: mathbf{S}^Tmathbf{M}=mathbf{I}

因此: mathbf{S}=(mathbf{M}^{-1})^T

這樣我們就得到了法向量的變換矩陣 mathbf{S}

射線(Rays)

由於射線是通過原點(Origin)方向(Direction)進行定義的,因此只需要按照對點和向量進行變換的方法分別對其進行變換即可。

包圍盒(Boundings boxes)

對AABB(Axis-aligned bounding box)進行變換的方法是先對其8個頂點進行變換,然後再計算出一個新的包裹了變換後8個頂點的包圍盒。

變換的組合

考慮對一個向量先後進行變換 mathbf{C}mathbf{B}mathbf{A} ,即 mathbf{T}(mathbf{v})=mathbf{A}(mathbf{B}(mathbf{C}(mathbf{v}))) ,則我們可以用一個矩陣 mathbf{T} 來表示這個組合變換: mathbf{T}=mathbf{ABC}

根據矩陣的性質,組合變換mathbf{T}的逆變換為: mathbf{T}^{-1}=mathbf{C}^{-1}mathbf{B}^{-1}mathbf{A}^{-1}

變換對坐標系統手性的影響

某些對標架的變換會改變坐標系統的手性,即坐標系統從左手系變成了右手系或從右手系變成了左手系,因此我們往往需要知道變換是否會改變手性。

而判斷變換是否改變手性的方法非常簡單:當變換矩陣左上角的 3	imes3 的子陣行列式的值為負時,變換會改變坐標系統的手性。 left|egin{matrix} m_{0,0}&m_{0,1}&m_{0,2}\ m_{1,0}&m_{1,1}&m_{1,2}\ m_{2,0}&m_{2,1}&m_{2,2}\ end{matrix}
ight| < 0


推薦閱讀:

從零開始手敲次世代遊戲引擎(五十六)
NPR中的透明物體bloom
深入剖析MSAA

TAG:計算機圖形學 |