作者:Eddie yang
【前言】
被要求寫一篇文章,但實在不知道要寫些什麼,記得有人問過我有關matrix的問題,我想不如就寫篇有關matrix的入門級介紹吧。
大概除了一些大神,沒人敢說自己搞懂了矩陣,實在是太龐雜太複雜了,加之它的計算方法,使用方法和通常的數學常識和習慣有很大的不同,導致基本上矩陣給人的感覺就是學的時候是一個層級,用的時候就是另一個層級了。
我們就來談一下矩陣在計算機圖形學中進行位移,旋轉,縮放操作上的應用,個人認為對於CG的特效製作而言應該是需要了解的知識。
另,本人還是一個CG特效領域的小學生,如有錯誤和疏漏還希望諸位指正。
【正文】
在3D計算機圖形學中,【4x4】矩陣是最常用的,用法是作為一個變換矩陣Transformation Matrix。在houdini中只有【2x2】【3x3】【4x4】這三種矩陣,而最常用的也就是【3x3】和【4x4】。旋轉,平移,縮放等方式變換圖形對象的最佳方法是將圖形對象的每個頂點乘以變換矩陣。兩個或多個轉換的組合可以表示為矩陣乘法。這裡要預先說明一下的是,在計算機圖形學中vector的存儲有兩種模式,以行的形式既形式,還有以列的形式儲存的既。這會導致變換矩陣的不同,在houdini一般使用前面一種,而opengl等使用後一種的。我在查看網上資料的時候發現很多教程中的變換矩陣都是對應列的形式儲存vector的變換矩陣。大概是因為都是在學習OpenGL吧。區別簡單來說就是houdini中是vector*matrix,而opengl中是matrix*vector,估計這也是houdini用戶在使用matrix的時候一個難點。先來講講【3x3】矩陣,在houdini中【3x3】矩陣基本只用來做Rotation,因為Rotate操作在三維稍微有點複雜,需要分解為繞X軸旋轉,繞Y軸旋轉,繞Z軸旋轉三個矩陣,你可以理解為這種矩陣只能完成單一任務rotateX,rotateY,rotateZ。所以當要完成一系列的複雜操作時就需要一步一步來,例如:Vector需要rotateX,rotateY,rotateZ操作就需要:NewVector = Vector*【RotateX】*【RotateY】*【RotateZ】這裡需要注意的是,網上的教程介紹說矩陣相乘時需要從右向左是針對列存儲形式說的,houdini中的行儲存順序就可以了。(實在是在網上找不到現成的圖片,自己推導了一個,湊合著看吧。)這裡需要注意由於矩陣乘法不具備交換律,所以更具軸旋轉是有順序的,一般還是以習慣的Rx,Ry,Rz順序來旋轉,但也給與了客戶選擇,在某些軟體互導的時候需要注意一下,不過一般也沒有哪個二五仔會動這部分,了解一下在出錯的時候排查一下就好。其實houdini中還有一種記錄旋轉信息的數據形式叫做四元數,3*3的旋轉矩陣和四元數可以輕鬆相互轉換,值得注意的是,在houdini中矩陣用的角度一般是歐拉角,四元數用的一般是弧度角。再來講講【4x4】矩陣,這是使用最多的矩陣形式,不管是位移,縮放,旋轉,還是類似切變等特殊變換都是使用這個矩陣來計算的,這裡首先給出常用的幾個變換矩陣:這些矩陣就構成了三維空間中的最基本的操作位移,旋轉,縮放。 這時候很多教程都會或多或少的提到下面的變換矩陣構造:這就是一個matrix4 矩陣存儲物體變換信息最常用的結構,所以變換矩陣很簡單,相對應的位置填入對應的信息就完成了構造。但是實際情況是遠比這複雜的,往往Rotation,scale甚至更複雜的shred數據是混雜在一起的,直接從數據上能提取大概就是translation數據了。而且有一個很大的謎團就是,物體的自旋是怎麼回事怎麼實現的這張圖表沒有展示出來,這就造成了我個人認為另外一個houdini用戶在使用matrix的時候一個難點——這個pivot到底是幹嘛用的沒展示出來啊?其實很簡單當我們將圖上的整個過程差解開來就會發現:NewVector =Vector *[-Pivot]*[Scale]*[RotateX]*[RotateY]*[RotateZ]*[Pivot]*[Trans]整個過程其實是通過多次矩陣乘法來實現的。這裡要注意:1. 整個變換過程遵守的是houdini默認的變換順序,既:2. [Pivot]和[-Pivot]其實都是一個translation矩陣。其意義就是將物體移回原點完成旋轉變換後再移回當前位置,看起來就像物體在繞著pivot點旋轉一樣。這樣就很容易理解矩陣到底在幹什麼,也能理解我們是怎麼樣最後從一個複雜的matrix矩陣中提取數據的了。在使用矩陣的時候要先考慮清楚操作的步驟,然後按照需要構建矩陣,最後和需要變換的物體相乘(houdini17-18好像可以不在意相乘順序了),完事兒~總結一下,我個人的理解是矩陣其實是在做空間投射。例如vector * matrix4 的意思就是將vector投射變成另外一個vector。在同一個絕對世界坐標系下這個過程就表現為位移,旋轉,縮放等,如在絕對世界坐標系不動的情況下就表現為空間轉換,例如世界空間到相機空間。只要理解他是如何運算的,怎麼構造就可以很好地利用它了,至於其他的交給那些大神去研究突破吧。下次有機會介紹一下matrix相關的函數,會更容易去理解矩陣作用。推薦一個免費的非常好的入門教程,英語的語速很慢還沒有什麼口音,也是很好的鍛鍊聽力的素材,很遺憾好像只有youtube有:MAKETRANSFORM - VEX Functions in Houdini(David Kahl VFX)https://www.youtube.com/watch?v=yK0ZDm433dwMAKETRANSFORM - VEX Functions in Houdini(David Kahl VFX)https://www.youtube.com/watch?v=yK0ZDm433dw圖形學中的基本變換-Basic Transforms(lxycg)https://zhuanlan.zhihu.com/p/96717729Understanding 3D matrix transformshttps://medium.com/swlh/understanding-3d-matrix-transforms-with-pixijs-c76da3f8bd8驚不驚喜,意不意外~我們又更新了
喜歡的話,就點」喜歡作者「讚賞我們吧~
大家有什麼疑問或者對這方面感興趣都可以加群一起交流。
(點擊「關於我們」>「微信群」獲取最新二維碼)
群裡會不定期分享一些教程~~
最後,記得點「在看」、「Wow」。
您的鼓勵,讓我們更有動力!
感謝您對作者的支持