保持两个物体之间的旋转


9

在我的XNA游戏中,我有两个碰撞的对象。当第一个物体与另一个物体碰撞时,它可以锁定在其上并在整个世界中移动。我这里的数学有问题(数学不是我的强项)。目前,我将第二个对象闩锁放在第一个对象闩锁上并随其移动,但是我无法使其保持其原始方向。因此,如果对象朝上,则应相对于与原始项目一起旋转的方向保持该方向。

在此处输入图片说明

关于如何最好地实现这一目标的任何提示?


我认为两个对象都将绕另一个对象中心的轴旋转。
MichaelHouse

Answers:


3

就角度而言,只需保持第二个对象的角度与第一个对象的角度相同即可。对于位置,当两个对象相互碰撞时,使用距离公式找到第二个对象与第一个对象的距离。

distance = math.sqrt((x2 - x1)^2 + (y2 - y1)^2)

要查找第二个对象相对于第一个对象的位置:

x2 = x1 + distance * math.cos(angle)
y2 = y1 + distance * math.sin(angle)

2

除了@tesselode的答案,我建议您为游戏中的每个世界对象保留一个附加对象列表。遵循某种思路List<WorldObject> AttachedObjects。然后,当您检测到碰撞时,可以将黑色矩形添加到红色矩形中AttachedObjects。之后,每次更新父母的位置时,仅使用@tesselode的方法来更新孩子的位置即可。


2

我假设这两个中的一个可以控制另一个,就像叉车一样。在您的图形中,我假设这是黑色的,红色是包装。您只提到自己在角度上遇到了麻烦,所以这就是我要介绍的全部。

当物体闩锁在一起时,您应该记住两者之间的角度差(我将其称为Theta)。我在图2中绘制了此图,其中第一个图的箭头相互绘制。在解锁对象之前,红色对象的角度将由黑色的角度加Theta决定,如图3所示。

// When Latching:
theta = Red.angle - Black.angle;

// When retrieving Red's angle:
Red.angle = Black.angle + theta

角度差


1

您可以实现具有对象的子对象的功能(其中子对象将受父对象的位置/旋转的更改自动影响)。然后在发生碰撞时将它们闩锁在一起,您将创建一个不可见的对象,并将两个附加的对象作为其子对象。然后,不对单个对象应用变换(移动,旋转),而是对大对象应用变换,或者您仍然可以对单个子对象施加力,这将检查“我是否有父母?”,如果是的,力将被发送到父级(它将所有子对象的力合并为一个向量,它将应用于自身)。

另外,如果您根据被锁对象的重量计算不可见父对象的质心,则此方法应正确处理它们的旋转,而约翰的方法似乎无法做到这一点(连接对象绕其新的共享质心旋转,而不是围绕一个对象的质心),您可以轻松嵌套这种行为,而无需任何其他代码。这似乎是一种更强大且更灵活的方法。

+条件,如果施加到子项上的力足以破坏关节,则可以通过简单地删除父子关系>处理子项的“解锁”。如果只剩下一个孩子,则也将其分开,并删除不可见的父母。

如果您有兴趣,我可以提供更多详细信息(包括图片和至少伪代码等)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.