给定一个二维变换矩阵,如何计算缩放、倾斜、旋转和平移



我写了一个程序(像这样),通过用户对缩放、倾斜、旋转和平移的输入,可以生成转换矩阵并将其应用于对象。

现在我想反其道而行之:给定变换矩阵,如何计算这些值?矩阵是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)

旋转(度)

这是一个棘手的部分:旋转不是一个基本的变换函数;事实上,它是偏斜和比例相结合的结果。可以通过对象的xy轴倾斜对象,然后缩放对象使其看起来像是旋转过的。x偏斜的角度通常被视为旋转角度:

rotation := skew_x

有时:

rotation := skew_y

假设平移/旋转/缩放&扭曲操作顺序,最简单的方法是一次剪下一个。

  1. 提取最后一列;这就是翻译。丢弃它和最后一行
  2. 求得到的3x3矩阵的QR分解。正交分量是旋转;丢弃它并保留上面的三角形组件
  3. 上部三角形组件的对角线是缩放比例。通过将上三角矩阵与缩放的逆矩阵左相乘将其反转
  4. 结果是偏斜矩阵

最新更新