sceneKit动态物理体穿过地板

时间:2017-07-06 12:01:50

标签: ios 3d scenekit arkit

我有一个带有动态物理体的立方体和一个带有运动物理体的平面。当我在平面上方放置一个立方体时,它将落在平面上,并且预计会发生反弹。

问题是:当立方体很小或很轻时,它只是通过平面。例如,立方体有0.1 * 0.1 * 0.1工作正常,但0.05 * 0.05 * 0.05很糟糕。我仍然可以通过身体接触通知。

这是我创建几何的代码:

T

3 个答案:

答案 0 :(得分:1)

我很惊讶你发生了碰撞。请参阅SCNPhysicsBodyType docs - 运动类型适用于您移动的物体(通过设置其位置等)到原因碰撞,但这些物体本身不会受到与其碰撞的其他物体的影响。

如果您将楼层的类型设置为static,您可能会看到更好的结果。静态物体不会移动(无论是物理相互作用还是设置其位置),因此物理引擎可以更准确地检查与其发生碰撞的其他物体。

编辑:要了解的其他事项:

  • 使用SCNPlane而不是SCNBox作为发言权。 (请注意,如果有帮助的话,你可以创建形状与其可见几何形状不同的物理实体。)我不确定SceneKit是什么,但很多物理引擎更容易检查" 某个对象从最后一帧传递这个无限边界?"在这个框架上这个有限区域里面是某个对象?"
  • 为移动物体启用精确碰撞检测。

答案 1 :(得分:1)

最后我发现这就是SceneKit的物理模拟。如果立方体下降太快,它会在平面上进行大的穿透。在物理模拟步骤中。在这种情况下,sceneKit只是让它通过飞机而不是碰撞。当我将立方体的速度更改为较小的值时它与平面相撞。

我的解决方案是在发生大的过度穿透时给立方体一个向上的速度,这是下降速度的30%。诀窍是调整立方体的速度直到碰撞发生。

答案 2 :(得分:0)

仅适用于球形物理形状

对于此问题,SCNPhysicsBody具有特殊属性:continuousCollisionDetectionThreshold

  

例如,在涉及弹丸和目标的游戏中,   如果弹丸移动的距离比   一个时间步长内目标的厚度。通过设置射弹的   连续碰撞检测阈值匹配其直径,您   确保SceneKit始终检测弹丸之间的碰撞   和其他对象。