【发布时间】:2016-02-09 10:43:42
【问题描述】:
如果我有一个表示 2d 旋转、平移或缩放(或它们的某种组合)的 3x3 矩阵,是否有办法将其与常数或另一个矩阵相乘以计算部分变换矩阵。
例如,如果我知道矩阵是一个平移矩阵,我可以简单地将 m[0][2] 和 m[1][2] 乘以某个常数(例如 0.25)来创建一个 1/4(m)的平移矩阵。
是否有一种通用方法可以不受矩阵影响?如果没有,是否有单独的方法适用于列出的每种类型(旋转和缩放)。
【问题讨论】:
如果我有一个表示 2d 旋转、平移或缩放(或它们的某种组合)的 3x3 矩阵,是否有办法将其与常数或另一个矩阵相乘以计算部分变换矩阵。
例如,如果我知道矩阵是一个平移矩阵,我可以简单地将 m[0][2] 和 m[1][2] 乘以某个常数(例如 0.25)来创建一个 1/4(m)的平移矩阵。
是否有一种通用方法可以不受矩阵影响?如果没有,是否有单独的方法适用于列出的每种类型(旋转和缩放)。
【问题讨论】:
这与OpenGL 3D transformations 同源。所以是的,只需省略 z 行/列,您就可以用 3x3 矩阵乘积表示 2D 平移、旋转和缩放。
例如:
翻译:
|1 0 Tx| |x| | x+Tx |
|0 1 Ty|*|y| = | y+Ty |
|0 0 1 | |1| | 1 |
轮换:
|cos(w) -sin(w) 0| |x| | x*cos(w)-y*sin(w) |
|sin(w) cos(w) 0|*|y| = | x*sin(w)+y*cos(w) |
| 0 0 1| |1| | 1 |
规模:
|Sx 0 0| |x| | Sx*x |
|0 Sy 0|*|y| = | Sy*y |
|0 0 1| |1| | 1 |
如果您想组合更多的转换,可以应用更多的转换。假设您有一个缩放操作,S 和一个翻译,T。
现在给定一个向量 v0,您可以对其进行缩放:v1=S * v0
你可以翻译一下:
v2=T * v1
即:
v2=T * S * v0
T * S是复合变换
现在让我们想想以相反顺序执行的转换是什么:S * T
请注意,现在缩放也会缩放转换后的坐标 - 与第一种情况不同。
现在您要求的是转换操作而不是向量的操作。我会尝试这样做:获取向量 v3:
这些将产生原始比例的向量,即“缩放平移”的平移。这通常写成:
v3 = S-1 * T * S * v
其中S-1是逆矩阵(S-1 * S = I,单位矩阵)执行相反的操作。
S-1 * T * S 是您正在寻找的转换。方法很通用。
【讨论】: