我在一个普通的3x3矩阵中存储了2D变换。我该如何将其重新格式化为矩阵,以便将正交形状,多边形等转换到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
只需添加第四行和第四列。例如给定
2 3 3
3 2 4
0 0 1
创建以下
2 3 3 0
3 2 4 0
0 0 1 0
0 0 0 1
变换仍然发生在x-y平面上,即使它现在是在三维空间中