https://blog.csdn.net/popy007/article/list/2?t=1& //向量計算相關文章html
https://wenku.baidu.com/view/abd34df7ec3a87c24128c455.html //3D圖形學本書的課件數組
向量沒有位置概念,只有方向和模[大小]概念。任何一個在直角座標軸上的份量爲(x,y)的向量都相等。好比上圖中的每一個向量都表示爲(-2,1)。
向量加法份量表示:a+b=(xa,ya)+(xb,yb)=(xa+xb,ya+yb)
向量減法份量表示:a-b=(xa,ya)-(xb,yb)=(xa-xb,ya-yb)緩存
a(x,y)的單位向量爲a/|a|,即(x,y)/sqrt(x^2 + y^2)。app
//向量先單位化向量,再進行計算,由於向量還有方向性,否則會破壞方向性
//Debug.DrawLine(new Vector3(1, 0.5f, 0), new Vector3(1, 2, 0) * 2, Color.black, 5);
//Debug.DrawLine(new Vector3(1, 0.5f, 0), new Vector3(1, 2, 0), Color.yellow, 5);函數
應用:導彈追蹤Demo工具
1.求與一個向量正交的另外一個向量:測試
任給一個非零向量(x,y),則它相對座標軸逆時針轉90度的正交向量爲(-y,x),順時針轉90度的正交向量爲(y,-x)。法線向量。優化
2. 計算一個向量b與另外一向量a共線的兩個相反的投影向量:url
一、任給一個非零向量(x,y),則它相對座標軸逆時針轉90度的垂直向量爲(-y,x),順時針轉90度垂直向量爲(y,-x)。
圖2中,障礙物的向量是兩個點相減獲得的。
3.使用向量進行障礙檢測的原理 [兩條線段是否相交]
一個解線性方程組的有力工具 --- 克蘭姆(Cramer)法則
線性方程組的定義:
舉着例子:
係數行列式:
https://max.book118.com/html/2017/0328/97598295.shtm
常數項:
3.深刻研究
2-D障礙碰撞檢測的實質就是判斷兩條線段是否有交點,注意不是直線,是線段。如今從向量的角度,寫出兩條線段的方程。
如今有v1和v2兩條線段,則根據向量加法:
v1e = v1b + s*v1
v2e = v2b + t*v2
v1b和v2b分別是兩線段的一端。s,t是兩個參數,它們的範圍是[0.0,1.0],當s,t=0.0時,v1e=v1b,v2e=v2b;當s,t=1.0時,v1e和v2e分別是兩線段的另外一端。s,t取遍[0.0,1.0]則v1e和v2e取遍兩線段的每一點【就是線段v1和v2的長度】。
那麼咱們要判斷v1和v2有沒有交點,就讓v1e=v2e,看解出的s,t是否是在範圍內就能夠了:
s,t取遍[0.0,1.0]則v1e和v2e取遍兩線段的每一點【就是線段v1和v2的長度】,假設相交則==》此時v1e 和v2e重合共線【v1e =v2e】
v1e = v2e
=> v1b + s*v1 = v2b + t*v2
移位後=> s*v1 - t*v2 = v2b - v1b
寫成份量形式:
s*x_v1 - t*x_v2 = x_v2b - x_v1b
s*y_v1 - t*y_v2 = y_v2b - y_v1b
如今是兩個方程式,兩個未知數,則根據Cramer法則:v1(4,1) v2(2,3)
| x_v1 -x_v2 | | 4.0 -2.0 |
d = | y_v1 -y_v2 | = | 1.0 -3.0 | = -10.0
| x_v2b-x_v1b -x_v2 | | 5.0 -2.0 |
d1 = | y_v2b-y_v1b -y_v2 | = | 2.0 -3.0 | = -11.0
s = d1/d = -11.0/-10.0 = 1.1 > 1.0
如今s已經計算出來,沒有在[0.0,1.0]內,因此兩線段沒有交點,從圖上看很直觀。t沒有必要再計算了。因此是物體與障礙沒有發生碰撞。若是計算出的s,t都在[0.0,1.0]內,則把它們帶入原方程組,計算出v1e或者v2e,它的份量就是碰撞點的份量。
<1. 慣性座標系:
慣性座標系的原點和物體座標系的原點重合,可是軸和世界座標系的軸平行。
從物體座標系轉到慣性座標系只須要旋轉,可是從慣性座標系到世界座標系須要平移。
<2. 嵌套座標系
子物體,父物體
一:矩陣的介紹
方陣 :行數和列數相同的矩陣叫作方陣。
方陣的對角線元素:方陣中行號 和 列號相同的元素。m11 m22 m33 ,其餘元素均爲非對角線元素。
對角矩陣 :除正對角線外,其餘元素(非對角線元素)都爲0,就是對角矩陣。
單位矩陣:知足對角矩陣的前提下,對角線元素爲1,其餘元素爲0
正交矩陣: 轉置矩陣和原矩陣的乘積若是等於單位,則A稱爲正交矩陣。
轉置矩陣:行列互換
Mij的轉置矩陣表示
注意:對於向量來講,把行向量變成列向量,列向量變成行向量。
轉置矩陣的引理:
二:矩陣的計算
矩陣和矩陣的乘法 :
1.和標量相乘,則和矩陣的每一項分別相乘。
2.矩陣和矩陣相乘:r*n矩陣A乘以 n*c矩陣B,結果是r*c矩陣,記做矩陣C. A和B矩陣的n必須一致才能相乘。
記憶方法1:
矩陣C的任意元素Cij等於A的i行向量和B的j列向量的相乘的結果再相加。
記憶方法2:讓A的行和B的列在C中對齊,相乘。
矩陣乘法不知足交換律,
知足結合律(包括和向量的相乘),
矩陣乘積求轉置,至關於分別求轉置,再交換順序相乘.
矩陣是怎麼變換向量的:
行向量左乘,列向量右乘
通常使用行向量: 書寫方便 Direct中使用的是行向量
p,g,r是x,y,z三個軸的單位向量【基向量】。則線性變換後 v=xp+yq+zr;
向量矩陣變換後:把矩陣解釋爲基向量集合,則M矩陣將a轉換到b
7.2.2 矩陣的形式
思考怎麼構建一個矩陣來作特定的3D轉換??
上圖看出矩陣的每一行,均可以理解爲轉換後的基向量,即矩陣的行向量就是變換後的基向量【對理解矩陣的構建頗有幫助】。有反向構建矩陣的可能,給出指望的變換【旋轉,縮放...】咱們所作的是計算基向量的變換,而且把這個變換填入矩陣。
如圖把基向量轉換爲q p處,則經過矩陣
M | 2 1|
|-1 2|
可見不只旋轉了座標系,並且還拉伸了它。
知道指望的變換,來構建旋轉矩陣的思想:
把基向量的x份量,即【1,0】*M=【2,1】==》M是2*1的矩陣,且旋轉到P[2,1] ==》
8.1 變換物體與變換座標系
效果是等價的,可是變換物體,須要變換的物體的物體的頂點數比較多。
2D中的旋轉
旋轉矩陣 :【三角函數】
矩陣的每一行,均可以理解爲轉換後的基向量,即矩陣的行向量就是變換後的基向量。
3D中的旋轉
因爲不考慮平移,這些直線和平面必須過原點
(1) 斷定旋轉方向【左手】: 必定是大拇指 指向 旋轉軸【若是繞x軸旋轉,則x就是旋轉軸】的正方向,四指彎曲就是旋轉方向,這種手勢下,四指彎曲的方向就是旋轉的正方向。這個很重要,由於要根據這個判斷旋轉矩陣元素是否爲負。
下圖是數學上的叉乘右手的,可是Unity使用的是左手座標系。
(2) 繞哪一個軸旋轉,就從這個軸的箭頭處向下看,把3D座標化簡成2D座標。
(3) 再利用左手座標系【unity中就是左手座標系】,大拇指,食指,中指表明 x,y,z軸,判斷出旋轉矩陣中哪一個數是負的。
【下圖中: 若是繞x軸,則x的值不變,y軸的向量旋轉後x不變,y和z都在座標軸的正方向,則都爲正。z軸的向量旋轉後,x不變、y旋轉到y的負方向、z在z的正方向】
下圖繞x軸旋轉-22度:下圖中畫的就是旋轉方向 。
8.2.3 3D中繞任意軸的旋轉——矩陣的推導。
8.3 沿座標軸的3D縮放矩陣
沿任意方向縮放推到:比較複雜
8.4 正交投影
向某一個軸投影
因爲不考慮平移,這些直線和平面必須過原點
8.4.2 向任意直線投影
8.5 鏡像
8.6 切變
8.7 變換的組合
8.8 變換分類
<1. 線性變換:
<2. 仿射變換:
仿射變換是指線性變換後接着平移,線性變化是仿射變換的子集。
<3. 可逆變換
除了映射變換外,其餘的線性變換都是可逆的。即乘以變換矩陣的逆矩陣。若是矩陣是奇異的,則變換不可逆。可逆矩陣的行列式不爲0.若行列式等於0,則是奇異矩陣,奇異矩陣沒有逆。
<4. 等角變換
變換先後兩個向量夾角的大小和兩個向量的方向都不發生改變。
<5. 正交變換
基本思想是軸保持互相垂直,並且不進行縮放變換。
<6. 剛體變換
只改變物體的位置和方向,不包括形狀,長度,角度,面積。【鏡像並不認爲是剛體變換】
小結:變換關係對應表
具體步驟:主對角線相乘的和減去次對角線相乘的和,就等於行列式
方陣M的行列式記做 | M | ,非方陣矩陣的行列式是未定義的。
<1. 求2*2方陣的行列式 記憶規則:
把主對角線的元素相乘,再把反對角線的元素相乘,再相減。
<2. 求3-3方陣的行列式 的記憶規則
把3*3矩陣的行向量解釋成向量:
<3. 求餘子式:
<4. 求代數餘子式
注意: 餘子式是一個矩陣,而代數餘子式是一個標量。
例如:選了第一行,每一個元素乘以對於的代數餘子式【即除去該元素對於的行列元素剩下的元素】。
m11對應的代數餘子式爲正,M12對應的代數餘子式爲負.....。項號相加爲正則代數餘子式爲正,不然爲負數。
<4.1. 使用代數餘子式計算 n*n矩陣的行列式: 行列式在矩陣求逆和是否可逆時用到
==》
求代數餘子式==》使用求餘子式公式化簡==》展開提取公因式【中文版的化簡結果有誤,給出英文版】==》結果
<5. 行列式的一些性質:
矩陣積的行列式等於行列式的積。
<6. 行列式的幾何意義:
2D中行列式表示以基向量爲兩邊的平行四邊形的有符號面積。基向量是不一樣面上過原點的向量。
3D:
方陣的逆
矩陣求逆:
矩陣求逆 步驟: 求代數餘子式矩陣,再求代數餘子式矩陣的轉置矩陣,逆矩陣 = 標準伴隨矩陣 / 行列式
<1. 並不是全部矩陣都有逆。eg:若矩陣M中的某一行或者某一列的元素都是0,乘以任意矩陣V,則結果都是一個零矩陣。
可逆矩陣(非奇異矩陣) == 行列式不等於0
不可逆矩陣(奇異矩陣) == 行列式等於0 行列式是否等於0判斷可逆
標準伴隨矩陣:
具體步驟: 求代數餘子式矩陣,再求代數餘子式矩陣的轉置矩陣
M的標準伴隨矩陣就是 M的代數餘子式矩陣的轉置矩陣。
例如:
矩陣M
1. ==》
2. ==》M的標準伴隨矩陣就是代數餘子式矩陣的轉置
3.==》矩陣的逆矩陣 標準伴隨矩陣 / 行列式
逆矩陣的幾何意義:
撤銷變換回到原變化。
若是方陣M是正交的,當且僅當M乘以它的轉置M(t)矩陣等於單位矩陣【也可用因而否是正交矩陣的判斷,矩陣中全部元素足夠接近正交矩陣的容許的範圍內就行】。
矩陣乘以它的逆矩陣等於單位矩陣,也能夠用於判斷矩陣是不是正交矩陣。
==》則正交矩陣的 轉置矩陣=它的逆矩陣。因此在知道矩陣是正交的,則避免計算逆矩陣【例如旋轉和鏡像】。
正交矩陣的性質:
假設:
==》
==》
==》M乘轉置後
由於:點積 ab=|a||b|cos@
只有一個向量是單位向量時,則它與它自身的乘積是1.==》r1 r2 r3是單位向量 【三個行向量】
只有兩個向量互相垂直時,它們的點積爲0。
==》
若一個矩陣時正交的,則每一行和列都是單位向量,且矩陣的全部行互相垂直
注意點:若是一組向量互相垂直,則這組向量被認爲是正交基。若是向量都是是單位向量,
則就是標準正交基。正交矩陣就是標準正交基。
矩陣正交化:
因爲壞數據或者浮點數運算的累計錯誤稱爲矩陣爬行。這個時候須要進行矩陣正交化,獲得一個正交矩陣,儘可能和原矩陣相同。
施密特正交化
4x4齊次空間
齊次座標投影到2D中w=1的平面上,(x/w,y/w).
4x4平移矩陣
由於3x3矩陣表示的是線性變換,不包含平移。因此擴展成4x4矩陣。
在4D中用矩陣乘法表示平移:
w=1 4D點表示把4D點投影到這個w平面上 實際的3D點被認爲是在4D中的w=1的「平面」上。
w=0 4D點表示「無限遠點」,描述一個向量而不是一個位置。
行向量和矩陣乘法時左乘。
例如: 4D中一個無窮遠點,乘以一個由便準3x3變換矩陣擴展成的4x4矩陣(不包含平移)
==》結果任然是一個無窮遠點==》w份量能開關4x4矩陣的平移部分。
爲什麼不取掉最後一列,直接用4x3矩陣,緣由以下:
例子: 對4x4 矩陣M求逆矩陣:
==》
==》逆矩陣的幾何意義是撤銷原來的變化,則對於平移矩陣T就是相反變換。再求出R的逆矩陣
9.4.3 通常的仿射變換
如今有了4x4矩陣,能夠構造包含平移在內的通常仿射變換矩陣了,例如:
大概步驟:
先把變換的」中心點「平移到原點,在利用以前的技術進行線性變換,再將中心點平移到原來的位置。
例如:
平移只改變了最後一行。
9.4.4 透視投影
w值有意義的4D座標
3D中的透視投影任然是投影到2D平面上,可是,投影線再也不平行。相交於一點,這個點就是投影中心。
由於投影中心在投影到平面的前邊,因此看到的圖像時反轉的。
9.4.5 小孔成像
點P向z=-d平面投影
==》
==》
因爲投影平面在投影點的後邊,因此是負的。計算比較複雜,
計算機計算中能夠不用管投影面,即把投影面移到投影點的前邊,去掉煩人的負號。下圖:
==》4D形式爲
計算投影到投影面的點的3D座標
步驟:構建投影矩陣,轉換點到投影點,除以同源座標,獲得投影面上的投影點。
例如:
由於 若是把單個點p(x,y,z) 向x=5的平面投影,即w=x/5 則4D形式爲 【x y z x/5】
根據上邊構建的投影矩陣,計算點(107,-243,89)【有限遠,w=1】在x=5平面上的投影點的3D座標?
先計算投影后的點 ==》
除以同源座標獲得3維物理座標==》
方位是相對於已知方位(一般稱爲單位方位或者源方位)的旋轉來描述的。旋轉的量是角位移。
10.3 歐拉角
10.4.1 四元數
一個四元數包含一個標量份量和一個向量份量
Quaternion類
射線:
p0=p(0); //p0指定了射線的位置信息
p(1)=p0+td // dt: 增量向量,指定了射線的長度和方向 d是單位向量
t: 0~L //變換範圍,即射線的長度
直線:
ax+by=d
d: 是原點到直線的有符號距離,若是直線和n在原點的同一側,則爲正
圖元的隱式表示法:
f(x,y,z) =
一個變量的函數是單變量的 是一條曲線。
直線的表示:p是直線上的任意一點。若是隻給一個點的座標,表示成向量,則表示過原點的向量。
<1. 用垂直向量到原點的距離定義直線。若是點 p 是 n 方向上的投影等於距離d。d是過原點垂直於直線的線段。
<2. 用斜率來表示
<3. <4.
球和圓
隱式表示: ||p-c||=r // c球心 p球上一點 r 半徑
||
軸對齊矩形邊界框:
AABB: 軸對齊矩形邊界框【把物體框起來的框】 OBB方向矩形邊界框
應用:
使用矩形判斷相交,須要判斷。則矩形框A和矩形框B,中心點到邊的距離和中的點在頂點的距離,分別另外一個矩形框的這兩個參數比較
邊界球:
用於相交性測試,車的邊界球和AABB.以下:
12.5 平面
平面方程能夠用公式表示 :
平面的隱式向量記法:
對公式2進行證實:
p*n=d ==》
==》 n*p=d n*q=d
==》n*p = n*q
==》n*(p-q)=0
==》n垂直於(p-q)向量,則n垂直於平面上任意向量。
知道三個點的座標,求平面方程:
《1. n(p-q)=0 ==》法向量
《2. n*p=d ==》 d
《3. ax+by+cz=d ==》 平面方程
判斷點在平面的前邊仍是後邊?
很簡單,把這個點代入 平面的方程,f(x,y,z)=0;
若是f(x,y,z)>0,則在前面
若是f(x,y,z)<0,則在後面
若是f(x,y,z)>=0,則在平面上
判斷點到面的距離?或者平面上的最近點
《1. 找出從該點出發的平面的任意一條線段對應的向量。
《2. 求出該平面的法向量
《3. 斜線段對應的向量和這個面的法向量作點乘,就是斜線斷的在該面的投影,即距離。
12.5 點到片面的距離
==》由於p*n=d 是平面方程,n*n=1
12.6 三角形和三角形網格
三角形:左手座標系中,常常從「正面」看時,常常以順時針方向列出的。v1 v2 v3
<1.海倫公式: S = 三邊長度之和 / 2 =(L1+L2+L 3)/2
<2. 知道每條邊的座標:
對三角形三變得每一邊,分別計算每條邊和下x軸組成的梯形的有符號面積,有符號面積是邊的端點是從左到右,面積爲正,邊是從右到左,則右到左爲負數。
==》無論三角形在x的哪一邊,都知足:
==》2D中頂點座標計算三角形有符號面積:
<3. 平行四邊形法:
兩邊向量e1,e2叉乘的大小【角度能夠點乘獲得】就是這兩邊組成的平行四邊形的面積==》三角形面積等於平行四邊形面積的一半=》
計算重心座標:
<5. 簡單多邊形使用扇形分解算法計算。
若是知道每一個點的座標或者邊的向量,則能夠求出面積,結合海倫公式。
12.7 多邊形
簡單多邊形和複雜多邊形
有洞的複雜多邊形能夠經過接縫分割成簡單多邊形。
凸多邊形:
性質:
<1.任意兩個頂點的連線包含在多邊形中。
<2. 一個沿着凸多邊形移動時,在每一個頂點的轉向都是相同的。
<3. n個頂點的凸多邊形,均可以分解成(n-2)個三角形,即內角和爲(n-2)*180度,也能夠反證該多邊形位凸多邊形.
<4. 對於一個封閉的凸多邊形,所有補角之和爲360度。
判斷點在三角形內:
方法一: 內角和法或者面積法
【任意多邊形均可或者分割後的面積相等】:三條線段與三角形各邊的夾角,若是全部夾角之和爲180度,那麼點P在三角形內,不然不在。
方法二: 同向法【對於凸多邊形來講】
假設點P位於三角形內,會有這樣一個規律,當咱們沿着ABCA的方向在三條邊上行走時,你會發現點P始終位於邊AB,BC和CA的右側。 算出AP分別在三條邊的同側。
使用叉乘計算方位:
判斷圖中有幾個三角形:
須要解決三角形個數問題時,按照點線規則構建相應的二維數組便可:
找出下圖中有多少個三角形:
http://www.javashuo.com/article/p-aaccqvte-hg.html
<1. 給每一個頂點標序號,給每條線標序號。【對於n條線相交的,則先深度搜索點和線的關係】
再構建一個二維數組,以每一個點爲一維,元素是通過該點的線序號;
遍歷全部三點的全部組合,判斷可否組成三角形,判斷條件爲:三點兩兩共線且三點不共線。
三點兩兩共線且三點不共線 【若是知道座標的話, 可使用向量點乘】
Arrays.binarySearch(a,key); a - 要搜索的數組 key - 要搜索的值 若是包含在數組中,返回搜索鍵的索引;不然返回 ( - 1)
A{ 1, 2, 3, 4 }, B{ 1, 5 }, B中每一個元素是否在A中。能夠看出1 1共線。
凹多邊形:
至少有一個凹點的多邊形。
13.3 平面上的最近點:
平面外一點p,和平面內任意一條直線的連線的直線,求該直線的在平面上的投影【點乘】,即最近線段和最近點。
13.4 圓和球上的最近點
13.6 相交線檢測【好比碰撞檢測】
靜態測試
動態測試
例如:兩條直線的隱式方程,交點的座標是(x,y)
==》看同時知足兩條線性方程的點的個數
13.8 在3D中兩條射線相交性檢測
假設射線是無限延伸的
共面時的相交
不共面時的相交
若是兩條射線平行或者重合,則分母點乘爲0. 不然 能夠判斷r1(t1) r2(t2)是相聚最近的點,再經過距離能夠判斷射線是否相交。
==》
可是若是射線的長度有限,則還應該作邊界檢測。
總結:能夠用於 給出兩條射線求最近點,和判斷射線是否相交。
13.9 射線和平面的相交性檢測
13.11 三個平面的相交性檢測
任意平面平行,則交點就不存在,分母爲0
13.12 射線和圓/球的相交線檢測 p271//避開障礙物時,須要判斷射線與球的相交性問題
判斷射線L和此球是否相交:
t的變化長度是0~L,判斷t是否有解。
圓心c,半徑r,d是單位向量,t從0變化到L【t爲交點】,L爲射線長度,所要求的是交點t的值。
0t的長度:
向量e:
根據小三角形中:
大三角形:
==》代入
==》由於f=a-t
==》若是根號下值
==》若是
此外不一樣的測試則有不一樣的行爲。
<1 . 假設是相交的:
<2 . 創建方程組求解:
假設P是直線上和球的交點=>
P=A+tB; //直線上任何一點的表示方法
|P-C|平方=R平方
==》解二次方程組,求解便可
解二次方程組便可。
13.13 兩個圓或者球的相交性檢測
靜態的:
靜態的直接用兩個圓的半徑之和來判斷
動態的:
假設一個球是靜止的,組合向量,d=d2-d1,計算t的解的個數:【此處t是距離,也能夠計算出時間】
使用二次方程判斷根 的公式:
較小的值是兩個球接觸時的t,較大的值時兩個球脫離時的t值
13.15 球和平面的相交性檢測
方法: 計算球心到平面的距離d,d<r,則相交。
14.1.1 索引三角形網格
程序結構:
優化:大多數圖形卡不能支持提交索引三角形網,通常是三個頂點同時提交,這樣共享頂點會屢次提交,三角形用到一次就提交一次。內存和圖像硬件的交互數據傳輸是瓶頸。因此許多Api支持三角形網格式以減小傳輸量, 基本思想是排序點和麪,使得已有的三角形不須要傳輸。
最高到最底優化方案:頂點緩存,三角帶 三角扇
14.1.4 頂點緩存:
API和硬件之間的一種傳輸策略。
14.1.5 優化三角帶
三角帶可用(n+2)個頂點存儲n個面。
減小三角帶數目:
由於分別渲染兩個長爲n的三角帶所需的時間大於渲染一個長爲2n的三角帶。所以使用退化三角形【面積爲0】鏈接多個三角帶。
從而須要將整個網格置於一個連續的三角帶中。
退化三角形【面積爲0,無需渲染,不會影響效率】
上圖包含了四個退化三角形,頂點7-8邊是包含了兩個退化三角形。發送給GPU時7-8邊不發送。符合連續頂點表示一個三角形的約定。
發送:
14.1.6 三角扇
三角帶和三角扇都是用(n+2)個頂點存儲n個面。 靈活度低,視狀況來用。
14.2 額外信息
三角網可在三角形或着頂點級保存額外信息
14.2.1 紋理映射
一般在頂點保存紋理座標
14.2.2 表面法向量
14.4.2 焊接頂點
刪除其他的一個,剩一個。去除多餘頂點。節省內存
14.4.3 面拆分
14.4.4