gpt4 book ai didi

c - opengl矩阵数学乘法

转载 作者:太空宇宙 更新时间:2023-11-04 00:03:55 24 4
gpt4 key购买 nike

我正在编写一个简单的 c 4x4 矩阵数学库并希望得到一些反馈,尤其是来自具有 opengl 经验的人的反馈。

通常有两种方法可以进行矩阵乘法。根据 wolfram alpha 的结果,我测试了这段代码并且它有效,但我主要担心的是这个矩阵的顺序是否正确。

我的矩阵只是一个包含 16 个 double 的数组。

执行乘法的代码如下

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模型、 View 、投影矩阵

position = projection * view * model * v

最佳答案

我不能告诉你为什么你的结果不同,但一个帮助是,如果你将矩阵发送到 GLSL uniform dMat4,你可以使用 OpenGL 的内置转置功能来获得正确的矩阵对齐:

glUniformMatrix4fv( Uniform_Location, 1, GL_TRUE, MatrixPointer );

第三个参数表示,OpenGL是否应该在设置统一之前转置矩阵。

关于c - opengl矩阵数学乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31741549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com