我将 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/