坐標系
左右手坐標系
- 左手坐標系:伸開左手,大拇指指向X軸正方向,食指指向Y軸正方向,其他三個手指指向Z軸正方向,
- 右手坐標系:伸開右手,大拇指指向X軸正方向,食指指向Y軸正方向,其他三個手指指向Z軸正方向,



3D笛卡爾坐標系:右手坐標系
OpenGL:右手坐標系
Direct3D:左手坐標系
Unity3D:左手坐標系(世界坐標系),即+x, +y, +z分別指向右方,上方和前方,????
各種坐標空間(坐標系)
部分空間種類
- 模型空間
- unity約定:使用的左手坐標系,XYZ分別對應著右上前,
- 模型空間的原點和坐標軸通常由美術人員在建模軟體里確定好的,當匯入到unity中,我們可以在頂點著色器中訪問到模型的頂點資訊,其中包含了每個頂點的坐標,這些坐標都是相對于模型空間中的原點(通常位于模型的重心)定義的,
- 檢視視圖中顯示的為localPosition的值,
- transform.localPosition(本地坐標)可以獲得物體在父物體的區域坐標系中的位置點,
- 世界空間
- unity約定:使用左手坐標系,但它的XYZ軸是固定不變的,
- transform.position來獲取游戲物件的世界坐標,
- 觀察空間
- 右手坐標系,這是符合OpenGL傳統的,再這樣的觀察空間中,攝像機的正前方向指的是-z軸方向,
- unity約定:攝像機位于原點,+x軸指向右方,+y軸指向上分,而+z軸指向的是攝像機的后方,
- 裁切空間
- 目標是能夠方便地對渲染圖元進行裁剪:完全位于這塊空間內部的圖元將會被保留,完全位于這塊空間外部的圖元將會被剔除,而與這塊空間邊界相交的圖元就會被裁剪,
- 這塊空間是由視椎體來決定,
- 螢屏空間
- 左手坐標系
- 以像素來定義的,螢屏的左下角為(0,0),右上角為(Screen.width, Screen.height),z軸的坐標是相機的世界坐標中z軸坐標的負值,
- 螢屏空間是一個二維空間,
- 滑鼠位置坐標屬于螢屏坐標,通過Input.mousePosition可以獲得該位置的坐標,
- 手指觸摸螢屏也為螢屏坐標,Input.GetTouch(0).position可以獲得單個手指觸摸螢屏時手指的坐標,
- 視口空間
- 將Game視圖的螢屏坐標系單位化
- 左下角(0,0),右上角(1,1),z軸的坐標是相機的世界坐標中z軸坐標的負值,
相互空間轉換
- shader中空間轉換

