调用contactTestBetweenBody

时间:2015-08-19 18:29:19

标签: swift scenekit

我在场景套件中创建了一个3D场景,其中包含一个被无形墙围绕的区域,我想将物理对象放入这个区域,以便一旦它们进入它们就无法逃脱.I我我有心思以下列方式实现这一目标:

  1. 创建墙对象
  2. 创建一个'固化器'整洁地贴在墙内
  3. 将每个对象的isInScene变量设置为false
  4. 将它们放在凝固器的模糊方向
  5. 每次更新时,如果某个物体正在触碰凝固器但没有碰到墙壁,我会更改其防撞罩以包含墙壁并将isInScene设置为true,这样我就不必检查它了试。
  6. 这通常看起来效果很好,但是每隔一段时间(很可能经常)我就会无处可寻出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
                    }
                }
            }
        }
    }
    

1 个答案:

答案 0 :(得分:0)

我找到了一个更好,更好的解决方案,我原本没有想到这个问题。忘记这种令人费解的错综复杂的方法来保持对象的视野。相反,只需将要保留对象的区域设置为其中并反转其方面和法线。

我没有意识到,SceneKit也会在碰撞检测中使用背面剔除,所以如果一个物理对象击中一个内部对象的OUTSIDE,它将通过清理。

我仍然有兴趣知道错误访问错误的原因,因为联系测试方法很有用,我可能希望将来出于其他原因使用它们。