【发布时间】:2013-02-26 06:13:14
【问题描述】:
在一个 Android 应用程序中,我想画一条奔跑的腿。要输出腿的上半部分,我会执行以下操作:
// legCX,legCY is the location on screen about which the leg rotates.
Matrix m = new Matrix();
m.postTranslate(-legCX,-legCY);
m.postRotate(legRot);
m.postTranslate(legCX,legCY);
然后我将矩阵设置到画布上并绘制腿。
如何画出膝盖以下腿的第二部分?它的旋转速度与其上方的腿不同,并且有一个中心点随上方的腿一起移动。我尝试了以下方法,但最终结果是围绕某个不跟随上面腿的单点旋转。
Matrix m = new Matrix();
m.postTranslate(-legCX,-legCY);
m.postRotate(legRot);
m.postTranslate(0,-legLength);
m.postRotate(footRot);
m.postTranslate(0,legLength);
m.postTranslate(legCX,legCY);
我怀疑可能有必要在两个不同的 Matrix 对象中进行两次旋转,然后以某种方式将它们组合起来,但我不知道该怎么做。
编辑: 这种类型的矩阵似乎被称为“变换矩阵”。组合多个操作称为转换的组合。但是,关于这个主题的页面都没有提到如何进行一系列的平移和旋转。
当然,如果您可以使用矩阵围绕一个点进行旋转,那么必须可以以某种方式执行多个矩阵运算以允许围绕一个点进行旋转,然后围绕另一个点进行额外的旋转。
我曾尝试查看有关骨骼动画的页面,但我无法理解他们在谈论什么。
【问题讨论】:
-
您似乎忘记撤消
legRot。除了最里面的旋转,所有其他操作都应该完美平衡。您可以通过在适当的位置添加反向旋转来实现这一点,或者将前三个操作组合到一个矩阵中,然后先应用该矩阵,然后应用它的逆矩阵。如果这解决了你的问题,我会把这个评论变成答案。 -
这不起作用。我希望我能找到一个关于如何做到这一点的教程,但要么不可能,要么我正在寻找错误的东西。