【发布时间】: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来增强这一点 - 不确定它是否会有所帮助)因此会以某种方式产生一些次要影响......