/*
從前學線代的時候沒認真,現在回過頭再看看吧。
學習書籍的名字:OpenGL圖形開發快速入門。機械工業出版社,楊柏林編寫。
*/
一.OpenGL全稱爲:OpenGraphics Library,開放式圖形庫,爲開發人員提供了圖形硬件接口,是一個底層的3d圖形函數庫,跨平臺,兼容主流操作系統。
一.數學相關
a) 點
i. 就是傳統的橫軸x、縱軸y的座標系,(x,y),
ii. 兩點座標公式P1P2 = 根號下(兩點x之差的平方+兩點y之差的平方),3d場景同樣適用,加個y。
·
iii. OpenGL採用右手座標系。
在空間直角座標系中,讓右手拇指指向x軸的正方向,食指指向y軸的正方向,如果中指能指向z軸的正方向,則稱這個座標系爲右手直角座標系.
b) 向量
1. 向量的大小
向量既有方向又有大小,。我們計算向量的大小就是求響亮的長度或者模。我們可以吧向量n的長度記做: |N|。在3d空間該數值的計算如下:
|N| = 根號下(三個N的x、y、z三個方向分量的平方和)
2. 向量的歸一化
有很多向量,我們只關心他的方向而不關心大小,比如求某個平面的法線方向,這種情況下,使用單位向量就很方便。單位向量就是大小爲1的向量,我們稱其爲標準化向量。
求一個向量的單位向量的過程,叫做向量的歸一化,運算法則:(圖)
V= V/|V|
3. 向量的加法和減法
可以向對標量一樣,對向量進行數學運算。但是要求是參與運算的向量維度都是一樣的,即都是一維、二位、或者三維等。向量加法就是將兩個向量的各自分量相加就可以了,比如向量A+向量B,得到向量C:
(Ax+Bx,Ay+By,Az+Bz)
兩個向量相減也是一樣,直接分量相減:
(Ax-Bx,Ay-By,Az-Bz)
4 . 向量與標量的乘法運算
雖然向量和標量不能加減,但是可以相乘,結果得到一個向量,他與原向量平行,長度不同或者方向相反。例如,用標量2乘以一個向量,結果爲一個向量,其方向與向量N的方向一致,其長度變爲原來的2倍。相似的用-1乘以一個向量,得到的結果向量大小和原向量相等,方向相反。
5. 點乘運算
向量和向量相乘有兩種不同的類型,在這裏我們首先介紹: 點乘(也叫作內積).
術語點乘來自於:a·b 中的點,標量乘法可以省略點號,但是向量乘法運算不可以省略。
向量點乘就是對應分量乘積的和,結果是一個標量,比如在2d和3d中的運算公式爲:
A·B = AxBx + AyBy
A·B = AxBx + AyBy + AzBz
一般來說,點乘的結果描述了兩個向量的“相似程度”,結果越大兩個向量越相近。點乘等於向量大小與向量夾角的餘弦值的積:
A·B = |A| |B| cosα(應該是希特)
由上面兩個可知,兩個向量之間的夾角:
cosα = A·B / |A| |B|
這就明顯簡化了性質:
A·B =0,說明A和B之間的夾角爲90度
A·B> 0,說明A和B之間的夾角小於90度
A·B< 0,說明A和B之間的夾角大於90度
6. 叉乘運算
另一種向量乘法乘坐叉乘或叉積。叉乘僅可用於3D場景,和點乘不一樣的是,叉乘得到的是一個向量。AxB = -(BxA),任意兩個3d向量都可以確定一個平面。
AxB的另一個公式:
AxB=(AyBz-AzBy,AzBx-AxBz,AxBy-Ay,Bx)
c) 矩陣
矩陣是3d數學的重要基礎,在這裏討論矩陣的性質和運算。
我們用m x n定義一個矩陣,他表示該矩陣m行n列。
兩種特殊矩陣:
1. 方陣和對角矩陣
§ 行數和列數相同的矩陣稱作方陣
§ 除了左上角到右下角都是0的,稱這種矩陣爲對角矩陣。例如
【
1 0 0
0 -3 0
0 0 2】
2. 單位矩陣:
單位矩陣是一種特殊的對角矩陣。他是nxn的矩陣,對角元素爲1。
{
1 0 0
0 1 0
0 0 1
}
如果用一個矩陣和單位矩陣相乘,結果還是原來的矩陣。
3. 矩陣的加法和減法:
前提是:確定參加運算的矩陣具有相同的階數,否則運算無法進行。
然後,將對應位置上的的元素進行相加減,其結果作爲結果矩陣在該位置上的值。
4. 矩陣的乘法運算分爲三種:
標量和矩陣相乘
標量k 和矩陣M相乘,其結果是一個和M維數相同的矩陣,其元素值爲k乘以M中的每一個元素。公式如下:
實例:
§ 向量和矩陣相乘
向量可以看作是一行或者是一列矩陣,因此向量可以和矩陣相乘。在這裏只有兩種情況是允許的,即行向量左乘矩陣時,結果是行向量;列向量右乘矩陣時,結果是列向量。其中行向量的列數要和矩陣的行數相等,列向量的行數要和矩陣的列數相等。
§ 矩陣和矩陣相乘
比如乘法AB
一、1)用A的第1行各個數與B的第1列各個數對應相乘後加起來,就是乘法結果中第1行第1列的數;
2)用A的第1行各個數與B的第2列各個數對應相乘後加起來,就是乘法結果中第1行第2列的數;
3)用A的第1行各個數與B的第3列各個數對應相乘後加起來,就是乘法結果中第1行第3列的數;
依次進行,
(直到)用A的第1行各個數與B的第末列各個數對應相乘後加起來,就是乘法結果中第1行第末列的的數,
二、1)用A的第2行各個數與B的第1列各個數對應相乘後加起來,就是乘法結果中第2行第1列的數;
2)用A的第2行各個數與B的第2列各個數對應相乘後加起來,就是乘法結果中第2行第2列的數;
3)用A的第2行各個數與B的第3列各個數對應相乘後加起來,就是乘法結果中第2行第3列的數;
依次進行,
(直到)用A的第2行各個數與B的第末列各個數對應相乘後加起來,就是乘法結果中第2行第末列的的數,
依次進行,
三、1)用A的第末行各個數與B的第1列各個數對應相乘後加起來,就是乘法結果中第末行第1列的數;
2)用A的第末行各個數與B的第2列各個數對應相乘後加起來,就是乘法結果中第末行第2列的數;
3)用A的第末行各個數與B的第3列各個數對應相乘後加起來,就是乘法結果中第末行第3列的數;
依次進行,
(直到)用A的第末行各個數與B的第末列各個數對應相乘後加起來,就是乘法結果中第末行第末列的的數.