【问题标题】:Collision Normal in iOS7 SpriteKit PhysicsiOS7 SpriteKit物理中的碰撞法线
【发布时间】:2013-10-01 06:56:44
【问题描述】:

有谁知道如何在 SpriteKit 中查找或计算碰撞法线。来自Box2D,有多种方法提供法线信息,但在SpriteKit框架中,SKPhysicsContact只提供了一个接触点。

我正在使用原始对象、平面与圆形碰撞、圆形/矩形碰撞和圆形/自定义形状碰撞。

谁能指出我使用碰撞接触点计算表面法线的数学,不胜感激。

【问题讨论】:

  • 什么类型的形状在碰撞?它们是基于边缘的碰撞吗?这些将决定您如何计算碰撞法线并使您的问题更容易回答。
  • 我主要使用原始形状、圆形和矩形,但我确实有几个带有角度边缘/平面的自定义形状(想想自定义形状,如经典的破砖桨)。所以使用物理引擎的法线我应该能够计算反射方向。

标签: ios7 game-physics xcode5 sprite-kit


【解决方案1】:

更新:从 iOS 8 开始,SKPhysicsContact 具有 contactNormal 属性。但是,以下建议可能仍然适用,因为普通联系人并不总是按照您的意愿行事。


Box2D 计算的碰撞法线may not be a good estimate of the contact normal。许多 2D 物理引擎的碰撞检测/解决算法都是如此,可能包括 SpriteKit 的。

如果您希望实现经典的 Breakout 式球拍(在球拍的末端附近击球比在中间附近击球更能偏转球),这里有几个想法:

  1. 为桨使用椭圆物理体。 (即使你的精灵艺术大部分是矩形,几何形状的差异可能不会让玩家注意到。)或者使用多个节点的构造,每个节点都有自己的物理体,由圆形、矩形和矩形组成更复杂的曲率。省略号。

  2. 实现碰撞后处理程序(didEndContact:didSimulatePhysics)并在碰撞后调整球的速度。您可以将接触点转换为(桨的)节点坐标,找到距桨中心的水平偏移量,并使用它来缩放或旋转球的新速度矢量。 (请注意,如果您正在执行此类非平凡的向量数学运算,您可能会发现将向量转换为 vector_float2 会很方便,这样您就可以使用 SIMD 库提供的硬件加速向量数学函数。)

【讨论】:

  • 谢谢@rickster。我曾考虑过使用多个节点。我的 Brick Breaker 游戏的 Box2D 版本有多个固定装置,它们也很容易分解并在通电时改变其形状。我需要帮助的是弄清楚如何仅使用接触点和碰撞对象圆或自定义形状来计算表面法线。我正在使用碰撞对象中心位置和接触点来计算法线向量,但它非常有问题并且没有像我想象的那样工作。如果您知道任何我可以用来学习所涉及的数学的网站,请提供建议。
【解决方案2】:

SKPhysicsContact 包含contactNormal 向量属性

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多