SceneKit动态对象通过静态楼层落下

时间:2017-08-15 16:09:13

标签: swift collision-detection game-physics scenekit

我有一个快速的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)

地板的物理原理如下:

enter image description here

正如你所看到的那样,汽车被发射到了空中。然后场景中的引力使其下降,而不是与地板碰撞,而是直接穿过它。

引力看起来像这样:

我应该改变什么,以便它会与地板发生碰撞?

3 个答案:

答案 0 :(得分:3)

我已经制作了一个示例macOS游乐场,可在github.com/heckj/scenekit-physics-playground处找到,它显示了一个物理体交互。我怀疑本地示例中的问题的核心是floor对象实际上没有与之关联的SCNPhysicsBody。直到我在SCNFloor上显式设置它(作为静态),正如你最初描述的那样,文本blob“落后”。

我建议添加sceneView.debugOptions = [.showPhysicsShapes]以查看相关的调试形状。我已经(并推动)了上述回购的一些更新。使用库存SCNFloor为物理集合建立几何图形成了一个微小的目标(这就是为什么轻微的水平脉冲使它看起来“通过”)。最后一次更新将地板几何设置为一个长而宽的薄盒。

答案 1 :(得分:1)

您希望将发言权设置为kinematic类型,而不是static。由于汽车是动态的并且地板是静止的,因此地板不会以任何方式与其他物体相互作用,并且您明确地想要碰撞。

更新:静态与运动不会对碰撞交互产生影响,要么以相同的方式有效地工作,要么拥有物理主体,并验证其大小或查看与{{{{{ 1}}可以回答他们为什么不进行互动的根本问题。

答案 2 :(得分:0)

对你来说,一个可行的解决方案是将你的汽车的collisionMargin属性从0.0设置为0.01,我对球和飞机有同样的问题。