OpenGL(六) OpenGL中的向量與矩陣

向量

在高中時(shí)期,其實(shí)大家就已經(jīng)學(xué)過向量的相關(guān)知識(shí)了,這兒我們?cè)購(gòu)?fù)習(xí)一遍。

什么是向量?

在數(shù)學(xué)中,向量(也稱為歐幾里得向量、幾何向量、矢量),指具有大?。╩agnitude)和方向的量。

在 3D 笛卡爾坐標(biāo)系, 基本上一個(gè)頂點(diǎn)就是XYZ坐標(biāo)空間上的?一個(gè)位置. ?而在空間中給定的一個(gè)位置恰恰是由?個(gè)單獨(dú)的XYZ定義的而這這樣的XYZ就是向量。

image.png

向量長(zhǎng)度計(jì)算

向量長(zhǎng)度通過下列公式計(jì)算:


image.png

單位向量

單位向量是長(zhǎng)度為1的向量。

如果一個(gè)向量不是單位向量,可以通過單位化將其轉(zhuǎn)化為單位向量,即非零向量除以向量的模。

image.png

向量點(diǎn)乘

  • 向量點(diǎn)乘只能發(fā)生在兩個(gè)向量之間,且點(diǎn)乘時(shí),兩向量必須是單位向量,如果不是,需要將向量進(jìn)行單位化后,再點(diǎn)乘
  • 點(diǎn)乘得到的是兩個(gè)向量之間的夾角的余弦值 即 cosα,范圍在[-1, 1]之間,是一個(gè)標(biāo)量


    image.png
  • OpenGL中提供了關(guān)于向量點(diǎn)乘的API:
// m3dDotProduct3 函數(shù)獲得2個(gè)向量量之間的點(diǎn)乘結(jié)果;
float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);
// m3dGetAngleBetweenVector3 即可獲取2個(gè)向量之間夾?角的弧度值; 
float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v);

向量叉乘

  • 兩個(gè)向量之間叉乘得到結(jié)果同樣是一個(gè)向量,且該向量垂直于兩個(gè)向量所構(gòu)成的平面
  • 由于結(jié)果與兩向量構(gòu)成平面垂直,也可以理解為得到的結(jié)果是該平面的法線


    image.png
  • OpenGL中提供了關(guān)于向量叉乘的API:
// m3dCrossProduct3 函數(shù)獲得2個(gè)向量量之間的叉乘結(jié)果得到一個(gè)新的向量量
void m3dCrossProduct3(M3DVector3f result,const M3DVector3f  u ,const M3DVector3f v);

矩陣

假設(shè),在空間有?個(gè)點(diǎn),使?xyz描述它的位置。此時(shí)讓其圍繞任意位置旋轉(zhuǎn)?定?度后,我們需要知道這個(gè)點(diǎn)的新的位置,此時(shí)需要通過矩陣進(jìn)?計(jì)算。因?yàn)樾碌奈恢玫牟粏螁闻c原來的位置有關(guān),還和旋轉(zhuǎn)的參數(shù)有關(guān)。

矩陣分類

  • 行矩陣:一行一行讀取
  • 列矩陣:一列一列讀取

單元矩陣

image.png
  • 主對(duì)角線上數(shù)據(jù)都是1,其余元素都是0,即為單元矩陣
  • 向量 X 單元矩陣 = 向量 X 1,不會(huì)發(fā)生任何變化
  • 向量與單元矩陣相乘的前提是:向量的列數(shù) == 單元矩陣的行數(shù)

矩陣點(diǎn)乘

  • 矩陣可以進(jìn)行點(diǎn)乘的前提:兩個(gè)矩陣的行列數(shù)相等
  • 矩陣A · 矩陣B = 矩陣C
  • 規(guī)則: 矩陣A的第一個(gè)元素與矩陣B的第一個(gè)元素的乘積 = 矩陣C的第一個(gè)元素


    圖片來源于網(wǎng)絡(luò)

矩陣叉乘

  • 矩陣可以進(jìn)行叉乘的前提:第一個(gè)矩陣的列數(shù) = 第二個(gè)矩陣的行數(shù)
  • 矩陣A X 矩陣B = 矩陣C
  • 規(guī)則:矩陣A第一行與矩陣B第一列對(duì)應(yīng)元素乘積的綜合 = 矩陣C的第一個(gè)元素
圖片來源于網(wǎng)絡(luò)

