电竞比分网-中国电竞赛事及体育赛事平台

分享

ModelView矩陣的含義和應(yīng)用(轉(zhuǎn) linghuye's blog)

 昵稱12278894 2014-09-23

設(shè)OpenGL的鏡頭坐標系的三個軸為(R,U,N),這里的R,U,N的數(shù)值表達在世界坐標系上,表達為*行*向量.則OpenGL用gluLookAt建立的ViewMatrix為:
  R
( U ). 即ViewMatrix的第一行為R,第二行為U,第三行為-N. 
 -N 
假設(shè)當前的ModelMatrix為單位矩陣,當我們使用glGetFloatv(GL_MODELVIEW_MATRIX, &mat),即取回ViewMatrix,然后將上述規(guī)則與mat進行比對,發(fā)現(xiàn),mat的第一列是R,第二列是U,第三列是-N.

這是因為OpenGL使用該死的列存儲方式,而上述規(guī)則使用行存儲方式表達.行存儲或列存儲完全是計算機中數(shù)組的內(nèi)存的行優(yōu)先或列優(yōu)先的排布問題(怎么會有人習慣列優(yōu)先存儲這種變態(tài)的思維),與空間數(shù)學(xué)概念(如列向量,行向量)無關(guān).

在大多公告板實現(xiàn)的代碼,都有g(shù)lGetFloatv(GL_MODELVIEW_MATRIX, &mat); 然后從各列中解析出R,U,N的步驟,接著用R,U,N作公告板計算.
而當我們使用glGetFloatv(GL_TRANSPOSE_MODELVIEW_MATRIX, &mat),才與上述規(guī)則相一致.

在DirectX中D3DXMatrixLookAtLH建立出的ViewMatrix為(R, U, N),這里的R,U,N是列向量,即ViewMatrix的第一列是R,第二列是U,第三列是N.
DirectX沒有令人誤導(dǎo)的列存儲方式,生成的ViewMatrix確實符合這個數(shù)學(xué)標準.

OpenGL中能直接取到的是ModelViewMatrix,此矩陣將模型坐標從模型坐標系轉(zhuǎn)換到鏡頭坐標系,ModelViewMatrix的逆矩陣可以將鏡頭坐標系下的坐標轉(zhuǎn)換到模型坐標系,一個典型的應(yīng)用是:已知在鏡頭坐標系下,鏡頭所在(0, 0, 0)點,則使用上述逆矩陣推算出鏡頭在模型坐標下的位置.注意要想推算鏡頭在世界坐標系下的位置,需要使用ViewMatrix的逆矩陣.
如果ModelMatrix為標準矩陣,則模型坐標系和世界坐標系重合,ModelViewMatrix矩陣是純粹的ViewMatrix.

定理:若有一個以當前坐標系為數(shù)值參考,而定義的基(以標準數(shù)學(xué)形式給出)
      R
則( U ) (R,U,N為行向量)矩陣將當前坐標系的點的坐標數(shù)值轉(zhuǎn)換到新基的坐標系下的
      N       點的數(shù)值.

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多