SceneKit动态物体穿过静态地面

4

我有一个使用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)

地面的物理效应如下所示:

enter image description here

正如您所看到的,汽车被发射到空中。然后场景中的重力使其下落,但它没有与地面碰撞,而是直接穿过了地面。
重力效应如下所示:

我应该做出哪些改变才能使其与地面碰撞?
3个回答

3
我制作了一个macOS播放器示例,位于github.com/heckj/scenekit-physics-playground,其中显示了物理实体的交互。我怀疑你本地示例的核心问题在于地面对象实际上没有与SCNPhysicsBody相关联。直到我明确将其设置为静态的SCNFloor,文本块才像您最初描述的那样“掉下去”。
我建议添加sceneView.debugOptions = [.showPhysicsShapes]以查看相关调试形状。我对上述仓库进行了一些更新(并推送了)。使用股票SCNFloor为物理集合建立几何图形使得目标很小(这就是为什么轻微的水平冲量使它似乎“穿过”的原因)。最后一次更新将地面几何图形设置为长而宽的薄盒子。

谢谢,现在地板是一个盒子,汽车不会穿过地板掉下去了。 - billy123

1
你需要将地板设置为运动学类型,而不是静态类型。由于车辆是动态的,而地板是静态的,地板没有以任何方式与其他对象交互,并且你明确希望进行碰撞。
更新:对于碰撞交互,静态和运动学没有区别,两者的效果基本相同,但拥有物理体,并验证其大小或查看使用.showPhysicsShapes的交互可能会回答为什么它们没有相互作用的潜在问题。

我将其更改为运动学,但汽车仍然穿过地板。此外,在我做的一个示例项目中,地板是静态的,并与动态对象发生碰撞。 - billy123
我甚至将其改为动态以查看汽车是否会撞到地面,只是为了看看问题是否与车身类型有关,但它仍然掉落了。我认为这与其他事情有关,但我不知道是什么。 - billy123
我修复了物理体,之前我的碰撞位掩码有误。但现在你遇到的同样问题也发生在我身上了。它撞到地板上弹起来并旋转,当它旋转时穿过了地板。 - billy123
1
为SCNFloor对象设置一个明确的(且较大的)物理几何体,以便在更大的形式下提供明确的交互对象。当我启用debugOptions上的.showPhysicsShapes时,我注意到SCNFloor的默认几何形状非常小。为地板区域添加一个明确的(且更大的)几何体解决了碰撞问题。 - heckj
显示剩余5条评论

0

对于您的问题,可能的解决方案之一是将汽车的collisionMargin属性从0.0设置为0.01,我曾经在球和平面上遇到过同样的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接