【问题标题】:SceneKit dynamic object falls through static floorSceneKit 动态对象从静态地板上掉下来
【发布时间】:2018-01-23 14:42:52
【问题描述】:

我有一个 swift 的 SceneKit 游戏,其中我有一辆带有动态物理车身的汽车,其设置如下:

let carScene = SCNScene(named: "art.scnassets/truck.scn")!
    let carNode = carScene.rootNode.childNode(withName: "Cube", recursively: true)!



   let carPhysicsBody = SCNPhysicsBody(type: .dynamic,shape: SCNPhysicsShape(geometry: SCNBox(width: 5.343, height: 12.125, length: 4.373, chamferRadius: 0)))

    carPhysicsBody.mass = 3
    carPhysicsBody.friction = 2
    carPhysicsBody.contactTestBitMask = 1
    carNode.physicsBody = carPhysicsBody
    carNode.position = SCNVector3(x: 0, y: 0, z: 5)
    carNode.physicsBody?.applyForce(SCNVector3(x: 0, y: 50, z: 0), asImpulse: true)

    car = carNode
    floorScene.rootNode.addChildNode(car)

地板的物理结构如下所示:

如您所见,汽车被发射到空中。然后场景中的重力使它下落,而不是与地板相撞,而是直接穿过它。

重力是这样的:

我应该改变什么让它与地板发生碰撞?

【问题讨论】:

    标签: swift collision-detection game-physics scenekit


    【解决方案1】:

    您希望将楼层设置为kinematic 类型,而不是static。由于汽车是动态的,而地板是静态的,因此地板不会以任何方式与其他对象交互,而您明确希望发生碰撞。

    更新:静态与运动学不会对碰撞交互产生影响,要么以相同的方式有效地工作,但拥有一个物理体,并验证它的大小或查看与 .showPhysicsShapes 的交互可能会回答基本问题为什么他们不互动。

    【讨论】:

    • 我将其更改为运动学,但汽车仍然从地板上掉下来。另外,在我做的一个示例项目中,地板是静态的,会与动态对象发生碰撞。
    • 我什至把它改成动态的,看看车会不会撞到地板,只是看看是不是车身类型的问题,它仍然掉下来,我认为它与别的东西,但我不知道是什么。
    • 你的样本在 github 上还是公开的?答案完全基于文档,我会看看我是否可以在功能示例中找到一些东西
    • 不,我没有,可以在这里包含它
    • 为 SCNFloor 对象设置一个显式的(和大的)物理几何,以提供一些显式的以更大的形式与之交互的东西。当我在debugOptions 上启用.showPhysicsShapes 时,我注意到SCNFloor 的默认几何形状很小。为楼面区域添加显式(并且更大)几何图形解决了碰撞未命中问题。
    【解决方案2】:

    我制作了一个示例 macOS 操场,可在 github.com/heckj/scenekit-physics-playground 获得,它显示了一个物理体交互。我怀疑您本地示例中问题的核心是地板对象实际上没有与之关联的 SCNPhysicsBody 。直到我在 SCNFloor 上明确设置它(作为静态),文本 blob 就像你最初描述的那样“消失”。

    我建议添加sceneView.debugOptions = [.showPhysicsShapes] 以查看相关的调试形状。我对上述存储库进行了(并推送)了一些更新。使用股票 SCNFloor 为物理集合建立几何形状制作了一个小目标(这就是为什么轻微的水平脉冲使它看起来“穿过”的原因)。最后一次更新将地板几何形状设置为一个又长又宽又薄的盒子。

    【讨论】:

    • 谢谢你,地板是一个盒子,汽车不会从地板上掉下来
    【解决方案3】:

    您可能的解决方案之一是将您的汽车的 collisionMargin 属性从 0.0 设置为大概 0.01,我对球和飞机也有同样的问题。

    【讨论】:

      猜你喜欢
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      • 2018-08-19
      • 2021-04-08
      相关资源
      最近更新 更多