【问题标题】:Two objects are not contacting with each other, but contactTestBetween() returns a result两个对象没有相互接触,但是contactTestBetween()返回结果
【发布时间】:2019-05-08 17:12:11
【问题描述】:

我有一个 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!)

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

这是模拟器的截图:

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

【问题讨论】:

  • 物体在移动吗?我怀疑接触检测是“真实”接触的近似值(请记住,存在 usePreciseCollisionDetection 来增强这一点 - 不确定它是否会有所帮助)因此会以某种方式产生一些次要影响......

标签: ios swift scenekit


【解决方案1】:

以下是文档中关于 contactTestBetween(_:_:options:) 实例方法的说明:

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

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

.collisionBitMask 是什么?

还有一件事:

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

为获得最佳碰撞检测性能,请基于基本几何类(SCNBoxSCNSphereSCNPyramidSCNConeSCNCylinderSCNCapsule)创建一个 SCNPhysicsShape 实例。

希望这会有所帮助。

【讨论】:

  • 感谢您的回答,但它没有回答我的问题。我相信让是正确的。
猜你喜欢
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多