首页 文章

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

提问于
浏览
3

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

地板的物理看起来像这样:

在此输入图像描述

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

引力看起来像这样:

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

3 回答

  • 3

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

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

  • 1

    您希望将楼层设置为运动类型,而不是静态。由于汽车是动态的并且地板是静止的,因此地板不会以任何方式与其他物体交互,并且您明确地想要碰撞。

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

  • 0

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

相关问题