【发布时间】:2019-06-20 10:53:20
【问题描述】:
我有一个从位置、比例和旋转(无倾斜)创建的二维矩阵。我希望能够将此矩阵分解回原始组件,并使用以下伪代码设法做到这一点:
posX = matrix.tx
posY = matrix.ty
scaleX = Sqrt( matrix.a * matrix.a + matrix.b * matrix.b )
scaleY = Sqrt( matrix.c * matrix.c + matrix.d * matrix.d )
rotation = ATan2( -matrix.c / scaleY, matrix.a / scaleX )
但是,这显然只适用于正比例值,我不确定如何计算正确的负比例。我尝试了使用谷歌找到的各种建议,但到目前为止没有一个能正常工作。
我已经尝试了here 接受的答案和here 的分解解释,虽然它们产生了正确的转换,但比例和旋转的分量与我的原始值不匹配。
我尝试采用对角矩阵.a * matrix.d 的符号,这似乎适用于 x 轴上的比例,但不确定这是否是正确的方法并且无法弄清楚如何处理 y 轴.
这甚至可能吗?我是否必须接受我不会取回确切的组件,而我能期望的最好的结果是产生相同转换的值?
任何帮助或指点将不胜感激。
原创
翻译 = 204, 159
旋转 = -3.0168146900000044
比例 = -3, -2
矩阵 = [ 2.976675975304773, 0.37336327891663146, -0.24890885261108764, 1.984450650203182, 204, 159]
分解
翻译 = 204, 159
旋转 = 0.1247779635897889
比例 = 3, 2
矩阵 = [ 2.976675975304773, 0.3733632789166315, -0.24890885261108767, 1.984450650203182, 204, 159]
那是使用下面的分解代码:
posX = matrix.tx
posY = matrix.ty
scaleX = Sgn( a ) * Sqrt( matrix.a * matrix.a + matrix.b * matrix.b )
scaleY = Sgn( d ) * Sqrt( matrix.c * matrix.c + matrix.d * matrix.d )
rotation = ATan2( -matrix.c / scaleY, matrix.a / scaleX )
【问题讨论】:
-
您能提供一些示例输入和输出吗?
-
我添加了一个示例输入和输出来演示这个问题
-
您的代码没有问题 - 这两个矩阵相同(在数值误差范围内)。
-3, -2的缩放相当于3, 2的缩放+PI的旋转,正好等于原始角度和分解角度之差。如果您真的想要“看起来正确”的结果,如果两个比例因子都是正数,您可以翻转它们的符号并将PI添加到旋转角度。 -
是的,我知道它们是相同的,我希望能够分解回确切的原始组件,而不是产生相同转换的组件。我认为这是不可能的?
标签: matrix 2d scale decomposition