我写了一个程序(像这样),通过用户对缩放、倾斜、旋转和平移的输入,可以生成转换矩阵并将其应用于对象。
现在我想反其道而行之:给定变换矩阵,如何计算这些值?矩阵是2D(a,b,c,d,tx,ty)。
我知道这是一道纯粹的数学题,但我在高中时注意力不够集中。。。
我在本教程中找到了很多有用的信息,这些信息为我解决了这个问题
翻译(像素)
x := tx
y := ty
规模(时间)
scale_x := sqrt(a^2 + b^2)
scale_y := sqrt(c^2 + d^2)
倾斜(度)
skew_x := 180/pi * atan2(d, c) - 90
skew_y := 180/pi * atan2(b, a)
旋转(度)
这是一个棘手的部分:旋转不是一个基本的变换函数;事实上,它是偏斜和比例相结合的结果。可以通过对象的x
和y
轴倾斜对象,然后缩放对象使其看起来像是旋转过的。x偏斜的角度通常被视为旋转角度:
rotation := skew_x
有时:
rotation := skew_y
假设平移/旋转/缩放&扭曲操作顺序,最简单的方法是一次剪下一个。
- 提取最后一列;这就是翻译。丢弃它和最后一行
- 求得到的3x3矩阵的QR分解。正交分量是旋转;丢弃它并保留上面的三角形组件
- 上部三角形组件的对角线是缩放比例。通过将上三角矩阵与缩放的逆矩阵左相乘将其反转
- 结果是偏斜矩阵