如何获得我翻译的矩阵然后旋转然后翻译然后旋转第二次?

时间:2013-02-26 06:13:15

标签: android math matrix

在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对象中进行两次旋转,然后以某种方式将它们组合起来,但我无法弄清楚究竟是怎么做到的。

编辑: 这种类型的矩阵似乎被称为“变换矩阵”。组合多个操作称为转换组合。但是,本主题的所有页面均未提及如何进行一系列翻译和轮换。

当然,如果你可以使用矩阵围绕一个点进行旋转,则必须能够以某种方式进行多个矩阵运算,以允许围绕一个点旋转,然后围绕另一个点进行额外旋转。

我已经尝试过关于骨骼动画的页面,但是我不能说出他们正在谈论的内容。

2 个答案:

答案 0 :(得分:6)

如果我理解你的问题正确,你有一个相对轮换案例。您可以尝试搜索双摆,见图。

double pendulum

使用旋转矩阵可以找到围绕点p1旋转的点p0的新坐标,如

在点p2周围旋转的点p1的新坐标将为

最后,围绕点p2旋转的点p0的新坐标将是

矩阵乘法的顺序以及角度的符号。

答案 1 :(得分:2)

我担心这将与语言无关 - 我实际上在Android中做了类似的事情,但我都在学习android和矩阵数学!你似乎知道如何在Android中使用矩阵,所以我猜这不会是一个问题。

所以 - 假设我们有两个网格(网格是你可以独立绘制到屏幕上的东西):UpperLegLowerLeg

  • 对于UpperLeg,您将获得网格旋转的点(RotationPoint)(在现实世界中我猜这将是时髦的)并且您将获得关键点LowerLeg附加到它的地方(AttachmentPoint)(在现实世界中我猜这将是膝盖)。
  • 对于LowerLeg,您将获得网格旋转的点(RotationPoint)(在现实世界中,我猜这将是膝盖)。

UpperLeg.AttachmentPoint = LowerLeg.RotationPoint(这样你的腿不会脱落)。

现在让我们假设你有两个轮换量(一个用于UpperLeg,另一个用于LowerLeg):UpperLeg.RotationLowerLeg.Rotation

(旋转的主题之一 - 如果你还没有听说过 Quaternions ,你应该看一下 - 我惊讶于1846年的一些人想出了这些 - 他们基本上封装了旋转的概念,可以变成旋转矩阵,可以组合(通过乘法)并且不会受到万向节锁定的影响。

首先,您可以通过以下方式轮换UpperLeg

  1. 移动UpperLeg网格,以便UpperLeg.RotationPoint为原点
  2. UpperLeg.Rotation
  3. 旋转
  4. 移动UpperLeg网格,使其成为现实世界中的所需网格。 我知道你正在这样做。
  5. 因此对LowerLeg而言:

    1. 移动LowerLeg网格,以便LowerLeg.RotationPoint为原点
    2. 按(UpperLeg.Rotation结合LowerLeg.Rotation
    3. 进行轮播
    4. LowerLeg网格移动与步骤3中UpperLeg网格移动的数量相同
    5. LowerLeg网格移动到由UpperLeg.RotationPoint旋转的向量(从UpperLeg.AttachmentPointUpperLeg.Rotation的向量)。
    6. 上述步骤可以组合和优化。

      基本上我在说:
      旋转LowerLeg,因为它需要旋转,然后将其推到需要去的地方 - 它需要去的地方将取决于UpperLeg的去向,以及你到达LowerLeg的位置已附加到UpperLeg

      这是我在这里发表的第一篇文章,如果我违反了任何基本规则,请告诉我它们是什么。