在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 :(得分:6)
如果我理解你的问题正确,你有一个相对轮换案例。您可以尝试搜索双摆,见图。
使用旋转矩阵可以找到围绕点p1
旋转的点p0
的新坐标,如
在点p2
周围旋转的点p1
的新坐标将为
最后,围绕点p2
旋转的点p0
的新坐标将是
矩阵乘法的顺序以及角度的符号。
答案 1 :(得分:2)
我担心这将与语言无关 - 我实际上在Android中做了类似的事情,但我都在学习android和矩阵数学!你似乎知道如何在Android中使用矩阵,所以我猜这不会是一个问题。
所以 - 假设我们有两个网格(网格是你可以独立绘制到屏幕上的东西):UpperLeg
和LowerLeg
。
UpperLeg
,您将获得网格旋转的点(RotationPoint
)(在现实世界中我猜这将是时髦的)并且您将获得关键点LowerLeg
附加到它的地方(AttachmentPoint
)(在现实世界中我猜这将是膝盖)。LowerLeg
,您将获得网格旋转的点(RotationPoint
)(在现实世界中,我猜这将是膝盖)。 UpperLeg.AttachmentPoint
= LowerLeg.RotationPoint
(这样你的腿不会脱落)。
现在让我们假设你有两个轮换量(一个用于UpperLeg
,另一个用于LowerLeg
):UpperLeg.Rotation
和LowerLeg.Rotation
。
(旋转的主题之一 - 如果你还没有听说过 Quaternions ,你应该看一下 - 我惊讶于1846年的一些人想出了这些 - 他们基本上封装了旋转的概念,可以变成旋转矩阵,可以组合(通过乘法)并且不会受到万向节锁定的影响。
首先,您可以通过以下方式轮换UpperLeg
UpperLeg
网格,以便UpperLeg.RotationPoint
为原点UpperLeg.Rotation
UpperLeg
网格,使其成为现实世界中的所需网格。
我知道你正在这样做。因此对LowerLeg
而言:
LowerLeg
网格,以便LowerLeg.RotationPoint
为原点UpperLeg.Rotation
结合LowerLeg.Rotation
)LowerLeg
网格移动与步骤3中UpperLeg
网格移动的数量相同LowerLeg
网格移动到由UpperLeg.RotationPoint
旋转的向量(从UpperLeg.AttachmentPoint
到UpperLeg.Rotation
的向量)。上述步骤可以组合和优化。
基本上我在说:
旋转LowerLeg
,因为它需要旋转,然后将其推到需要去的地方 - 它需要去的地方将取决于UpperLeg
的去向,以及你到达LowerLeg
的位置已附加到UpperLeg
。
这是我在这里发表的第一篇文章,如果我违反了任何基本规则,请告诉我它们是什么。