3D數學基礎_圖形與遊戲開發

https://blog.csdn.net/popy007/article/list/2?t=1&  //向量計算相關文章html

https://www.baidu.com/link?url=48CwL-j6E_WG3nUxbBFVL9ejTlj8g-KfykMcBecP27EyuZ5YhLVktT5lT3MJ1ZTR48BdbODaCBKS2GMHSsI55T4YKwRz1_r-5MDQTWjDIaa&wd=&eqid=a068703d00428e9b000000065d0591f8     //3D圖形學答案  算法

 

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工具

public Transform player;
    public Transform missile;
    private Vector3 missileDir;    //導彈的速度向量
    public float missileRate=0.02f;
    private void Update()
    {
        missileDir = player.position - missile.position;
        missileDir = missileDir.normalized;

        Vector3 normalVec = Vector3.Cross(missileDir,missile.up);
        float vecAngle = Vector2.Angle(missileDir,missile.up);
        if (normalVec.z > 0)//順時針
        {
            missile.transform.Rotate(Vector3.forward, -vecAngle);//順時針轉
        }
        else if (normalVec.z < 0)
        {
            missile.transform.Rotate(Vector3.forward, vecAngle );//逆時針轉
        }

        missileDir *= missileRate;
        missile.position += missileDir;
    }

向量的應用

1.求與一個向量正交的另外一個向量:測試

任給一個非零向量(x,y),則它相對座標軸逆時針轉90度的正交向量爲(-y,x),順時針轉90度的正交向量爲(y,-x)。法線向量。優化

2. 計算一個向量b與另外一向量a共線的兩個相反的投影向量:url

一、任給一個非零向量(x,y),則它相對座標軸逆時針轉90度的垂直向量爲(-y,x),順時針轉90度垂直向量爲(y,-x)。

圖2中,障礙物的向量是兩個點相減獲得的。

3.使用向量進行障礙檢測的原理  [兩條線段是否相交]

一個解線性方程組的有力工具 --- 克蘭姆(Cramer)法則

線性方程組的定義:

若是線性方程組:

A11*X1 + A12*X2 + ... + A1n*Xn = b1
A21*X1 + A22*X2 + ... + A2n*Xn = b2
...................................
An1*X1 + An2*X2 + ... + Ann*Xn = bn

它的係數矩陣 A =
__               __
| A11 A12 ... A1n |
| A21 A22 ... A2n |
| ............... |
| An1 An2 ... Ann |
--               -- 

的行列式 |A| != 0 線性方程組有解,且解是惟一的,而且解能夠表示爲:

X1 = d1/d , X2 = d2/d , ... , Xn = dn/d (這就是/A/=d爲何不能爲零的緣由,不能作除數)

這裏d就是行列式/A/的值,dn(n=1,2,3...)是用線性方程組的常數項b1,b2,.,bn替換系數矩陣中的第n列的值獲得的矩陣的行列式的值,即:

常數項b1,b2,.bn替換矩陣中的第1列
     | b1 A12 ... A1n |
d1 = | b2 A22 ... A2n |
     | .............. |
     | bn An2 ... Ann |
常數項b1,b2,.bn替換矩陣中的第2列

     | A11 b1 ... A1n |
d2 = | A21 b2 ... A2n |
     | .............. |
     | An1 bn ... Ann | 

...
常數項b1,b2,.bn替換矩陣中的第n列
     | A11 A12 ... b1 |
dn = | A21 A22 ... b2 |
     | .............. |
     | An1 An2 ... bn |
---------------------

舉着例子:

係數行列式:

https://max.book118.com/html/2017/0328/97598295.shtm

常數項:

例如2-D線性方程組:

(1) 4.0*X1 + 2.0*X2 = 5.0
(2) 3.0*X1 + 3.0*X2 = 6.0

根據上面的Cramer法則:

d是係數行列數:

     | 4.0 2.0 |
 d = | 3.0 3.0 | = 4.0*3.0 - 2.0*3.0 = 6.0 (2階行列式的解法,'/'對角線相乘減去'/'對角線相乘)
常數項替換第1項,獲得矩陣行列式的值:

     | 5.0 2.0 |
d1 = | 6.0 3.0 | = 5.0*3.0 - 2.0*6.0 = 3.0
常數項替換第2項,獲得矩陣行列式的值:

     | 4.0 5.0 |
d2 = | 3.0 6.0 | = 4.0*6.0 - 5.0*3.0 = 9.0

則 

X1 = d1/d = 3.0/6.0 = 0.5
X2 = d2/d = 9.0/6.0 = 1.5   
---------------------

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的長度】。
那麼咱們要判斷v1v2有沒有交點,就讓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. 嵌套座標系

子物體,父物體

 

矩陣:

https://www.baidu.com/link?url=48CwL-j6E_WG3nUxbBFVL9ejTlj8g-KfykMcBecP27EyuZ5YhLVktT5lT3MJ1ZTR48BdbODaCBKS2GMHSsI55T4YKwRz1_r-5MDQTWjDIaa&wd=&eqid=a068703d00428e9b000000065d0591f8  //答案

一:矩陣的介紹

 方陣 :行數和列數相同的矩陣叫作方陣。

            方陣的對角線元素:方陣中行號 和 列號相同的元素。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轉換??

