本系列文章由birdlove1987編寫,轉載請註明出處。
文章鏈接:http://blog.csdn.net/zhurui_idea/article/details/25102425
前面有一篇文章討論過多座標系的問題。有的人可能會問我那麼多座標系,它們之間怎麼關聯呢?嘿嘿~這次的內容可以爲解決這個問題打基礎奧!
線性變換基礎(3D數學編程中,形式轉換經常是錯誤的根源,所以這部分大家要多多思考,仔細運算)
一般來說,方陣(就是行和列都相等的矩陣)能描述任意的線性變換,所以後面我們一般用方陣來變換
其實簡單的說,線性變換就是保留直線和平行線,原點沒有移動,而其他的幾何性質,如長度、角度、面積和體積可能被改變。
從視覺的直觀角度上講,線性變換可能“拉伸”座標系,但不會“彎曲”和“卷折”座標系(畢竟是“線性”的變換嘛,不然可能就叫做曲線變換了)。
下面先引入一個直觀的變換例子:
先在單位基向量處畫一個茶壺
然後我們給出一個變換矩陣
然後我們讓這個茶壺的座標按上面的矩陣經行變換
這個變換包含z軸順時針旋轉45°和不規則縮放。
在討論具體的變換之前,還必須要搞清楚,我們到底要變換什麼。在這裏我們所提到的變換,其內容主要就兩個:變換物體和變換座標系。
變換物體,意味着變換物體上所有的點,這這點將被移動到一個新的位置,我們仍使用同一座標系來描述變換前和變換後的位置。
變換座標,意味着物體上的點實際沒有移動,我們只是在另外一個座標系中描述它的位置而已。
其實這兩種變換實際上是等價的,將物體變換一個量等價於將座標系變換一個相反的量。
ps:下面我們實現的變換都是物體變換
旋轉
2D中繞原點旋轉的參數只有一個:角度θ,它描述了旋轉量。(逆時針旋轉經常被認爲是正方向,順時針方向時負方向)
根據幾何知識我們可知旋轉矩陣應該爲
在3D場景中,一般都是繞軸旋轉,並且在繞軸旋轉θ°時,必須知道哪個方向別認爲“正”,哪個方向被認爲“負”。
在左手座標系中定義此方向的規則爲左手規則
左手座標系 | ||
從哪裏看 | 正方向 | 負方向 |
從軸的負端點向正端點看 | 逆時針 | 順時針 |
從軸的正端點向負端點看 | 順時針 | 逆時針 |
繞軸變換中最爲常見的就是繞座標軸旋轉
X軸
可得到變換矩陣
同理得到Y軸和Z軸的變換公式
Y軸
Z軸
ps:對於任意軸的旋轉,可能等我們學完了平移,將任意軸平移旋轉至座標軸變換後在移後即可。
縮放
通過比例因子K按比例變大或縮小來縮放物體。
如果在各方向應用同比例的縮放,且沿原點“擴張”物體,那麼就是均勻縮放。(均勻縮放可以保持物體的角度和比例不變)
如果需要擠壓或拉伸物體,在不同方向應用不同的因子即可,這稱作非均勻縮放。(非均勻縮放時,物體角度將發生變化)
ps:如果 |k|<1 ,物體將變短,如果 |k|>1,物體變長。如果 |k|=0,就是正交投影。
最簡單的縮放方法是沿着每個座標軸應用單獨的縮放因子。
2D中有兩個縮放因子,和。縮放矩陣爲:
縮放實例
對於3D,需要增加第三個縮放因子,3D縮放矩陣:
正交投影(平行投影)(投影意味着降維操作)
有一種投影方法是在某個方向上用零作爲縮放因子。這種情況下,所有點都被拉平至垂直的軸或平面上,這種投影稱作正交投影。
最簡單的投影方式是向座標軸或平面投影。
在2D環境下,向 x 軸投影
在2D環境下,向 y 軸投影
在3D環境下,向 xy 平面投影、向xz平面投影和向yz平面投影的矩陣
正交投影效果圖
鏡像(反射)
鏡像是一種變換,起、其作用是將物體沿直線,或平面翻折。
ps:一個物體只能鏡像一次,如果再次鏡像物體將翻回正面,這和在原位置旋轉物體的效果一樣了。
在2D環境下,沿任意軸鏡像的矩陣爲
其中向量n爲任意軸方向的單位向量,例如如果任意軸爲x軸,則n=(1,0),所以關於x軸的鏡像矩陣爲
在3D環境下,沿任意軸鏡像的矩陣爲
切變
切變是一種座標系“扭曲”變換,非均勻地拉伸它。這是一種很少用到的變換,它也被稱作扭曲變換。
切變的時候角度會發生變化,但是令人驚奇的是面積和體積卻保持不變。
切變的基本實現思想是,某一座標的乘積加到另一個座標上去:x' = x + sy。
在2D環境下,x座標根據座標y以參數s控制切變方向和向量的切變矩陣
在2D環境下,y座標根據座標x以參數s控制切變方向和向量的切變矩陣
3D座標中的切變矩陣兩個座標軸別另一個座標軸改變的矩陣
-End-
參考文獻:(1)《3D Math Primer for Graphics and Game Development》
(2)百度百科