3D數學基礎-向量運算基礎和矩陣變換
最近在跟公開課 edx 的 Computer Graphics(想一起學的告訴我!),這篇筆記主要介紹了圖形學中會用到的比較基礎的3D數學,重拾大學線性代數知識。
基礎運算
點積(Dot Product)
將向量相乘得到一個標量 可以通過兩個向量除以它們的模得到兩個向量之間的夾角
用途:
- 求兩個向量之間的夾角(光源和表面之間夾角的餘弦值對於投影來說非常重要)
- 找到一個向量在另一向量上的投影也非常重要(比如我們想知道一個點在新的座標系下的座標)。
- 點積在笛卡爾座標系下很有用
叉積(Cross Product)
將向量相乘得到一個正交向量(垂直於向量a和向量b)
叉積所得到的向量的方向可以通過右手座標系來得到:
用右手食指代表叉積中前一個向量,用中指代表叉積中後一個向量,則大拇指的方向就是叉積得到的向量方向。這簡單的方法能提醒你將進行叉積的兩個向量順序調換的話,得到的向量方向會相反。
叉積可以用向量 a 的對偶矩陣來完成,所以可以將它表示成A星(A*)乘以b,其中A*是向量a的對偶矩陣(共軛轉置)。
正交座標系
正交基和座標系對於表示點的位置非常重要,因為在圖形學中,我們通常需要很多不同的座標系,來表示點在不同參照物下的位置。例如,要表示自己身前一臺電腦的位置,可以在自己的位置建立一個座標系來表示電腦的位置,要表示北極的位置時,用地球的座標系表示北極的位置會更容易。
矩陣
圖形學中矩陣很重要,因為大多數變換都涉及一個矩陣乘以一個向量,矩陣可以用來變換點。下面簡單的列一下矩陣的性質,更多的性質可以參考下維基頁面矩陣。
矩陣相乘
矩陣相乘時,乘積處(i,j)處的元素是:第一個矩陣的 i 行和第二個矩陣 j 列的點積,這也是為什麼要求第一個矩陣的列數等於第二個矩陣的行數。
矩陣轉置
矩陣的逆
矩陣與矩陣的逆相乘得到單位矩陣:
矩陣變換
縮放
二維空間下和三維空間下的縮放很簡單,直接乘上相應的縮放倍數即可。
切變
旋轉
二維空間下的旋轉
二維空間下,物體的旋轉可以靠矩陣在X方向的變換於矩陣在Y方向的變換疊加得到,但不適用於三維空間。
下面是推導過程:
這三種矩陣變換不符合交換律,也就是說變換的順序改變會得到不同的結果,要恢復變換的話也要從最後一次變換開始恢復。(Unity的預設變換順序是先縮放,再旋轉,最後平移)
三維空間下的旋轉
下圖分別給出了繞Z軸旋轉、X軸旋轉和Y軸旋轉的變換矩陣:
二維旋轉可以看作是繞著Z軸的特殊旋轉,因為Z軸保持不變。因此Rz(繞著Z軸的旋轉)可以直接在二維空間旋轉矩陣外的Z軸處填充1和0來使用,同理可得繞X軸的旋轉矩陣和Y軸的旋轉矩陣。
繞任意軸旋轉
在這其中,三個正交向量(相互垂直)可以構成一個旋轉矩陣,這樣就可以將點對映到新的座標系下。這個概念非常重要,因為在圖形學中常常需要這樣的變換,如把每個3D模型的頂點的法線從模型空間轉到剪裁空間(不同的座標系)再統一進行計算。
這個旋轉矩陣的逆只需要將XYZ軸換成u,v,w即可。
詳見羅德里格旋轉公式
下一篇筆記會寫更多關於三維空間下的矩陣變換。
參考資料
相關文章
- 基向量 變換矩陣矩陣
- OpenGL/OpenGL ES 入門:基礎變換 - 初識向量/矩陣矩陣
- pytorch基礎七(矩陣運算)PyTorch矩陣
- 3D數學基礎:矩陣的行列式3D矩陣
- Spark MLlib 核心基礎:向量 And 矩陣Spark矩陣
- 人工智慧數學基礎—-矩陣人工智慧矩陣
- 人工智慧數學基礎----矩陣人工智慧矩陣
- 【原創】開源Math.NET基礎數學類庫使用(02)矩陣向量計算矩陣
- python numpy基礎 陣列和向量計算Python陣列
- 基礎入門:深度學習矩陣運算的概念和程式碼實現深度學習矩陣
- 基礎|什麼是張量、資料立體、矩陣、向量和純數矩陣
- Unity開發中常用的基礎3D數學(向量,點乘,叉乘,矩陣,四元數,尤拉角)Unity3D點乘矩陣
- MATLAB(6)矩陣和向量運算Matlab矩陣
- NumPy 基礎 (二) - 陣列運算陣列
- 【scipy 基礎】--稀疏矩陣矩陣
- OpenGL 學習 07 向量 矩陣變換 投影矩陣
- 向量和矩陣的座標變換7矩陣
- 矩陣的乘法運算與css的3d變換(transform)矩陣CSS3DORM
- 社交網路分析的 R 基礎:(三)向量、矩陣與列表矩陣
- Java 基礎 之 算數運算子Java
- javascript基礎(算數運算子)(八)JavaScript
- 三維重建學習(1):基礎知識:旋轉矩陣與旋轉向量矩陣
- R語言矩陣基礎操作R語言矩陣
- Eigen教程(3)之矩陣和向量的運算矩陣
- Python基礎學習篇-2-數值運算和字串Python字串
- 05-JavaScript基礎-算數運算子JavaScript
- Javascript基礎:變數型別轉換JavaScript變數型別
- [shell基礎]——算術運算
- 【scipy 基礎】--傅立葉變換
- [shell基礎]——變數變數
- Go基礎系列:常量和變數Go變數
- 【C基礎】整形提升與算數轉換
- 面試-JS基礎知識-變數型別和計算面試JS變數型別
- 數學基礎
- 計算機基礎:位運算計算機
- Java基礎-基礎語法-變數與常量Java變數
- [.net 物件導向程式設計基礎] (5) 基礎中的基礎——變數和常量物件程式設計變數
- 零基礎學習 Python 之數字與運算Python