- 模型變換:頂點變換的第一步就是將頂點從模型空間變換到世界空間中,這個變換通常叫做模型變換,注意這里的變換順序是不能互換的,即先進行縮放,然后進行旋轉,最后是平移,然后我們可以構建出模型變換的變換矩陣(因為矩陣不滿足交換律,所以不要隨便調換變換順序)
- 觀察變換:頂點變換的第二步,就是將頂點坐標從世界空間變換到觀察空間中,這個變換通常叫做觀察變換,一種方法是計算觀察空間中的三個坐標軸在世界空間下的表示,然后構建出觀察空間變換到世界空間的變換矩陣,再對該矩陣求逆得到從世界空間變換到觀察空間的變換矩陣,另一種方法是想象平移整個觀察空間,讓攝像機原點位于世界坐標的原點,坐標軸與世界空間中的坐標軸重合即可
- 投影變換:頂點變換的第三步,就是將頂點坐標從觀察空間變換到裁切空間(也被稱為齊次裁剪空間)中,這個變換通常叫做投影變換,這個用于變換的矩陣叫做裁剪矩陣,也被稱為投影矩陣,
- 目的:首先是為投影做準備,真正的投影發生在后面的齊次除法程序中,而經過投影矩陣變換后,頂點的w分量將會有特殊的意義;其次是對x,y,z分量進行縮放,
- 視椎體指的是空間中的一塊區域,這塊區域決定了攝像機可以看到的空間,視椎體由兩種型別,這涉及兩種投影:一種是正交投影,一種是透視投影,
- 投影:可以理解成一個空間的降維,例如從四維空間投影到三維空間,而投影矩陣實際上并不會真正的進行投影,它會為真正的投影做準備作業,真正的投影會在螢屏映射時發生,通過齊次除法來得到二維坐標,
- 螢屏映射:就是把頂點從裁剪空間投影到螢屏空間中,來生成對應的2D坐標,在unity中,從裁剪空間到螢屏空間的轉換一般是底層幫我們完成的,我們頂點著色器只需要把頂點轉換到裁剪空間即可,最后由此通過齊次除法和映射到螢屏,——分為兩個步驟:首先進行標準齊次除法,也被稱為透視除法,就是用齊次坐標系的w分量去除以x,y,z分量;經過齊次除法后,透視投影和正交投影的視椎體都變換到一個相同的立方體內,接下來可以根據 變換后的x和y坐標來映射輸出視窗的對應像素坐標,
- unity中C#相關API
- Transform.forward, Transform.right, Transform.up:當前物體的物體坐標系的z軸,x軸,y軸在世界坐標系上的指向,
- Transform.TransformPoint(Vector3 position) :將一個坐標點從區域坐標系轉換到全域坐標系,
- Transform.InverseTransformPoint(Vector3 position):將坐標點從全域坐標系轉換到區域坐標系,
- Transform.TransformDirection(Vector3 direction):將一個方向從區域坐標系轉換到全域坐標系,
- Transform.InverseTransformDirection(Vector3 direction):將一個方向從全域坐標系轉換到區域坐標系,
- Transform.TransformVector(Vector3 vector):將一個向量從區域坐標系轉換到全域坐標系,
- Transform.InverseTransformVector(Vector3 vector):將一個向量從全域坐標系轉換到區域坐標系,
- Camera.ScreenToWorldPoint(Vector3 position): 將螢屏坐標轉換為全域坐標,
- Camera.WorldToScreenPoint(Vector3 position):將全域坐標轉換為螢屏坐標,
- Camera.ScreenToViewportPoint(Vector3 position):將螢屏坐標轉換為視口坐標,
- Camera.ViewportToScreenPoint(Vector3 position):將視口坐標轉換為螢屏坐標,
- Camera.WorldToViewportPoint(Vector3 position):將全域坐標轉換為視口坐標,
- Camera.ViewportToWorldPoint(Vector3 position):將視口坐標轉換為全域坐標,
向量
認識向量
- 在數學中,向量(也稱為矢量),是指具有大小和方向的量;書寫向量時,水平書寫的向量叫做行向量
[ 1 2 3 ] \begin{bmatrix} 1 & 2 & 3 \end{bmatrix} [1?2?3?]
垂直書寫的向量叫做列向量,
[ 1 2 3 ] \begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix} ???123???? - 向量的大小就是向量的長度,也叫做模,向量的方向描述了空間中向量的指向;向量中的數表達了向量在每個維度上的有向位移,
- 點中的數表示了一個位置,它沒有大小、方向的概念;點只有位置,適量只有方向和大小,任何一個點都可以表示成一個從原點出發的矢量,
向量運算
特殊向量
- 零向量:大小為0,沒有方向的向量,并且它不可以被歸一化,
- 負向量:向量變負,將得到一個和原向量方向相反、大小相等的向量,
- 單位向量:也叫做標準化向量,就是大小為1的向量;對任意的非零向量,我們都可以計算出它的單位向量,即將其歸一化(normalization),單位向量的表示
a ^ = a ∣ a ∣ \widehat{\bf{a}} =\frac{\bf{a}}{\begin{vmatrix} \bf{a} \end{vmatrix}} a =∣∣?a?∣∣?a? - 在Unity中,可以使用Vector3.Normalize來歸一化向量,使用Vector3.normalized來獲得歸一化后的單位向量;Vector3.Normalize改變當前向量,Vector3.normalized當前向量是不改變的并且回傳一個新的規范化的向量,
向量的長度
- 即向量的大小,或者向量的模,
- 向量的大小就是向量各分量平方和的平方根
- 在Unity中,可以通過Vector3.magnitude計算向量的長度,Vector3.sqrMagnitude則回傳向量長度的平方;Vector3.Distance(A,B)可以計算2個點A,B之間的距離,即回傳向量AB或向量BA的長度,
向量與標量的乘/除法
- 向量與標量的乘法,即將向量的每個分量分別與標量相乘,
- 向量與非零標量的除法,即乘以該標量的倒數,
向量的加/減法
- 只有在兩個向量的維度相同時,才可以相加或相減,
- 向量的加法和減法,即將向量的各個分量相加或相減,
- 向量的加法滿足交換律和結合律,向量的減法僅滿足結合律,
- 幾何意義:對于加法,我們可以把矢量a的頭連接到矢量b的尾,然后畫一條從a的尾到b的頭的矢量,來得到a和b相加后的矢量,減法類似
- 公式: a ? + b ? = ( a x + b x , a y + b y , a z + b z ) a ? ? b ? = ( a x ? b x , a y ? b y , a z ? b z ) \vec{a} + \vec{b}=(a_x+b_x,a_y+b_y,a_z+b_z) \\ \vec{a} - \vec{b}=(a_x-b_x,a_y-b_y,a_z-b_z) a +b =(ax?+bx?,ay?+by?,az?+bz?)a ?b =(ax??bx?,ay??by?,az??bz?)
向量的點積
- 也叫做向量的內積,表示如下:其中點不可以省略
a ? ? b ? \vec{a} \cdot \vec{b} a ?b - 兩種計算公式如下:
a ? ? b ? = ∣ a ? ∣ ∣ b ? ∣ cos ? θ a ? ? b ? = ( a x b x + a y b y + a z b z ) \vec{a} \cdot \vec{b}=\rvert \vec{a} \rvert \rvert \vec{b} \rvert \cos \theta \\ \vec{a} \cdot \vec{b}=(a_xb_x+a_yb_y+a_zb_z) a ?b =∣a ∣∣b ∣cosθa ?b =(ax?bx?+ay?by?+az?bz?) - 點積滿足交換律,
- 向量點積的結果是一個標量
- 幾何意義:
- 點乘結果描述了兩個向量的“相似”程度,點乘結果越大,兩向量越相近
- 投影:向量b在向量a上的投影的長度可以表示為
∣ b ? → a ? ∣ = ∣ b ? ∣ cos ? θ = a ? ? b ? ∣ a ? ∣ \begin{vmatrix} \vec{b} \to \vec{a} \end{vmatrix}=\begin{vmatrix} \vec{b} \end{vmatrix} \cos \theta=\frac{\vec{a} \cdot \vec{b}}{\begin{vmatrix} \vec{a} \end{vmatrix}} ∣∣∣?b →a ?∣∣∣?=∣∣∣?b ?∣∣∣?cosθ=∣∣?a ?∣∣?a ?b ?
- 重要性質:
- 點積可結合標量乘法
( k a ? ) ? b ? = a ? ? ( k b ? ) = k ( a ? ? b ? ) (k \vec{a}) \cdot \vec{b} = \vec{a} \cdot (k \vec{b})=k ( \vec{a} \cdot \vec{b}) (ka )?b =a ?(kb )=k(a ?b ) - 點積可結合矢量加減法
a ? ? ( b ? + c ? ) = a ? ? b ? + a ? ? c ? \vec{a} \cdot ( \vec{b}+\vec{c}) = \vec{a} \cdot \vec{b}+\vec{a} \cdot \vec{c} a ?(b +c )=a ?b +a ?c - 一個矢量和本身進行點積的結果是該矢量的模的平方
- 點積可結合標量乘法
向量的叉積
- 也叫做向量的外積,表示如下:其中叉不可以省略
a ? × b ? \vec{a} \times \vec{b} a ×b - 計算公式如下:
[ x 1 y 1 z 1 ] × [ x 2 y 2 z 2 ] = [ y 1 z 2 ? z 1 y 2 z 1 x 2 ? x 1 z 2 x 1 y 2 ? y 1 x 2 ] \begin{bmatrix} x_{1}\\ y_{1}\\ z_{1} \end{bmatrix}\times\begin{bmatrix} x_{2}\\ y_{2}\\ z_{2} \end{bmatrix} =\begin{bmatrix} y_{1}z_{2}-z_{1}y_{2}\\ z_{1}x_{2}-x_{1}z_{2}\\ x_{1}y_{2}-y_{1}x_{2} \end{bmatrix} ???x1?y1?z1?????×???x2?y2?z2?????=???y1?z2??z1?y2?z1?x2??x1?z2?x1?y2??y1?x2????? - 三重積: a ? ? b ? × c ? = a ? ? ( b ? × c ? ) \vec{a} \cdot \vec{b} \times \vec{c}=\vec{a} \cdot (\vec{b} \times \vec{c}) a ?b ×c =a ?(b ×c )
- 點積不滿足交換律,也不滿足結合律,
- 向量叉積的結果仍是一個向量
- 幾何意義:
- 叉乘得到的向量垂直于原來的兩個向量
- 叉乘的長度等于向量的大小與向量夾角sin值的積
∣ a ? × b ? ∣ = ∣ a ? ∣ ∣ b ? ∣ sin ? θ \begin{vmatrix} \vec{a} \times \vec{b} \end{vmatrix} = \begin{vmatrix} \vec{a} \end{vmatrix} \begin{vmatrix} \vec{b} \end{vmatrix} \sin \theta ∣∣∣?a ×b ?∣∣∣?=∣∣?a ?∣∣?∣∣∣?b ?∣∣∣?sinθ - 叉乘的長度也等于以a和b為兩邊的平行四邊形的面積
矩陣
認識矩陣
- 在數學中,矩陣是一個按照長方陣排列的復數或實數的集合,
- 在一個m×n的矩陣A中,有m×n個數,這些數稱為矩陣A的元素,數 aij 位于矩陣的第i行,第j列,稱為矩陣A的(i,j)元素,
- 矩陣中元素的下標是從1開始的,
[ a 11 a 12 a 13 ? a 1 j a 21 a 22 a 23 ? a 2 j ? ? ? ? ? a i 1 a i 2 a i 3 ? a i j ] \begin{bmatrix} a_{11} & a_{12} & a_{13} & \cdots & a_{1j} \\ a_{21} & a_{22} & a_{23} & \cdots & a_{2j} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ a_{i1} & a_{i2} & a_{i3} & \cdots &a_{ij} \\ \end{bmatrix} ??????a11?a21??ai1??a12?a22??ai2??a13?a23??ai3???????a1j?a2j??aij????????
矩陣和標量的乘法
- 矩陣和標量相乘,得到的仍然是一個相同維度的矩陣,矩陣和標量的乘法,即矩陣的每個元素和該標量相乘
矩陣和矩陣的加/減法
- 只有維度相同的矩陣,才可以相加相減
- 矩陣和矩陣的相加/相減即矩陣各相同位置的元素的相加相減
矩陣和矩陣的乘法
- 公式:一個r×n的矩陣A和一個n×c的矩陣B相乘,它們的結果AB將會是一個r×c大小的矩陣,這里第一個矩陣的列數必須和第二個矩陣的行數相同,他們相乘得到的矩陣的行數是第一個矩陣的行數,列數是第二個矩陣的列數,
- 演示:

