【问题标题】:Odd EXC_BAD_ACCESS when calling contactTestBetweenBody调用contactTestBetweenBody时出现奇怪的EXC_BAD_ACCESS
【发布时间】:2015-08-20 16:48:34
【问题描述】:

我在场景工具包中创建了一个 3D 场景,该场景包括一个被隐形墙包围的区域,我想将物理对象抛入该区域,以使它们一旦进入就无法逃脱。我打算通过以下方式实现这一点:

  1. 创建墙对象
  2. 创建一个“固化器”,可以整齐地嵌入墙内
  3. 将每个对象的 isInScene 变量设置为 false
  4. 将它们对准固化器的模糊方向
  5. 每次更新时,如果一个对象正在接触固化器但没有接触墙壁,我会更改其碰撞掩码以包括墙壁并将 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
                }
            }
        }
    }
}

【问题讨论】:

  • 我遇到了同样的问题:使用contactTest 时出现 EXC_BAD_ISSUE :s

标签: swift scenekit


【解决方案1】:

我找到了一个更好的解决方案来解决这个问题,我只是出于某种原因没有想到。忘掉这种将物体保持在视野范围内的荒谬复杂的方法吧。相反,只需制作您想要在其中保留对象的区域并反转其刻面方向和法线。

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

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

【讨论】:

    猜你喜欢
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多