看完有关矩阵的视频后,我尝试制作2D线性变换的简单动画。从网格中的一组2D点开始,我对每个点应用了2x2矩阵并获得了一组转换后的点。

我不确定如何为初始和最终之间的过渡设置动画状态。首先,我使每个点都沿其初始位置和最终位置之间的直线路径移动。这引起了旋转矩阵的问题。例如,旋转180 $ ^ {\ circ} $应该显示点绕圆弧绕原点旋转,但是我的方法使整个网格看起来像是翻转而没有旋转。

多次应用非常小的旋转,例如1 $ ^ {\ circ} $,可以制作出更好的旋转动画。旋转1 $ ^ {\ circ} $的矩阵接近单位矩阵:
$$ \ begin {bmatrix} 0.9998&-0.0175 \\ 0.0175&0.9998 \ end {bmatrix} $$

给定完整的变换矩阵,是否存在一些可以生成差分变换矩阵的通用公式?我希望它适用于任何2x2矩阵,而无需指定转换类型。

评论

是的,但是由于数值不稳定,它最终会倾斜。我应该查阅我的讲义,在我停止教书后还没有再讨论。

它会偏向于任何类型的转换还是仅偏大?

转换矩阵仅捕获转换的最终结果,而不是“转换如何到达那里”。在一个方向上旋转180°的矩阵,在另一个方向上旋转180°的矩阵以及用于翻转网格的矩阵(按(-1,-1)缩放)都相同。

我想到的第一个想法是,可以将矩阵分解为Möbius变换,然后求出数量。 en.wikipedia.org/wiki/…

之前我没有听说过Möbius的转变,谢谢!

#1 楼

通常,您不能插值转换矩阵。相反,您可以将它们分解为各自的值,然后对它们进行插值并重新组合。

评论中建议的Möbius变换听起来很有趣,但传统上,我只是提取比例和旋转并对其进行插值。

假设变换矩阵

    | a  b |
T = | c  d |



比例尺是[sqrt(a² + c²), sqrt(b² + d²)]

旋转角度是atan(c/a)


您现在要进行插值此比例和旋转角度,在每个帧处重新组成矩阵。

[编辑]校正了角度(由Nathan Reed发现)[/ Edit]

评论


$ \ begingroup $
角度不应该是atan(c / a)吗? (或者,最好是atan2(c,a),如果您的语言支持的话。)同样值得注意的是,假设矩阵不包含剪切。如果是这样,您可以尝试提取该部分并分别对其进行插值。
$ \ endgroup $
–内森·里德(Nathan Reed)
16-9-09 at 17:45



$ \ begingroup $
在纯旋转矩阵中,c = sin(t),并且a和d都等于cos(t)。所以也许您的答案都有效?
$ \ endgroup $
–朱红
16 Sep 10'在15:53

$ \ begingroup $
感谢@NathanReed纠正角度!确实,这没有考虑到剪切力。我习惯于在3D中工作,而我们通常可以忽略剪切,但是在2D变换中,我猜剪切的使用频率更高。
$ \ endgroup $
– Paul-Jan
16/09/10在18:16



$ \ begingroup $
@Vermillion:确实,对于纯旋转矩阵,它们是相同的,但是对于缩放矩阵,每列的缩放比例是不同的(因此,如果要改为使用元素d,则需要先计算缩放比例并执行像atan((sx / sy)* c / d)之类的东西。
$ \ endgroup $
– Paul-Jan
16年9月10日在18:16