如何获得我翻译的矩阵,然后旋转然后翻译并再次旋转?

问题描述:

在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对象,然后以某种方式将它们结合起来,但我无法弄清楚究竟是如何做到这一点。

编辑: 这种类型的矩阵似乎被称为“变换矩阵”。组合多个操作称为转换组合。然而,这个主题的任何页面都没有提到如何做一系列的翻译和旋转。

当然,如果你可以用一个矩阵来办一个点旋转,它必须能够完成多台矩阵运算以某种方式,将约一个点,然后围绕着不同点额外的旋转旋转。

我试着看的骨骼动画的页面,但我不能让他们在说些什么的头,也没有尾巴。

+0

好像你忘了撤消'legRot'。除了你最内层的旋转之外,所有其他操作应该完美平衡。您可以通过在适当的位置添加反向旋转,或者将前三个操作合并为一个矩阵,然后先应用该矩阵,然后再应用该矩阵来实现此目的。如果这解决了你的问题,我会把这个评论变成一个答案。 – MvG 2013-02-27 21:46:10

+0

这没有奏效。我希望我能找到一个关于如何做到这一点的教程,但要么不可能,要么我正在寻找错误的东西。 – HappyEngineer 2013-02-28 08:33:56

如果我正确理解你的问题,你有一个相对旋转情况。你可以尝试寻找双摆,见图。

double pendulum

使用旋转矩阵各地点p0旋转点p1的新坐标可以像

各地点p1旋转点p2的新坐标中找到将

最后,点p2的点左右旋转p0新的坐标将是矩阵乘法问题

订单以及角度的符号。

+0

我在gamedev上找出了答案。我不太确定我到那里的最终解决方案是否与你在这里做的实际数学一致。它看起来不像,但我不完全确定Matrix对象可能在做什么。 http://gamedev.stackexchange.com/questions/50171/what-matrix-operations-do-i-perform-to-translate-then-rotate-then-translate-then – HappyEngineer 2013-03-01 01:57:36

恐怕这将是语言无关 - 我实际上做在Android上的那一刻类似的东西,但我都学习Android和矩阵数学!你似乎知道如何在Android中使用矩阵,所以我猜这不会是一个问题。

所以 - 假设我们有两个网格物体(网格物体可以独立绘制到屏幕上):UpperLegLowerLeg

  • UpperLeg你将不得不在网格旋转(RotationPoint)(在现实世界中我想这会是臀部)的点,并且你将拥有的地步LowerLeg重视它(AttachmentPoint)(在现实世界中,我猜这将是膝盖)。
  • 对于LowerLeg你将有一个网格旋转点(RotationPoint)(在现实世界中,我猜这将是膝盖)。

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

现在让我们假设你有两个旋转量(一个用于UpperLeg,一个用于LowerLeg):UpperLeg.RotationLowerLeg.Rotation。你应该看看 - 这让我很惊讶,1846年的一些人提出了这些 - 他们基本上封装了旋转的概念,可以转向进入旋转矩阵,可以组合(乘法),不受万向锁的影响)。

  1. 移动UpperLeg网,使UpperLeg.RotationPoint为原点
  2. 通过UpperLeg.Rotation
  3. 旋转移动UpperLeg网,以便它是它必须是:

    首先是你,你的旋转UpperLeg在现实世界。 我看到你正在这样做。

所以对于LowerLeg它会是:

  1. 移动LowerLeg网,使LowerLeg.RotationPoint为原点
  2. 通过旋转(UpperLeg.RotationLowerLeg.Rotation联合)
  3. 通过移动LowerLeg网与UpperLeg网格在步骤3中移动的量相同
  4. 移动LowerLeg通过UpperLeg.Rotation转动它是矢量(矢量从UpperLeg.RotationPointUpperLeg.AttachmentPoint到)啮合。

上述步骤可以进行组合和优化。

基本上我说:
旋转LowerLeg,因为它需要旋转,然后推它需要的地方去 - 它需要去将其中UpperLeg去确定,再加上你怎么去的地方LowerLeg附于UpperLeg

这是我在这里的第一篇文章,如果我违反了任何基本规则,请让我知道他们是什么。