两个对象未相互联系,但contactTestBetween()返回结果

时间:2019-04-05 21:22:24

标签: ios swift scenekit

我有一个SceneKit场景,我试图检测何时两个对象相互接触。我有2个彼此靠近放置的对象,但它们没有接触。当我对这些对象进行接触测试时,函数contactTestBetween()返回一个接触点。为什么会这样?

首先,我将对象彼此放置得更远。如果我将对象彼此放置一定距离,contactTestBetween()不会返回值。好像有个魔术数字。

第二,我对这两个对象之间的碰撞检测进行了相同的测试。同样,如果将对象放置在彼此之间一定距离以下的位置,它们将开始移动。更有趣的是,碰撞检测的距离限制比接触测试的距离限制要低。

scnView.debugOptions = .showPhysicsShapes

这是打开的,所以我可以看到物理形状有多大。

box!.physicsBody = SCNPhysicsBody(type: .dynamic,
                                 shape: SCNPhysicsShape(
                              geometry: box!.geometry!,
                               options: [SCNPhysicsShape.Option.type: 
                                            SCNPhysicsShape.ShapeType.boundingBox]))

box2!.physicsBody = SCNPhysicsBody(type: .dynamic,
                                  shape: SCNPhysicsShape(
                               geometry: box2!.geometry!,
                                options: [SCNPhysicsShape.Option.type: 
                                             SCNPhysicsShape.ShapeType.boundingBox]))

box!.physicsBody!.isAffectedByGravity = false
box2!.physicsBody!.isAffectedByGravity = false

box!.physicsBody!.categoryBitMask = 2
box2!.physicsBody!.categoryBitMask = 4

box!.physicsBody!.contactTestBitMask = 4
box2!.physicsBody!.contactTestBitMask = 2

上面是我用来为对象创建物理物体的代码。

let contactResult = scnView.scene?.physicsWorld.contactTestBetween(box!.physicsBody!, box2!.physicsBody!)

这就是我在对象之间进行接触测试的方式。

这是模拟器的屏幕截图:

enter image description here

我不明白为什么会这样。非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

以下是有关contactTestBetween(_:_:options:)实例方法的文档:

  

SceneKit仅在物体之间发生碰撞时将消息发送到物理世界的contactDelegate对象,其中物体之间是 collisionBitMaskcategoryBitMask 属性重叠,并且仅用于某些类型的物体之间碰撞。 (有关详细信息,请参见SCNPhysicsBodyType。)使用该方法可以在您选择的时间直接测试任意两个物体之间的接触。例如,要实现一个游戏,玩家角色可以拾取物品,您可以在玩家按下“拾取”按钮以查看玩家角色是否与要拾取的物品接触时调用此方法。 / p>

但是您的.categoryBitMask.contactTestBitMask对于这两个对象是不同的

.collisionBitMask都是什么?

还有一件事:

  

对于包含 自定义几何 的节点,SceneKit自动创建的物理形状是该几何的粗略近似。这种近似值或convex hull 在碰撞检测的准确性和性能之间提供了一种折衷方法

     

为了获得最佳的碰撞检测性能,请基于基本几何类(SCNBoxSCNSphereSCNPyramidSCNConeSCNCylinder创建SCNPhysicsShape实例。或SCNCapsule)。

希望这会有所帮助。