opengl - 2D 矩阵到 3D 矩阵

标签 opengl matrix linear-algebra

我将 2D 变换存储在普通的 3x3 矩阵中。我怎样才能将其重新格式化为矩阵,以便将其推到 OpenGL 上以转换正交形状、多边形等。

我该如何放置这些值才能保留转换?

(在一个不相关的注释中,是否有一种快速方法来反转 3x3 矩阵?)

最佳答案

关于变换矩阵的一些解释:除最后一列外,所有列都描述了当前坐标系基础上新坐标系的方向。所以第一列是新坐标系的X向量,从当前来看,第二列是新的Y向量,第三列是新的Z向量。到目前为止,这仅涵盖了旋转。最后一列用于相对偏移。最后一行和最右下角的值用于齐次变换。最好保留最后一行 0, ..., 0, 1

在您的情况下,您缺少 Z 值,因此我们只需在其中插入恒等变换,以便传入值保持原样。

假设这是你的原始矩阵:

xx xy tx

yx yy ty

 0  0  1

该矩阵缺少 Z 变换。插入恒等式意味着:将 Z 保留原样,并且不与其余部分混合。所以 ·z = z· = 0,除了 zz = 1。这给出了以下矩阵

       ↓

xx xy  0 tx

yx yy  0 ty

 0  0  1  0  ←

 0  0  0  1

如果 OpenGL 版本低于 3 核配置文件,您可以使用 glMultMatrix 将其应用到当前的 OpenGL 矩阵堆栈上。请注意,OpenGL 按列主序对矩阵进行编号,即数组中的索引如下所示(十六进制数字)

0 4 8 c
1 5 9 d
2 6 a e
3 7 b f

这与通常的 C 表示法相反

0 1 2 3
4 5 6 7
8 9 a b
c d e f

无论如何,使用 OpenGL-3 核心及更高版本,您都必须自己进行矩阵管理和操作。

编辑问题的第二部分

如果通过求逆1意味着对于给定的矩阵M求出矩阵M^-1,使得M^1 * M = M * M^1 = 1。对于 3×3 矩阵,行列式求逆方法比高斯约当消元法需要更少的运算,因此是最有效的方法。对于 4×4 矩阵,行列式求逆已经比其他方法慢了。 http://www.sosmath.com/matrix/inverse/inverse.html

如果你知道你的矩阵是正交的,那么你可以转置除底行和最右列之外的左上部分,并取反最右列的符号,除了最右下的元素。这利用了正交矩阵 M^-1 = M^T 的事实。

关于opengl - 2D 矩阵到 3D 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6971898/

相关文章:

opengl - gl_Position 是如何变成窗口中的 (x, y) 位置的?

OpenGL 渲染模式

c++ - OpenGL - 在抛出 '__gnu_cxx::recursive_init_error' 实例后调用终止?

c++ - 运算符重载以在无效输入上显示错误

r - 如何改进 R 中 for 循环中的简单减法?

c# - OpenTK 中的模板缓冲区深度

jquery - 使用 jquery 或 javascript 改变变换 Angular

r - Gram-Schmidt 正交化

c++ - numpy 比 eigen 这样的 c++ 线性代数库慢吗?

rust - 如何在 Rust 中访问代数矩阵的各个元素?