我在场景套件中创建了一个3D场景,其中包含一个被无形墙围绕的区域,我想将物理对象放入这个区域,以便一旦它们进入它们就无法逃脱.I我我有心思以下列方式实现这一目标:
isInScene
变量设置为false isInScene
设置为true,这样我就不必检查它了试。这通常看起来效果很好,但是每隔一段时间(很可能经常)我就会无处可寻出EXC_BAD_ACCESS错误。有问题的方法似乎是contactTestBetweenBody,我用它来确定当关闭正常碰撞检测时物体何时接触墙壁或固化器。这是必要的,以防止对象简单地从墙对象的外部反弹。
这里有一小段代码可供说明。顺便提一下,'对象'是一种保留对节点的引用以及其他有用细节的结构:
if let solid = solidifier?.physicsBody, let wall = walls?.physicsBody {
let world = scene.physicsWorld
for i in 0 ..< objects.count {
if objects[i].isInScene == false, let body = objects[i].node.physicsBody {
let contactSolidifier = world.contactTestBetweenBody(body, andBody: solid, options: nil)
if contactSolidifier != nil {
let contactWall = world.contactTestBetweenBody(body, andBody: wall, options: nil)
if contactWall == nil {
objects[i].isInScene = true
body.collisionBitMask = CollisionMask.allSolids.rawValue
}
}
}
}
}
答案 0 :(得分:0)
我找到了一个更好,更好的解决方案,我原本没有想到这个问题。忘记这种令人费解的错综复杂的方法来保持对象的视野。相反,只需将要保留对象的区域设置为其中并反转其方面和法线。
我没有意识到,SceneKit也会在碰撞检测中使用背面剔除,所以如果一个物理对象击中一个内部对象的OUTSIDE,它将通过清理。
我仍然有兴趣知道错误访问错误的原因,因为联系测试方法很有用,我可能希望将来出于其他原因使用它们。