文章目錄
- 前言
- 正文
- 矩陣和向量相乘
- 二維變換
- 1、縮放
- 2、旋轉
- 3、平移
- 4、齊次坐標下總結
- 三維變換
- 1、縮放
- 2、平移
- 3、旋轉
- 繞X軸旋轉:
- 繞Z軸旋轉:
- 繞Y軸旋轉:
- 結尾:喜歡的小伙伴可以點點關注+贊哦
前言
前面章節補充了一下基本的線性代數中關于向量和矩陣的背景知識,這一節咱們講解一下在二維和三維中常用的空間變換,主要包括:平移、旋轉、縮放等!
正文
矩陣和向量相乘
假設有一個矩陣 M M M,有一個向量 P = ( x y ) P = \begin{pmatrix} x\\y \end{pmatrix} P=(xy?),則令 P ? ′ = M × P ? = ( x ′ y ′ ) \vec P' = M \times \vec P = \begin{pmatrix} x'\\y' \end{pmatrix} P′=M×P=(x′y′?).
從上節,我們已經知道矩陣和向量相乘結果還是個向量,假設我們把向量 P P P 看作一個坐標,那么 P ′ P' P′ 的坐標就是矩陣 M M M 應用之后的結果,此時我們稱對點 P P P應用矩陣 M M M的變換。
二維變換
假設在二維空間下,矩陣 M M M 是2x2的,向量 P = ( x y ) P = \begin{pmatrix} x\\y \end{pmatrix} P=(xy?) 是二維向量。
矩陣乘向量在二維空間本質理解: 假設我們將 M M M 按照列方向,分解成兩個列向量 ( α 1 ? , α 2 ? ) (\vec{\alpha_1}, \vec{\alpha_2}) (α1??,α2??),則 P ′ ? = ( x α 1 ? + y α 2 ? ) \vec{P'} = (x\vec{\alpha_1} + y\vec{\alpha_2}) P′=(xα1??+yα2??)
結果表明: 矩陣和向量相乘,就相當于向量的軸分量作為權重,給矩陣的列向量加權求和!
類似的,我們也可以把矩陣按照行向量分解,也可以表達成矩陣的行向量加權相加的形式。只不過列向量分解形式更為常見!
1、縮放
縮放矩陣M如下, S x S_x Sx? 為x軸向的縮放因子, S y S_y Sy? 為y軸向的縮放因子。
[ s x 0 0 s y ] \begin{bmatrix} s_x & 0\\ 0 & s_y\\ \end{bmatrix} [sx?0?0sy??]
則 P ′ = M P = [ s x 0 0 s y ] ? ( x y ) = ( s x ? x s y ? y ) P' = MP = \begin{bmatrix} s_x & 0\\ 0 & s_y\\ \end{bmatrix} * \begin{pmatrix} x\\y \end{pmatrix} = \begin{pmatrix} s_x * x\\s_y * y \end{pmatrix} P′=MP=[sx?0?0sy??]?(xy?)=(sx??xsy??y?)
舉個例子: M = [ 0.5 0 0 0.5 ] M = \begin{bmatrix} 0.5& 0\\ 0 & 0.5\\ \end{bmatrix} M=[0.50?00.5?] , P = ( 2 2 ) P = \begin{pmatrix} 2\\2 \end{pmatrix} P=(22?),則 P ′ = ( 1 1 ) P' = \begin{pmatrix} 1\\1 \end{pmatrix} P′=(11?),如下圖所示:
2、旋轉
默認地,正角度旋轉代表逆時針,如下圖所示的紅色正方形,就是旋轉45°
旋轉矩陣 R θ R_\theta Rθ? 如下:
[ cos ? θ ? sin ? θ sin ? θ cos ? θ ] \begin{bmatrix} \cos \theta & -\sin \theta\\ \sin \theta & \cos \theta\\ \end{bmatrix} [cosθsinθ??sinθcosθ?]
基本推導如下圖:
我們使用最笨的待定系數法求解,將矩陣 R θ R_{\theta} Rθ? 設為 [ A B C D ] \begin{bmatrix} A & B\\ C & D\\ \end{bmatrix} [AC?BD?],然后將兩個點的前后結果帶入計算,如下:
[ A B C D ] ( 1 0 ) = ( cos ? θ sin ? θ ) , [ A B C D ] ( 0 1 ) = > ( ? sin ? θ cos ? θ ) \begin{bmatrix} A & B\\ C & D\\ \end{bmatrix}\begin{pmatrix} 1\\0 \end{pmatrix} = \begin{pmatrix} \cos{\theta}\\\sin{\theta} \end{pmatrix}, \begin{bmatrix} A & B\\ C & D\\ \end{bmatrix}\begin{pmatrix} 0\\1 \end{pmatrix} => \begin{pmatrix} -\sin{\theta}\\\cos{\theta} \end{pmatrix} [AC?BD?](10?)=(cosθsinθ?),[AC?BD?](01?)=>(?sinθcosθ?)
所以自然得到:
A = cos ? θ B = ? sin ? θ C = sin ? θ D = c o s θ \begin{align} A &= \cos \theta\\ B &= -\sin \theta\\ C &= \sin \theta\\ D &= cos \theta\\ \end{align} ABCD?=cosθ=?sinθ=sinθ=cosθ??
3、平移
平移就是讓x軸和y軸的坐標分別偏移一定的量,如下圖所示:
x ′ = x + t x y ′ = y + t y x' = x + t_x\\ y' = y + t_y x′=x+tx?y′=y+ty?
我們記 P = ( x y ) P = \begin{pmatrix} x\\y \end{pmatrix} P=(xy?) , P ′ = ( x ′ y ′ ) P' = \begin{pmatrix} x'\\y' \end{pmatrix} P′=(x′y′?), T = ( t x t y ) T = \begin{pmatrix} t_x\\t_y \end{pmatrix} T=(tx?ty??) ,則上述可以表示為 P ′ ? = P ? + T ? \vec{P'} = \vec P + \vec T P′=P+T
但是我們發現,上述的形式沒有用上矩陣,但在數學、物理中,人們都講究統一,因此人們引入了齊次坐標的概念。
為了迎合平移也能統一使用矩陣進行變換,認為的給二維的向量添加一個維度,升為三維,如下:
p o s i t i o n = ( x y 1 ) , v e c t o r = ( x y 0 ) position = \begin{pmatrix} x\\y\\1 \end{pmatrix},vector = \begin{pmatrix} x\\y\\0 \end{pmatrix} position= ?xy1? ?,vector= ?xy0? ?
我們發現,位置向量咱們第三維補充1,方向向量咱們第三維補充0。
于是,咱們自然而然就可以定義出平移矩陣T,如下:
T = [ 1 0 t x 0 1 t y 0 0 1 ] 注: t x 表示 x 軸的偏移量, t y 表示 y 軸的偏移量 T = \begin{bmatrix} 1 & 0 & t_x\\ 0 & 1 & t_y\\ 0 & 0 & 1 \end{bmatrix}\\ 注:t_x 表示x軸的偏移量,t_y表示y軸的偏移量 T= ?100?010?tx?ty?1? ?注:tx?表示x軸的偏移量,ty?表示y軸的偏移量
于是,針對位置點的平移、以及位置向量的平移計算結果如下:
我們發現,方向向量的結果沒有變化,這難道出問題了么?并沒有,因為方向向量本身就是位置無關的,不變才是對的,而針對某個頂點是變化了的,這就符合咱們的要求!
4、齊次坐標下總結
引入齊次坐標后,縮放和旋轉矩陣多了一個維度,這里列舉一下:
縮放矩陣:
S = [ s x 0 0 0 s y 0 0 0 1 ] S = \begin{bmatrix} s_x & 0 & 0\\ 0 & s_y & 0\\ 0 & 0 & 1 \end{bmatrix} S= ?sx?00?0sy?0?001? ?
旋轉矩陣:
R = [ cos ? θ ? sin ? θ 0 sin ? θ cos ? θ 0 0 0 1 ] R = \begin{bmatrix} \cos \theta & -\sin \theta & 0\\ \sin \theta & \cos \theta & 0\\ 0 & 0 & 1 \end{bmatrix} R= ?cosθsinθ0??sinθcosθ0?001? ?
平移矩陣:
T = [ 1 0 t x 0 1 t y 0 0 1 ] T = \begin{bmatrix} 1 & 0 & t_x\\ 0 & 1 & t_y\\ 0 & 0 & 1 \end{bmatrix}\\ T= ?100?010?tx?ty?1? ?
三維變換
首先,由于多引入了一個維度,復雜度上升。坐標系自然而然分為兩種:左手系、右手系,示意圖如下:
**為了方便,后續三維空間中的矩陣變換講解以右手系為例!**左手系也是類似,大家熟練之后可自行推導!
同理,在三維坐標系下,同樣為了統一平移的操作,引入齊次坐標后,變換矩陣都是4x4的,這里不多贅述!
1、縮放
由于縮放最是容易,也最容易理解,這里直接給出縮放矩陣:
S = [ s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 ] 注: s x 、 s y 、 s z 分別為 x 、 y 、 z 軸的縮放比例 S = \begin{bmatrix} s_x & 0 & 0 & 0\\ 0 & s_y & 0 & 0\\ 0 & 0 & s_z & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}\\ 注:s_x、s_y、s_z分別為x、y、z軸的縮放比例 S= ?sx?000?0sy?00?00sz?0?0001? ?注:sx?、sy?、sz?分別為x、y、z軸的縮放比例
2、平移
也是類似,這里直接給出平移矩陣:
T = [ 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ] 注: t x 、 t y 、 t z 分別為 x 、 y 、 z 軸的偏移量 T = \begin{bmatrix} 1 & 0 & 0 & t_x\\ 0 & 1 & 0 & t_y\\ 0 & 0 & 1 & t_z\\ 0 & 0 & 0 & 1 \end{bmatrix}\\ 注:t_x、t_y、t_z分別為x、y、z軸的偏移量 T= ?1000?0100?0010?tx?ty?tz?1? ?注:tx?、ty?、tz?分別為x、y、z軸的偏移量
3、旋轉
由于三維世界中,旋轉并不是繞一個點,而是繞一個旋轉軸,所以最簡單的旋轉就是繞:x、y、z軸的旋轉。
旋轉規則: 繞某個軸旋轉 θ \theta θ 角度,就是表明逆著此軸的方向眼睛看過去,逆時針旋轉 θ \theta θ 角度。
例如如下示意圖就是繞z軸旋轉 θ \theta θ 角度:
并且我們一定要理解,繞z軸轉動時,所有點的z坐標是不會變化的!
這里需要對照二維空間中的旋轉矩陣的理解,本質上:二維旋轉就是將兩個相互垂直的基向量作為坐標軸,逆時針旋轉的結果
所以,上述的繞z軸的旋轉,可以理解為基向量就是 ( 1 0 0 ) \begin{pmatrix} 1\\0\\0 \end{pmatrix} ?100? ? 和 ( 0 1 0 ) \begin{pmatrix} 0\\1\\0 \end{pmatrix} ?010? ?
這里給出一個基本任意正交基向量 i ? 、 j ? \vec{i}、\vec{j} i、j? 的旋轉示意圖:
繞X軸旋轉:
示意圖如下:
因此,我們只是將基向量變成 ( 0 1 0 ) \begin{pmatrix} 0\\1\\0 \end{pmatrix} ?010? ? 和 ( 0 0 1 ) \begin{pmatrix} 0\\0\\1 \end{pmatrix} ?001? ?
所以,很容易構造出以下等式:
[ 1 0 0 0 0 cos ? θ ? sin ? θ 0 0 sin ? θ cos ? θ 0 0 0 0 1 ] ( x i j 1 ) = ( x cos ? θ ? i ? sin ? θ ? j sin ? θ ? i + cos ? θ ? j 1 ) \begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & \cos{\theta} & -\sin{\theta} & 0\\ 0 & \sin{\theta} & \cos{\theta} & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}\\ \begin{pmatrix} x\\i\\j\\1 \end{pmatrix} =\begin{pmatrix} x\\\cos{\theta}*i - \sin{\theta} * j\\\sin{\theta}*i + \cos{\theta} * j\\1 \end{pmatrix} ?1000?0cosθsinθ0?0?sinθcosθ0?0001? ? ?xij1? ?= ?xcosθ?i?sinθ?jsinθ?i+cosθ?j1? ?
自然而然可以得出,繞x軸的旋轉矩陣如下:
R x = [ 1 0 0 0 0 cos ? θ ? sin ? θ 0 0 sin ? θ cos ? θ 0 0 0 0 1 ] R_x = \begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & \cos{\theta} & -\sin{\theta} & 0\\ 0 & \sin{\theta} & \cos{\theta} & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} Rx?= ?1000?0cosθsinθ0?0?sinθcosθ0?0001? ?
繞Z軸旋轉:
同理,示意圖:
容易構造出以下等式:
[ cos ? θ ? sin ? θ 0 0 sin ? θ cos ? θ 0 0 0 0 1 0 0 0 0 1 ] ( i j z 1 ) = ( cos ? θ ? i ? sin ? θ ? j sin ? θ ? i + cos ? θ ? j z 1 ) \begin{bmatrix} \cos{\theta} & -\sin{\theta} & 0 & 0\\ \sin{\theta} & \cos{\theta} & 0 & 0\\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}\\ \begin{pmatrix} i\\j\\z\\1 \end{pmatrix} =\begin{pmatrix} \cos{\theta}*i - \sin{\theta} * j\\\sin{\theta}*i + \cos{\theta} * j\\z\\1 \end{pmatrix} ?cosθsinθ00??sinθcosθ00?0010?0001? ? ?ijz1? ?= ?cosθ?i?sinθ?jsinθ?i+cosθ?jz1? ?
自然而然可以得出,繞z軸的旋轉矩陣如下:
R z = [ cos ? θ ? sin ? θ 0 0 sin ? θ cos ? θ 0 0 0 0 1 0 0 0 0 1 ] R_z = \begin{bmatrix} \cos{\theta} & -\sin{\theta} & 0 & 0\\ \sin{\theta} & \cos{\theta} & 0 & 0\\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} Rz?= ?cosθsinθ00??sinθcosθ00?0010?0001? ?
繞Y軸旋轉:
Y軸相比X和Z比較特殊,也是新手初學三維空間旋轉最容易困惑的地方。但在咱們這里不存在,示意圖如下:
容易構造出以下等式:
[ cos ? θ 0 sin ? θ 0 0 1 0 0 ? sin ? θ 0 cos ? θ 0 0 0 0 1 ] ( j y i 1 ) = ( sin ? θ ? i + cos ? θ ? j y cos ? θ ? i ? sin ? θ ? j 1 ) \begin{bmatrix} \cos{\theta} & 0 & \sin{\theta} & 0\\ 0 & 1 & 0 & 0\\ -\sin{\theta} & 0 & \cos{\theta} & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}\\ \begin{pmatrix} j\\y\\i\\1 \end{pmatrix} =\begin{pmatrix} \sin{\theta}*i + \cos{\theta} * j\\y\\\cos{\theta}*i - \sin{\theta} * j\\1 \end{pmatrix} ?cosθ0?sinθ0?0100?sinθ0cosθ0?0001? ? ?jyi1? ?= ?sinθ?i+cosθ?jycosθ?i?sinθ?j1? ?
咱們發現,這里的形式稍微較繞x和繞z不一樣了
本質就是因為這里的正交基分別是: ( 0 0 1 ) \begin{pmatrix} 0\\0\\1 \end{pmatrix} ?001? ? 和 ( 1 0 0 ) \begin{pmatrix} 1\\0\\0 \end{pmatrix} ?100? ?
自然而然可以得出,繞y軸的旋轉矩陣如下:
R y = [ cos ? θ 0 sin ? θ 0 0 1 0 0 ? sin ? θ 0 cos ? θ 0 0 0 0 1 ] R_y = \begin{bmatrix} \cos{\theta} & 0 & \sin{\theta} & 0\\ 0 & 1 & 0 & 0\\ -\sin{\theta} & 0 & \cos{\theta} & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} Ry?= ?cosθ0?sinθ0?0100?sinθ0cosθ0?0001? ?
結尾:喜歡的小伙伴可以點點關注+贊哦
希望對各位小伙伴能夠有所幫助哦,永遠在學習的道路上伴你而行, 我是航火火,火一般的男人!