我不确定如何为初始和最终之间的过渡设置动画状态。首先,我使每个点都沿其初始位置和最终位置之间的直线路径移动。这引起了旋转矩阵的问题。例如,旋转180 $ ^ {\ circ} $应该显示点绕圆弧绕原点旋转,但是我的方法使整个网格看起来像是翻转而没有旋转。
多次应用非常小的旋转,例如1 $ ^ {\ circ} $,可以制作出更好的旋转动画。旋转1 $ ^ {\ circ} $的矩阵接近单位矩阵:
$$ \ begin {bmatrix} 0.9998&-0.0175 \\ 0.0175&0.9998 \ end {bmatrix} $$
给定完整的变换矩阵,是否存在一些可以生成差分变换矩阵的通用公式?我希望它适用于任何2x2矩阵,而无需指定转换类型。
#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
评论
是的,但是由于数值不稳定,它最终会倾斜。我应该查阅我的讲义,在我停止教书后还没有再讨论。它会偏向于任何类型的转换还是仅偏大?
转换矩阵仅捕获转换的最终结果,而不是“转换如何到达那里”。在一个方向上旋转180°的矩阵,在另一个方向上旋转180°的矩阵以及用于翻转网格的矩阵(按(-1,-1)缩放)都相同。
我想到的第一个想法是,可以将矩阵分解为Möbius变换,然后求出数量。 en.wikipedia.org/wiki/…
之前我没有听说过Möbius的转变,谢谢!