在Sprite Kit中进行碰撞的物理计算

47

我正在尝试使用Sprite Kit设置一些弹性碰撞。当多个对象靠近彼此休息时存在问题,就像我在Sprite Kit Physics Collision Issue中提出的问题。

我对碰撞发生的时间感到困惑。

我尝试在-didBeginContact:委托方法中将dynamic设置为NO,计算最终速度,然后在-didEndContact:中将dynamic设置为YES,然后正确地设置速度。

我希望它在碰撞之外是动态的,因为我希望摩擦力/重力等可用。 这种顺序/逻辑有什么问题吗? 我看了看-didSimulatePhysics方法,但似乎不是解决方案。


2
你是如何应用你所计算的速度/力量的? - joshd
我正在执行“setVelocity”。 - Cherr Skees
1
碰撞具有浮点属性(collision.collisionImpulse),可以告诉您撞击的严重程度。SKPhysicsPins可以具有弹性属性。我建议从GitHub下载Matti Räty的MRRopes示例,并在该示例上玩弄属性。 - Wharbio
2
你能把你的代码放上来让我们清楚地看一下吗?也许这是一个物理理论问题,而不是Sprite Kit的问题。 - Guizmoo03
我不是很明白你想做什么,但也许你想在动画师上删除一些行为,并使用新的设置再次添加它们?(当物品相互碰撞时更改摩擦行为...)使用animator.removeBehavior(frictionBehavior)非常容易实现。 - Mikael
显示剩余2条评论
3个回答

5
我正在尝试使用Sprite Kit设置一些弹性碰撞。我认为您误解了此处的物理现象。弹性碰撞是对碰撞的过度简化。实际上,没有碰撞会产生完全能量转移。在我回答相关问题时,我已经在这里解释了这个物理过程。我怀疑阅读此文后,您会发现可以在SpriteKit中实现“弹性”碰撞,但大多数人不知道需要在物体之间留有空间。您不应该需要进行自己的物理计算。

1
我不确定这是否正是你想要做的,但如果我想在不使用SpriteKit的帮助下计算碰撞结果,同时保留所有其他物理效果,则会执行以下操作:
  1. 始终将“dynamic”属性设置为“YES”。
  2. 为每种对象设置“categoryBitMask”属性。
  3. 将一个对象的“collisionBitMask”属性设置为您希望保留自动碰撞计算的所有categoryBitMasks的析取(例如,墙壁,但不包括其他对象),或者设置为零,如果您想手动处理所有碰撞。
  4. 将一个对象的“contactTestBitMask”属性设置为您希望手动计算碰撞的任何内容。
  5. 在“didBeginContact”中计算并设置所有结果速度。
(简而言之,从它们自己的“collisionBitMask”中排除您的对象。)

这个链接可能会有帮助:处理碰撞和联系


0
使用 applyImpulse 而不是 setVelocity。您想要使用脉冲或力来确保物理引擎可以正确地预热。对于非常接近或重叠的对象,使用 setVelocity 将产生不可预测的结果。
确保对象之间有一定的距离,而且它们不重叠。
正确设置碰撞位掩码。
这应该完美地工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接