在 Opengl 中使用矩阵的正确顺序是啥?

Posted

技术标签:

【中文标题】在 Opengl 中使用矩阵的正确顺序是啥?【英文标题】:What is the correct order to use matrices in Opengl?在 Opengl 中使用矩阵的正确顺序是什么? 【发布时间】:2014-04-08 17:26:10 【问题描述】:

我查看了几个资源,例如 http://antongerdelan.net/teaching/3dprog1/maths_cheat_sheet.pdf

我发现我应该使用列主要排序,当我发现这个问题的答案时就会出现混乱

Why does my translation matrix needs to be transposed?

答案显示了一个以列主要顺序排列的转换矩阵,但之前的资源显示了一个以列主要顺序排列的转换矩阵,它似乎是此答案中显示的转置矩阵。

我知道这个答案中的矩阵是正确的,因为我已经尝试过了并且我的转换有效。我试图找到的是列主要比例、旋转和透视矩阵,也是用这种 c++ 数组样式表示法编写的,而不是第一个资源中的那个。

【问题讨论】:

【参考方案1】:

根据仔细阅读

Why does my translation matrix needs to be transposed?

不同之处在于您正在查看的第一页向您显示矩阵的数学符号,其中每一列都沿垂直线排列;而您正在查看的另一个符号是类似于可能出现在您的 C++ 代码中的某些字符的序列。还有许多其他差异,例如数学符号中的高方括号(无法在 C++ 代码中精确再现,因为没有跨越多行的字符),以及数字之间没有逗号的事实数学符号。

但主要的是,由于矩阵以列优先顺序存储,如果您按照它们的存储顺序初始化条目(例如通过使用符号从逗号分隔的列表中初始化数组),那么 xyz1 将是您将在矩阵中设置的最后四个条目。并且由于 C++ 总是被解析为从左到右读取的线性字符串(当您查看列表时,解析器不关心哪个数字恰好位于其他数字的正下方),如果您碰巧格式化了一个包含 16 个值的列表4 行,每行 4 个值,列表中的最后四个值是格式的最后 上的值。

【讨论】:

我不太确定你的最后一句话是否准确。 OpenGL在内存中布局列主矩阵的方式,每个连续的内存位置代表从前一个位置向下的1行,或者如果前一个位置已经代表矩阵中的最后一行,那么第一行右侧的下一列。因此,浮点数列表中的最后 4 个值将是 Nx4 列主矩阵的最后一个 column 简而言之,之所以会产生混淆,是因为 matrix(无论是数学类型,还是它在计算机内存中的表示)与 C++ 完全不同源代码清单。我的最后一句话是指C++源代码格式的东西。

以上是关于在 Opengl 中使用矩阵的正确顺序是啥?的主要内容,如果未能解决你的问题,请参考以下文章

调试 OpenGL 的最佳方法是啥?

OPENGL矩阵顺序与调用顺序相反

OpenGL中矩阵乘法的顺序

在OpenGL中采样16位高度图的正确方法是啥

Opengl 未使用着色器正确绘制 - 矩阵设置/初始化问题?

在 iOS 上使用 OpenGL-ES 2.0 设置横向正交投影的正确方法是啥?