關於Normal Transform的一些小事

2022-05-05 22:06:13 字數 2810 閱讀 9924

今天真是乙個豔陽高照的日子,本來關於normal transform(下文以nt代替)這個東西是沒什麼好提的,技術很簡單,然而在今天翻看rtr(《real time rendering》)並且在網上看了幾個部落格中關於nt的描述後,我算是真心給這些博主跪了..算了本來也打算開部落格寫opengl, 先小小的寫那麼一筆,呀啦那一卡.

首先來看一張圖,對nt有乙個簡單的認識,如圖1-1:

圖1-1  nt示意圖(來自《rtr》—figure 4.5)

從圖1-1看,左一為變換前的,左二為polygon經過矩陣變換後,法線未校正的情況,而最後一張圖為校正後的情況,這就是nt的全部過程,簡單易懂。而要完成這一方案,其實並不困難,我會介紹一種萬金油的解法,並且證明它,然後再介紹一些應對不同情況下不是萬金油但是卻高效的辦法(我不生產水,我只是大自然的搬運工)。

m-1  =  adj(m)  /  |m|

那麼問題就來了,這個公式究竟有什麼用呢,在解釋它之前,我先證明一下其他文章中所提及的使用逆轉置來進行nt的方法。

定義兩條互相垂直的向量nm那麼就有dot(n, m)=0(dot為點乘),即ntm= 0。

對應其變換,n經過矩陣m變換,有n'=mn, 定義變換完成後的向量m'=gm,即有n』tm'= 0。

通過步驟2的推導可以得出(mn)t(gm) = 0, 可得ntmtgm= 0,根據步驟1中所給出的定義,可以得出mtg=i,證明如下:

假設x=mtg,得出dot(n,xm)= 0,那麼要滿足上述條件必須要有nxm垂直,則有xm=m,x = i

ok,通過以上三個步驟和證明,我們得出了mtg=i,那麼就可以得到nt矩陣g= (m-1)t, 這就是一般介紹的如何用變換矩陣的逆轉置來獲取nt矩陣的方法,但是,學過線性代數還沒有還給老濕的同學們應該知道,在3d變換中,普通的仿射變換存在很多變換矩陣是奇異的情況,在這些情況下,矩陣不可逆,既然不可逆,又上哪去求它的逆轉置,乃們說是不是,要死不要死。

然,伴隨矩陣常有而逆矩陣不常有,回到原來的萬金油問題,既然我們可以通過逆矩陣去求得nt矩陣,為什麼伴隨矩陣不可以,結合所給出的公式,我們可以得到如下式子 

g= (adj(m)  /  |m|)t = adj(m)t / |m| => |m|g =adj(m)t

定義g'= |m|g,那麼不論通過g'還是g進行的變換,只會改變normal的大小而不會改變方向,矯正同樣可靠,只不過在使用g』進行變換後,需要將變換後的法向量進行歸一化,僅此而已。這有效的解決了矩陣奇異而不存在逆矩陣的情況,算是一種萬金油式的解決方案,但是向量歸一化造成的效能開銷,和伴隨矩陣的計算開銷確實存在,所以,接下來我將介紹一些特殊情況下高效的解決方案。

首先,如果每次都去做乙個4x4矩陣的伴隨陣是非常昂貴的乙個開銷,而且這並不是必要的,往往在一次變換中平移因素不會對法線的角度產生變換,只會對其相對位置產生變化,變化也不影響任何東西呀,隨意啦,並且往往在大多數變換中矩陣的右下角w都是保持不變的,也就是說,在這種情況下,我們可以排除掉變換矩陣的第四列,同時,第四行也沒有意義(都是0),所以排除第四行和第四列,我們只要計算乙個3x3矩陣的伴隨陣就可以了,工作量瞬間降低到原來的9/16,簡直是乙個不可以腦補的數字啊,算了,don't mind。

接下去是一種更令人感到快樂的情況,就是我們根本不用去算伴隨陣,這種情況非常特殊,也就是當變換矩陣為正交矩陣的情況下,那麼其轉置等於其逆,那麼nt矩陣就是變換矩陣,沒有改變,不需要任何額外計算開銷,關於變換矩陣的正交,這個自己去搜吧,一搜一大把,也就是只包含旋轉,統一縮放,平移等正交矩陣組合的矩陣。這種情況雖然效能最優秀,但是太侷限了,媽蛋!

最後一種情況是,不需要重新歸一化的情況,做向量歸一化其實還是蠻耗時的,如果能不歸一化當然很好,但是也非常有侷限性,需要變換矩陣只由旋轉和平移組合而成,這樣不會對法線產生大小的變化,如果加入統一的縮放矩陣,那麼只要除以其縮放因子即可,不需要做歸一化繁瑣的步驟,但是這種情況下,第二種情況更加合適,所以,在特殊情況下,可以用快速的方法就用快速的方法,如果不行,就使用萬金油方法吧,到此結束。

btw:的排版真不好用. :)

關於程式關於世界

首先,在學了1年多的軟體設計的基礎上,問下自己 程式是什麼?業務需求是什麼?程式有什麼用?什麼是演算法?什麼是資料庫?或許每個人的理解不同,會給出不同的答案。那麼自己的理解 程式是乙個讓計算機工作的流程,在程式寫好之後,計算機就會按照,程式設計師定義好流程在執行。其實很多時候,乙個程式的好壞,在於乙...

關於血液關於軟體

1 自然沉降法 將血袋垂直吊掛於4 2 冰箱內,使紅細胞自然下沉1 3d,或將血袋呈70 80 角立於冰箱,需用時,用一次性分漿器分出血漿,制得濃縮紅細胞。2 洗滌法 一般用生理鹽水反覆洗滌3 6次。經洗滌的紅細胞,除白細胞和血小板減少外,血漿蛋白也極少,紅細胞中殘存的血漿蛋白含量約為原總蛋白的1 ...

關於冷漠,關於愛情

我不知道為什麼今天又莫名其妙開始思考愛情這件事,隨之就解決了我一直無法面對冷漠這件事 被冷漠是我始終無法消化的一件事,每當遇見冷漠時,我總會覺得就像一團火把自己燒得面目全非,但對方卻毫無傷害。但我突然懂了,遇到冷漠時,體面的離開即可 在乎你的人一定會在你離開後,找到你跟你解釋為什麼 連解釋都來不及,...