SceneKit 动态对象从静态地板掉落

SceneKit dynamic object falls through static floor

我在 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)

地板的物理效果如下:

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

引力看起来像这样:

我应该改变什么才能让它与地板碰撞?

您想将楼层设置为 kinematic, not static 类型。由于汽车是动态的而地板是静态的,地板不会以任何方式与其他物体相互作用,而您明确想要碰撞。

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

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

我建议添加sceneView.debugOptions = [.showPhysicsShapes]以查看相关调试形状。我已经对上述回购进行了(并推送)了一些更新。使用常用的 SCNFloor 为物理集合建立几何形状使目标很小(这就是为什么轻微的水平脉冲使它看起来 "pass through")。最后一次更新将地板几何形状设置为长、宽、薄的盒子。

你的一个可能的解决方案是将你的汽车的碰撞裕度 属性 从 0.0 设置到大概 0.01,我对球和平面也有同样的问题。