我有一个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!)
这就是我在对象之间进行接触测试的方式。
这是模拟器的屏幕截图:
我不明白为什么会这样。非常感谢您的帮助!
答案 0 :(得分:0)
以下是有关contactTestBetween(_:_:options:)
实例方法的文档:
SceneKit仅在物体之间发生碰撞时将消息发送到物理世界的contactDelegate对象,其中物体之间是其
collisionBitMask
和categoryBitMask
属性重叠,并且仅用于某些类型的物体之间碰撞。 (有关详细信息,请参见SCNPhysicsBodyType。)使用该方法可以在您选择的时间直接测试任意两个物体之间的接触。例如,要实现一个游戏,玩家角色可以拾取物品,您可以在玩家按下“拾取”按钮以查看玩家角色是否与要拾取的物品接触时调用此方法。 / p>
但是您的.categoryBitMask
和.contactTestBitMask
对于这两个对象是不同的。
.collisionBitMask都是什么?
还有一件事:
对于包含 自定义几何 的节点,SceneKit自动创建的物理形状是该几何的粗略近似。这种近似值或
convex hull
在碰撞检测的准确性和性能之间提供了一种折衷方法。为了获得最佳的碰撞检测性能,请基于基本几何类(
SCNBox
,SCNSphere
,SCNPyramid
,SCNCone
,SCNCylinder
创建SCNPhysicsShape实例。或SCNCapsule
)。
希望这会有所帮助。