Answers:
除了@tesselode的答案,我建议您为游戏中的每个世界对象保留一个附加对象列表。遵循某种思路List<WorldObject> AttachedObjects
。然后,当您检测到碰撞时,可以将黑色矩形添加到红色矩形中AttachedObjects
。之后,每次更新父母的位置时,仅使用@tesselode的方法来更新孩子的位置即可。
我假设这两个中的一个可以控制另一个,就像叉车一样。在您的图形中,我假设这是黑色的,红色是包装。您只提到自己在角度上遇到了麻烦,所以这就是我要介绍的全部。
当物体闩锁在一起时,您应该记住两者之间的角度差(我将其称为Theta)。我在图2中绘制了此图,其中第一个图的箭头相互绘制。在解锁对象之前,红色对象的角度将由黑色的角度加Theta决定,如图3所示。
// When Latching:
theta = Red.angle - Black.angle;
// When retrieving Red's angle:
Red.angle = Black.angle + theta
您可以实现具有对象的子对象的功能(其中子对象将受父对象的位置/旋转的更改自动影响)。然后在发生碰撞时将它们闩锁在一起,您将创建一个不可见的对象,并将两个附加的对象作为其子对象。然后,不对单个对象应用变换(移动,旋转),而是对大对象应用变换,或者您仍然可以对单个子对象施加力,这将检查“我是否有父母?”,如果是的,力将被发送到父级(它将所有子对象的力合并为一个向量,它将应用于自身)。
另外,如果您根据被锁对象的重量计算不可见父对象的质心,则此方法应正确处理它们的旋转,而约翰的方法似乎无法做到这一点(连接对象绕其新的共享质心旋转,而不是围绕一个对象的质心),您可以轻松嵌套这种行为,而无需任何其他代码。这似乎是一种更强大且更灵活的方法。
+条件,如果施加到子项上的力足以破坏关节,则可以通过简单地删除父子关系>处理子项的“解锁”。如果只剩下一个孩子,则也将其分开,并删除不可见的父母。
如果您有兴趣,我可以提供更多详细信息(包括图片和至少伪代码等)。