本系列文章由birdlove1987編寫,轉載請注明出處。
文章連結:
前面有一篇文章讨論過多坐标系的問題。有的人可能會問我那麼多坐标系,它們之間怎麼關聯呢?嘿嘿~這次的内容可以為解決這個問題打基礎奧!
線性變換基礎(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)百度百科