上圖看出矩陣的每一行,均可以理解爲轉換後的基向量,即矩陣的行向量就是變換後的基向量【對理解矩陣的構建頗有幫助】。有反向構建矩陣的可能,給出指望的變換【旋轉,縮放...】咱們所作的是計算基向量的變換,而且把這個變換填入矩陣。

​==》​==》​看出AB結果中的行向量確實是對A的基向量進行B變換的結果。

 

 

 

如圖把基向量轉換爲q p處,則經過矩陣

M | 2  1|

    |-1  2|   

可見不只旋轉了座標系,並且還拉伸了它。

知道指望的變換,來構建旋轉矩陣的思想:

把基向量的x份量,即【1,0】*M=【2,1】==》M是2*1的矩陣,且旋轉到P[2,1]  ==》

​矩陣表明的2D變換是: 提取基向量【0,1】【1,0】  順時針旋轉90度。

 

矩陣和線性變換

8.1 變換物體與變換座標系

效果是等價的,可是變換物體,須要變換的物體的物體的頂點數比較多。

8.2.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.==》矩陣的逆矩陣   標準伴隨矩陣 / 行列式

 

逆矩陣的幾何意義:

撤銷變換回到原變化。

 

9.3 正交矩陣

若是方陣M是正交的,當且僅當M乘以它的轉置M(t)矩陣等於單位矩陣【也可用因而否是正交矩陣的判斷,矩陣中全部元素足夠接近正交矩陣的容許的範圍內就行】。

矩陣乘以它的逆矩陣等於單位矩陣,也能夠用於判斷矩陣是不是正交矩陣。 

==》則正交矩陣的 轉置矩陣=它的逆矩陣。因此在知道矩陣是正交的,則避免計算逆矩陣【例如旋轉和鏡像】。

正交矩陣的性質:

假設:

==》

==》

==》M乘轉置後

由於:點積   ab=|a||b|cos@

只有一個向量是單位向量時,則它與它自身的乘積是1.==》r1  r2  r3是單位向量 【三個行向量】

只有兩個向量互相垂直時,它們的點積爲0。

==》

一個矩陣時正交的,則每一行和列都是單位向量,且矩陣的全部行互相垂直

注意點:若是一組向量互相垂直,則這組向量被認爲是正交基。若是向量都是是單位向量,

則就是標準正交基。正交矩陣就是標準正交基。

 

矩陣正交化:

因爲壞數據或者浮點數運算的累計錯誤稱爲矩陣爬行。這個時候須要進行矩陣正交化,獲得一個正交矩陣,儘可能和原矩陣相同。

施密特正交化

 

 

 

 

9.4x4齊次矩陣

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平面投影

==》   ​   

 ==》  ​   ==》 

因爲投影平面在投影點的後邊,因此是負的。計算比較複雜,

計算機計算中能夠不用管投影面,即把投影面移到投影點的前邊,去掉煩人的負號。下圖:

​     ==》   ​    ==》w=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章 3D中的方位與角位移

方位是相對於已知方位(一般稱爲單位方位或者源方位)的旋轉來描述的。旋轉的量是角位移。

 

10.3 歐拉角

10.4.1 四元數

一個四元數包含一個標量份量和一個向量份量   

Quaternion類

 

12章 幾何圖元

射線:

p0=p(0);      //p0指定了射線的位置信息

p(1)=p0+td   //  dt: 增量向量,指定了射線的長度和方向  d是單位向量

t:  0~L   //變換範圍,即射線的長度

直線:

ax+by=d

d: 是原點到直線的有符號距離,若是直線和n在原點的同一側,則爲正

 

圖元的隱式表示法: 

f(x,y,z) = ​函數,咱們可以隱式表示一個圖元。若是點在這個圖元【中心再原點的圖元】上,則這個函數爲真,不然爲false.

一個變量的函數是單變量的 是一條曲線。

 

直線的表示:p是直線上的任意一點。若是隻給一個點的座標,表示成向量,則表示過原點的向量。

<1.  用垂直向量到原點的距離定義直線。若是點 是 方向上的投影等於距離d。d是過原點垂直於直線的線段。

<2. 用斜率來表示

 

<3.  <4.  

球和圓

隱式表示: ||p-c||=r  //  c球心  p球上一點  r 半徑   

||​向量的長度

軸對齊矩形邊界框:

AABB: 軸對齊矩形邊界框【把物體框起來的框】  OBB方向矩形邊界框   

應用: 

使用矩形判斷相交,須要判斷。則矩形框A和矩形框B,中心點到邊的距離和中的點在頂點的距離,分別另外一個矩形框的這兩個參數比較

邊界球:

用於相交性測試,車的邊界球和AABB.以下: 

12.5 平面

平面方程能夠用公式表示  :

 

平面的隱式向量記法:

對公式2進行證實:

​,向量n是法向量,設p,q都在平面上,知足方程

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 章 幾何檢測

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的長度:  ​  t=a-f0

向量e: ​,將e投影到d上,這個向量的長度爲a,計算公式 a=e*d.

根據小三角形中:

大三角形:

==》代入​==》

==》由於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章 三角網格

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 

 

 

15 章 圖形數學

相關文章
相關標籤/搜索