- 矩陣乘法不滿足交換律,但是滿足結合律及以下關系: A B ≠ B A ( A B ) C = A ( B C ) A B = B T A \mathbf{AB}\neq \mathbf{BA} \\ \left ( \mathbf{AB} \right )\mathbf{C}= \mathbf{A}\left ( \mathbf{BC} \right ) \\ \mathbf{AB}= \mathbf{B^{T}A} AB?=BA(AB)C=A(BC)AB=BTA
- 矩陣的幾何意義
- 方陣的的行能被解釋為坐標系的基向量;
- 為了將向量從原坐標系變換到新坐標系,用它乘以一個矩陣;
- 從原坐標系到這些基向量定義的新坐標系的變換是一種線性變換;線性變換保持直線和平行線,但角度、長度、面積和體積可能會被改變,
- 零向量乘以任何矩陣仍然得到零向量,因此,方陣代表的線性變換的原點和原坐標系的原點一致,變換不包含原點,
- 可以通過想象變換后的坐標系的基向量來想象矩陣,這些基向量在2D中構成“L”型,在3D中構成“三角架”型,
如何理解矩陣相乘的幾何意義或現實意義?
- 向量和矩陣相乘:行向量左乘矩陣時,結果是行向量;列向量右乘矩陣時,結果是列向量,其他相乘順序是不允許的,
特殊矩陣
方陣
- 行數和列數相等的矩陣被稱為方塊矩陣
對角矩陣
- 對角線元素:方陣中行號和列號相同的元素,其他元素為非對角線元素
- 如果一個矩陣除了對角元素外的所有元素都為0,那么這個矩陣就叫做對角矩陣
單位矩陣
- 對角線元素為1,其他元素為0,(乘法單位元)
轉置矩陣
- 一個r×c矩陣M,M的轉置記作
M
T
\bf M^T
MT是一個c×r矩陣,它的列由M的行組成,即
M i j T = M j i M_{ij}^{T}=M_{ji} MijT?=Mji? - 性質1:矩陣轉置的轉置等于原矩陣:
( M T ) T = M \left (\mathbf{M} ^{T}\right )^{T}=\mathbf{M} (MT)T=M - 性質2:矩陣串接的轉置等于反向串接各個矩陣的轉置:
( A B ) T = B T A T \left ( \mathbf{AB} \right )^{T}=\mathbf{B}^{T}\mathbf{A}^{T} (AB)T=BTAT
逆矩陣
- 給定一個方陣M,它的逆矩陣表示:
M ? 1 \bf{M}^{-1} M?1 - 如果一個矩陣有相應的逆矩陣,則可以說這個矩陣是可逆的,或者說是非奇異的,如果一個矩陣沒有相應的逆矩陣,則可以說這個矩陣是不可逆的,或者說是奇異的,
- 性質1:只有方塊矩陣才可能有逆矩陣,因為一個矩陣A和它的逆矩陣B需要滿足條件:AB = I(I是單位矩陣),
M M ? 1 = M ? 1 M = I \mathbf{M}\mathbf{M}^{-1}=\mathbf{M}^{-1}\mathbf{M}=\mathbf{I} MM?1=M?1M=I - 性質2:逆矩陣的逆矩陣是原矩陣本身,
( M ? 1 ) ? 1 = M \left ( \mathbf{M}^{-1} \right )^{-1}=\mathbf{M} (M?1)?1=M - 性質3:單位矩陣的逆矩陣是它本身
I ? 1 = I \mathbf{I}^{-1}=\mathbf{I} I?1=I - 性質4:轉置矩陣的逆矩陣是逆矩陣的轉置
( M T ) ? 1 = ( M ? 1 ) T \left ( \mathbf{M}^{T} \right )^{-1}=\left ( \mathbf{M}^{-1} \right )^{T} (MT)?1=(M?1)T - 性質5:矩陣串接相乘后的逆矩陣等于反向串接各個矩陣的逆矩陣(這個性質可以擴展到更多矩陣相乘)
( A B ) ? 1 = B ? 1 A ? 1 \left ( \mathbf{AB} \right )^{-1}=\mathbf{B}^{-1}\mathbf{A}^{-1} (AB)?1=B?1A?1 - 對于所有元素都為0的矩陣,沒有對應的逆矩陣,
- ?矩陣的逆的幾何解釋:如果向量v用矩陣M來進行變換,接著用M的逆進行變換,將會得到原向量,
正交矩陣
-
如果一個方陣M和它的轉置矩陣的乘積是單位矩陣的話,我們就說這個矩陣是正交的: M M T = M T M = I \mathbf{M}\mathbf{M}^{T}=\mathbf{M}^{T}\mathbf{M}=\mathbf{I} MMT=MTM=I
-
推理:如果一個矩陣是正交的,那么它的轉置矩陣和逆矩陣是一樣的,
-
幾何意義:若一個矩陣是正交矩陣,它必須滿足下列條件:
- 矩陣的每一行都是單位向量
- 矩陣的所有行互相垂直
-
線性代數中一組向量互相垂直,這組向量被認為是正交基;如果他們同時滿足都是單位向量,則稱他們是標準正交基
矩陣的行列式
- 定義
- 在任意方陣中都存在一個標量,稱作該方陣的行列式;非方陣的行列式是未定義的,
在書寫行列式時,兩邊用豎線將數字塊圍起來,省略方括號, - 2D:幫助記憶法:將主對角線和反對角線上的元素各自相乘,然后用主對角線元素的積減去反對角線元素的積,
∣ M ∣ = ∣ m 11 m 12 m 21 m 22 ∣ = m 11 m 22 ? m 12 m 21 \left | M \right |=\begin{vmatrix} m_{11} &m_{12} \\ m_{21} & m_{22} \end{vmatrix}=m_{11}m_{22}-m_{12}m_{21} ∣M∣=∣∣∣∣?m11?m21??m12?m22??∣∣∣∣?=m11?m22??m12?m21? - 3D:幫助記憶法:把矩陣M連寫兩遍,將主對角線上的元素和反對角線上的元素各自相乘,然后用主對角線上元素積的和減去反對角線上元素積的和,
∣ M ∣ = ∣ m 11 m 12 m 13 m 21 m 22 m 23 m 31 m 32 m 33 ∣ = m 11 m 22 m 33 + m 12 m 23 m 31 + m 13 m 21 m 32 ? m 13 m 22 m 31 ? m 12 m 21 m 33 ? m 11 m 23 m 32 = m 11 ( m 22 m 33 ? m 23 m 32 ) + m 12 ( m 23 m 31 ? m 21 m 33 ) + m 13 ( m 21 m 32 ? m 22 m 31 ) \left | M \right |=\begin{vmatrix} m_{11} & m_{12} &m_{13} \\ m_{21} & m_{22} &m_{23} \\ m_{31} & m_{32} &m_{33} \end{vmatrix}=m_{11}m_{22}m_{33}+m_{12}m_{23}m_{31}+m_{13}m_{21}m_{32}-m_{13}m_{22}m_{31}-m_{12}m_{21}m_{33}-m_{11}m_{23}m_{32}=m_{11}(m_{22}m_{33}-m_{23}m_{32})+m_{12}(m_{23}m_{31}-m_{21}m_{33})+m_{13}(m_{21}m_{32}-m_{22}m_{31}) ∣M∣=∣∣∣∣∣∣?m11?m21?m31??m12?m22?m32??m13?m23?m33??∣∣∣∣∣∣?=m11?m22?m33?+m12?m23?m31?+m13?m21?m32??m13?m22?m31??m12?m21?m33??m11?m23?m32?=m11?(m22?m33??m23?m32?)+m12?(m23?m31??m21?m33?)+m13?(m21?m32??m22?m31?) 
- 在任意方陣中都存在一個標量,稱作該方陣的行列式;非方陣的行列式是未定義的,
- 行列式的一些性質:
- 任意行或列的非零積加到另一行或列上不會改變行列式的值
- 交換矩陣的任意兩行或兩列,行列式變負
- 如果矩陣的任意行或列全為零,那么它的行列式等于零
- 矩陣積的行列式等于矩陣行列式的積;這個性質可以擴展到多個矩陣情況.
∣ A B ∣ = ∣ A ∣ ∣ B ∣ \left | AB \right |=\left| A \right|\left| B \right| ∣AB∣=∣A∣∣B∣ - 矩陣轉置的行列式等于原矩陣的行列式,
∣ M T ∣ = ∣ M ∣ \left | M^{T} \right |=\left | M \right | ∣∣?MT∣∣?=∣M∣
- 矩陣的行列式的幾何意義:
- 2D中,行列式等于以基向量為兩邊的平行四邊形的有符號面積;(有符號面積是指如果平行四邊形相對于遠來的方位“翻轉”,那么面積變負,)
- 3D中,行列式等于以變換后的基向量為三邊的平行六面體的有符號體積,3D中,如果變換使得平行六面體“由里向外”翻轉,則行列式變負,
- 行列式和矩陣變換導致的尺寸改變相關,其中行列式的絕對值和面積(2D),體積(3D)的改變相關,行列式的符號說明了變換矩陣是否包含鏡像或投影,
- 矩陣的行列式還可以對矩陣所代表的變換分類:如果矩陣行列式為零,那么該矩陣包含投影;如果矩陣行列式為負,那么該矩陣包含鏡像,
變換
齊次坐標
齊次坐標就是將一個原本是n維的向量用一個n+1維向量來表示,是指一個用于投影幾何里的坐標系統,如同用于歐氏幾何里的笛卡兒坐標一般,
線性變換
- 定義:從代數上,是指可以保留矢量加和標量乘的變換,需要滿足下面的2個條件,
A ( α + β ) = A ( α ) + A ( β ) A ( k α ) = k A ( α ) A(α+β)=A(α)+A(β)\\[1ex] A (kα)=kA(α) A(α+β)=A(α)+A(β)A(kα)=kA(α)
從幾何的角度上去理解,需要滿足:- 變換前是直線的,變換后依然是直線,
- 直線比例保持不變,
- 變換前是原點的,變換后依然是原點,
- 旋轉和縮放都屬于線性變換
- 旋轉
2D旋轉
R ( θ ) = [ p ′ q ′ ] = [ c o s θ s i n θ ? s i n θ c o s θ ] R(\theta )=\begin{bmatrix} p^{'}\\ q^{'} \end{bmatrix}=\begin{bmatrix} cos\theta & sin\theta \\ -sin\theta & cos\theta \end{bmatrix} R(θ)=[p′q′?]=[cosθ?sinθ?sinθcosθ?]
3D旋轉
繞X軸
R ( θ ) = [ p ′ q ′ r ′ ] = [ 1 0 0 0 c o s θ s i n θ 0 ? s i n θ c o s θ ] R(\theta )=\begin{bmatrix} p^{'}\\ q^{'}\\ r^{'} \end{bmatrix}=\begin{bmatrix} 1&0&0 \\ 0&cos\theta&sin\theta \\ 0&-sin\theta&cos\theta \end{bmatrix} R(θ)=???p′q′r′????=???100?0cosθ?sinθ?0sinθcosθ????
繞Y軸
R ( θ ) = [ p ′ q ′ r ′ ] = [ c o s θ 0 ? s i n θ 0 1 0 s i n θ 0 c o s θ ] R(\theta )=\begin{bmatrix} p^{'}\\ q^{'}\\ r^{'} \end{bmatrix}=\begin{bmatrix} cos\theta&0&-sin\theta \\ 0&1&0 \\ sin\theta&0&cos\theta \end{bmatrix} R(θ)=???p′q′r′????=???cosθ0sinθ?010??sinθ0cosθ????
繞Z軸
R ( θ ) = [ p ′ q ′ r ′ ] = [ c o s θ s i n θ 0 ? s i n θ c o s θ 0 0 0 1 ] R(\theta )=\begin{bmatrix} p^{'}\\ q^{'}\\ r^{'} \end{bmatrix}=\begin{bmatrix} cos\theta&sin\theta&0 \\ -sin\theta&cos\theta&0 \\ 0&0&1 \end{bmatrix} R(θ)=???p′q′r′????=???cosθ?sinθ0?sinθcosθ0?001????
2.縮放(沿著每個坐標軸應用單獨的縮放因子k)
2D縮放
S ( k x , k y ) = [ p ′ q ′ ] = [ k x 0 0 k y ] S(k_{x},k_{y})=\begin{bmatrix} p^{'} \\ q^{'} \end{bmatrix}=\begin{bmatrix} k_{x} & 0\\ 0 & k_{y} \end{bmatrix} S(kx?,ky?)=[p′q′?]=[kx?0?0ky??]
3D縮放
S ( k x , k y , k y ) = [ p ′ q ′ r ′ ] = [ k x 0 0 0 k y 0 0 0 k z ] S(k_{x},k_{y},k_{y})=\begin{bmatrix} p^{'} \\ q^{'} \\ r^{'} \end{bmatrix}=\begin{bmatrix} k_{x}&0&0 \\ 0&k_{y}&0 \\ 0&0&k_{z} \end{bmatrix} S(kx?,ky?,ky?)=???p′q′r′????=???kx?00?0ky?0?00kz?????
- 旋轉
仿射變換
- 定義:從幾何的角度去理解,需要滿足:
- 變換前是直線的,變換后依然是直線,
- 直線比例保持不變,
- 推理:平移、旋轉、縮放都屬于仿射變換,
- 對點平移
[ 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ] [ x y z 1 ] = [ x + t x y + t y z + t z 1 ] \begin{bmatrix} 1 & 0 & 0 & t_{x}\\ 0 & 1 & 0 & t_{y}\\ 0 & 0 & 1 & t_{z}\\ 0 & 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix}=\begin{bmatrix} x+t_{x}\\ y+t_{y}\\ z+t_{z}\\ 1 \end{bmatrix} ?????1000?0100?0010?tx?ty?tz?1???????????xyz1??????=?????x+tx?y+ty?z+tz?1?????? - 性質
1、平移變換不會對方向矢量產生任何影響,
2、平移矩陣的逆矩陣就是反向平移得到的矩陣 - 復合變換
由于上面我們使用的是列矩陣,因此閱讀順序是從右向左,即先縮放,在旋轉,最后平移,順序很重要,

- 對點平移
- 透視投影
- 將3D空間投影到2D平面上,該平面稱作投影平面,使用的是正交投影,正交投影也稱作平行投影;透視投影的投影線不再是平行的,它們相交于一點,該點稱作投影中心,因為投影中心在投影平面前面,投影線到達平面之前已經相交,所以投影平面上的影像是翻轉的,,,當物體原理投影中心時,正交投影仍保持不變,但透視投影變小了,這種視覺現象稱作透視縮略,
- 小孔成像:
公式:(向z=d平面投影)
p ′ = [ x ′ y ′ z ′ ] = [ d x / z d y / z d ] {p}'=\begin{bmatrix} {x}'\\ {y}'\\ {z}' \end{bmatrix}=\begin{bmatrix} dx/z\\ dy/z\\ d \end{bmatrix} p′=???x′y′z′????=???dx/zdy/zd????
使用矩陣進行透視投影
[ x y z 1 ] [ 1 0 0 0 0 1 0 0 0 0 1 1 / d 0 0 0 0 ] = [ x y z z / d ] \begin{bmatrix} x & y & z & 1 \end{bmatrix}\begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & 1 & 1/d\\ 0 & 0 & 0 & 0 \end{bmatrix}=\begin{bmatrix} x & y & z & z/d \end{bmatrix} [x?y?z?1?]?????1000?0100?0010?001/d0??????=[x?y?z?z/d?]
- unity相關API
- 使用Matrix4x4.Translate創建一個平移矩陣,
- 使用Matrix4x4.Rotate創建一個旋轉矩陣,
- 使用Matrix4x4.Scale創建一個縮放矩陣,
- 使用Matrix4x4.TRS創建一個移動、旋轉、縮放的復合矩陣,
- 使用Matrix4x4.MultiplyPoint或者Matrix4x4.MultiplyPoint3x4來變換一個點,
- 使用Matrix4x4.MultiplyVector來變換一個向量,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/325851.html
標籤:其他
