簡體   English   中英

opengl矩陣數學乘法

[英]opengl matrix math multiplication

我正在編寫一個簡單的c 4x4矩陣數學庫,希望獲得一些反饋,尤其是來自具有opengl經驗的人。

通常,有兩種方法進行矩陣乘法。 根據Wolfram alpha的結果,我測試了此代碼,並且該代碼有效,但我主要擔心的是,此矩陣的順序正確。

我的矩陣只是16個雙打的數組。

下面是進行乘法的代碼

out->m[0]  = ( a->m[0]  *  b->m[0]) + (a->m[1]  * b->m[4]) + (a->m[2]  *  b->m[8]) + (a->m[3]  * b->m[12] );
out->m[4]  = ( a->m[4]  *  b->m[0]) + (a->m[5]  * b->m[4]) + (a->m[6]  *  b->m[8]) + (a->m[7]  * b->m[12] );
out->m[8]  = ( a->m[8]  *  b->m[0]) + (a->m[9]  * b->m[4]) + (a->m[10] *  b->m[8]) + (a->m[11] * b->m[12] );
out->m[12] = ( a->m[12] *  b->m[0]) + (a->m[13] * b->m[4]) + (a->m[14] *  b->m[8]) + (a->m[15] * b->m[12] );

out->m[1]  = ( a->m[0]  *  b->m[1]) + (a->m[1]  * b->m[5]) + (a->m[2]  * b->m[9])  + (a->m[3]  * b->m[13] );
out->m[5]  = ( a->m[4]  *  b->m[1]) + (a->m[5]  * b->m[5]) + (a->m[6]  * b->m[9])  + (a->m[7]  * b->m[13] );
out->m[9]  = ( a->m[8]  *  b->m[1]) + (a->m[9]  * b->m[5]) + (a->m[10] * b->m[9])  + (a->m[11] * b->m[13] );
out->m[13] = ( a->m[12] *  b->m[1]) + (a->m[13] * b->m[5]) + (a->m[14] * b->m[9])  + (a->m[15] * b->m[13] );

out->m[2]  = ( a->m[0]  *  b->m[2]) + (a->m[1]  * b->m[6]) + (a->m[2]  * b->m[10]) + (a->m[3]  * b->m[14] );
out->m[6]  = ( a->m[4]  *  b->m[2]) + (a->m[5]  * b->m[6]) + (a->m[6]  * b->m[10]) + (a->m[7]  * b->m[14] );
out->m[10] = ( a->m[8]  *  b->m[2]) + (a->m[9]  * b->m[6]) + (a->m[10] * b->m[10]) + (a->m[11] * b->m[14] );
out->m[14] = ( a->m[12] *  b->m[2]) + (a->m[13] * b->m[6]) + (a->m[14] * b->m[10]) + (a->m[15] * b->m[14] );

out->m[3]  = ( a->m[0]  *  b->m[3]) + (a->m[1]  * b->m[7]) + (a->m[2]  * b->m[11]) + (a->m[3]  * b->m[15] );
out->m[7]  = ( a->m[4]  *  b->m[3]) + (a->m[5]  * b->m[7]) + (a->m[6]  * b->m[11]) + (a->m[7]  * b->m[15] );
out->m[11] = ( a->m[8]  *  b->m[3]) + (a->m[9]  * b->m[7]) + (a->m[10] * b->m[11]) + (a->m[11] * b->m[15] );
out->m[15] = ( a->m[12] *  b->m[3]) + (a->m[13] * b->m[7]) + (a->m[14] * b->m[11]) + (a->m[15] * b->m[15] );

我想確保這將為我設置轉換矩陣提供正確的結果。

矩陣m = 1,3,4,-1,5,6,7,-1,8,8,8,-1,0,0,0,1排列如下:

1,3,4,-1
5,6,7,-1
8,8,8,-1
0,0,0,1

我認為這是opengl以16個數字表示矩陣的方式。

使用我的代碼我的答案出來是

[   48.000000   53.000000   57.000000   -9.000000   ]
[   91.000000   107.000000  118.000000  -19.000000  ]
[   112.000000  136.000000  152.000000  -25.000000  ]
[   0.000000    0.000000    0.000000    1.000000    ]

這是Wolfram alpha答案的轉置。

(48 | 91  | 112 | 0
 53 | 107 | 136 | 0
 57 | 118 | 152 | 0
 -9 | -19 | -25 | 1)

通常看起來像這樣,頂點v模型,視圖,投影矩陣

position = projection * view * model * v

我不能說你為什么結果會有所不同,但是有一個幫助是,如果將矩陣發送到GLSL統一dMat4中,則可以使用OpenGL的內建轉置功能來獲得正確的矩陣對齊方式:

glUniformMatrix4fv( Uniform_Location, 1, GL_TRUE, MatrixPointer );

第三個參數表示,如果OpenGL在設置制服之前應該轉置矩陣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM