2017-08-15 48 views
3

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

正如你可以看到汽车被发射到空中。然后,场景中的重力使其下落,而不是与地板相撞,而是直接穿过它。

重力看起来是这样的:

我应该怎么改变,因此它会与地板碰撞?

回答

1

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

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

+0

现在谢谢你,地板是一个箱子,汽车没有落在地板上 – billy123

1

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

更新:静态与动态并没有对碰撞交互产生影响,或者以相同的方式工作,但有一个物理体,并验证其大小或查看与.showPhysicsShapes的交互可能回答潜在的问题为什么他们没有互动。

+0

我改成了运动和赛车仍然通过地板下降。另外,在我做的一个示例项目中,地板是静态的并与动态对象发生碰撞。 – billy123

+0

我甚至把它改成动态的,看看那辆车会不会撞到地板上,只是为了看看这个问题是否与车身类型有关,而且还是通过了,我认为这与其他事情有关,但我不知道知道什么。 – billy123

+0

你有没有在github上公开过你的示例?答案完全基于文档,我会看看我是否可以在一个功能性示例中搜索某些东西 – heckj

0

一个用于ü更多钞票的解决方案是设置collisionMargin属性为您的爱车从0.0到0.01可能,我对球和平面同样的问题。