OpenGL中的矩陣

  • 通過GLFloat定義一個(gè)一維數(shù)組
    image.png

    通過M3DMatrix44f創(chuàng)建一個(gè)單元矩陣
    image.png
  • 通過方法m3dLoadIdentity44f創(chuàng)建單元矩陣
void m3dLoadIdentity44f(M3DMatrix44f m);

矩陣圖解

  • OpenGL中,使用較多的矩陣都是一維數(shù)組創(chuàng)建的,且規(guī)定使用以列為主的矩陣排序
  • OpenGL中的矩陣都是4x4的,每一列都是由4個(gè)元素組成的向量
    1、第一列表示x軸方向
    2、第二列表示y軸方向
    3、第三列表示z軸方向
    4、第四列表示交換位置
    5、列向量進(jìn)行了特殊的標(biāo)注,表示這是以列為主的矩陣,主要體現(xiàn)為矩陣的最后一行都是0,只有最后一個(gè)元素為1


    image.png

矩陣相乘

數(shù)學(xué)角度中的矩陣相乘

數(shù)學(xué)中為了方便計(jì)算,都是以矩陣為標(biāo)準(zhǔn),從左到右的順序進(jìn)行計(jì)算,所以在數(shù)學(xué)中,頂點(diǎn)將以行向量的方式表示

從數(shù)學(xué)角度理解mvp矩陣的計(jì)算,由于頂點(diǎn)是行向量,要滿足矩陣相乘的規(guī)定條件(即 叉乘的前提),必須將mvp矩陣放在右邊

  • 變換后頂點(diǎn)向量 = V_local * M_model * M_view * M_pro
  • 變換后頂點(diǎn)向量 = 頂點(diǎn) * 模型矩陣 * 觀察矩陣 * 投影矩陣


    圖片來源于網(wǎng)絡(luò)
OpenGL角度中的矩陣相乘

OpenGL中的矩陣規(guī)定是以列為主,所以頂點(diǎn)以列向量的方式表示

從OpenGL角度理解mvp矩陣的計(jì)算,由于頂點(diǎn)是列向量,如果項(xiàng)進(jìn)行矩陣規(guī)則,就需要滿足矩陣相乘的條件,需要將mvp矩陣的順序顛倒為pvm

  • 變換頂點(diǎn)向量量 = M_pro * M_view * M_model * V_local
  • 變換頂點(diǎn)向量量 = 投影矩陣 * 視圖變換矩陣 * 模型矩陣 * 頂點(diǎn)


    圖片來源于網(wǎng)絡(luò)

OpenGL矩陣堆棧中矩陣相乘源碼分析

1

  • 從棧頂獲取棧頂矩陣 復(fù)制到 mTemp
  • 將棧頂矩陣 mTemp 左乘 mMatrix
  • 將結(jié)果放回棧頂空間?里里
圖片來源于網(wǎng)絡(luò)

2.

圖片來源于網(wǎng)絡(luò)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 向量 在3D笛卡爾坐標(biāo)系中,基本上一個(gè)頂點(diǎn)就是XYZ坐標(biāo)空間上的一個(gè)位置,而在空間中給定的一個(gè)位置恰恰是由一個(gè)單獨(dú)...
    阿木小丸子閱讀 1,859評(píng)論 1 1
  • 向量 1. 首先讓我們了解什么是標(biāo)量 標(biāo)量亦稱“無向量”。有些物理量,只具有數(shù)值大小,而沒有方向,部分有正負(fù)之分。...
    致青春_bf42閱讀 1,140評(píng)論 0 0
  • 向量 首先我們了解一下標(biāo)量和向量的區(qū)別: 標(biāo)量:只有大小的量,如,1、3、5;向量:有方向的標(biāo)量; 在 3D 笛卡...
    永遠(yuǎn)的Beyond52閱讀 697評(píng)論 0 0
  • 向量 了解向量之前,先了解什么是標(biāo)量 標(biāo)量:只有大小,例如:1,12,13等 向量是有方向的標(biāo)量,即不僅有大小,還...
    Style_月月閱讀 1,340評(píng)論 8 10
  • 一.向量 如圖: 在3D笛卡爾坐標(biāo)系中,A點(diǎn)在XYZ軸上對(duì)應(yīng)的位置分別為OC,OD,OB,在X軸上,我們用X(藍(lán)色...
    楓紫_6174閱讀 1,013評(píng)論 1 4

友情鏈接更多精彩內(nèi)容