營業(yè)執(zhí)照咋做網(wǎng)等網(wǎng)站建一個網(wǎng)站需要多少錢?
一個物體表面的法向量如何隨著物體的坐標(biāo)變換而改變,取決于變換的類型。使用逆轉(zhuǎn)置矩陣,可以安全地解決該問題,而無須陷入過度復(fù)雜的計算中。
法向量變化規(guī)律
- 平移變換不會改變法向量,因為平移不會改變物體的方向。?
- 旋轉(zhuǎn)變換會改變法向量,因為旋轉(zhuǎn)改變了物體的方向。
- 縮放變換對法向量的影響較為復(fù)雜。如上圖,最右側(cè)的圖顯示了立方體先旋轉(zhuǎn)了45度,再在y軸上拉伸至原來的2倍的情況。此時法向量改變了,因為表面的朝向改變了。但是,如果縮放比例在所有的軸上都一致的話,那么法向量就不會變化。
模型矩陣的逆轉(zhuǎn)值矩陣可以用來變換法向量。實際上,在某些特殊情況下,可以通過模型矩陣來確定物體變換后的法向量。比如說,當(dāng)物體在旋轉(zhuǎn)時,可以用旋轉(zhuǎn)矩陣直接乘以法向量,就能獲得旋轉(zhuǎn)后的法向量??傊?#xff0c;計算變換后的物體表面的法向量方向時,是求諸于模型矩陣自身,還是模型矩陣的逆轉(zhuǎn)值矩陣,取決于模型矩陣中已經(jīng)包含的變換類型(平移、旋轉(zhuǎn)或縮放)。
直接通過模型矩陣自身求變換后的法向量。如果模型矩陣中已經(jīng)包含了平移變換,法向量就會被當(dāng)作頂點坐標(biāo)平移,從而導(dǎo)致法向量與原有的表面朝向不一致。比如說,一個法向量是(1,0,0),沿Y軸平移2.0個單位后,就變成了(1,2,0)。事實上,如果你從4×4的模型矩陣的左上角抽出3×3的子矩陣,然后乘以法向量,就可以避免該問題。如下所示,4*4的模型矩陣:
由于3×3的子矩陣實際上包含了旋轉(zhuǎn)矩陣和縮放矩陣的信息,我們來逐一考慮。
- 如果只進(jìn)行旋轉(zhuǎn)操作:
你可以使用模型矩陣的3×3子矩陣對法向量進(jìn)行變換。如果在變換前法向量已經(jīng)歸一化了,那么變換后的法向量無須再歸一化處理。
- 如果只進(jìn)行縮放操作(且縮放因子相同):
你可以使用模型矩陣的3×3子矩陣對法向量進(jìn)行變換。但是,變換后的法向量需要再次歸一化處理。
在這種情況下,當(dāng)你只進(jìn)行縮放操作且縮放因子相同時,這意味著X軸、Y軸和Z軸的縮放因子是一致的。比如,你希望以一致的縮放因子2.0進(jìn)行縮放,那么就需要將法向量?3*3 子矩陣 變換后歸一化,這時,即使物體的尺寸發(fā)生了變化,但是其形狀并未改變。
- 如果進(jìn)行了縮放操作(但縮放因子不同):
必須使用模型矩陣的逆轉(zhuǎn)值矩陣對法向量進(jìn)行變換。變換后的法向量必須再次歸一化處理。原因如下:
如下圖使一個矩形物體(左圖)沿Y軸拉伸2.0倍,拉伸后的形狀如右圖所示。這里,為了獲得變換后的法向量,我們試圖使用模型矩陣乘以原先的法向量(1,1,0)。但是,得到的結(jié)果是(1,2,0),并不垂直于拉伸后的物體表面了。
推導(dǎo)
令模型矩陣為M,令初始的法向量為n,令變換矩陣為M',也就是用來正確變換法向量n的矩陣,令垂直于n的向量為s,令變換后的法向量為n',令垂直于n'的向量為s'
有等式一、二:
n' =? M' *? n
s' =? M * s
n和s,以及 n'和 s'的關(guān)系?,如下:
現(xiàn)在,我們就來計算M',使得n'和s'的相對角度保持垂直。我們知道兩個垂直矢量的點積是0,點乘操作使用點運算符“?· ”表示,所以有:
?n'·? s'=? 0
將等式一、二代入并重寫上式
從上圖中可以看出,M'就是通過轉(zhuǎn)置M的逆矩陣得到的,或者說,M'就是M的逆轉(zhuǎn)置矩陣。因為M已經(jīng)可能包含了上面列舉過的三種變換情況,所以計算M的逆轉(zhuǎn)置矩陣并乘以法向量,就可以獲得正確的結(jié)果,因此,這才是對法向量進(jìn)行變換的最佳方法
另,計算逆轉(zhuǎn)置矩陣可能會比較耗時,如果你非常確定物體的變換只包含上述(1)(2)的情形,也可以簡單地使用上述 模型矩陣的3×3子矩陣 來對處理法向量。