SceneKit - SCNPhysics Body与SCNPhysicsShape不匹配

时间:2014-11-09 23:26:37

标签: ios iphone swift physics scenekit

我有一个非常简单的场景:一个带有动态物理体的立方体和一个带有静态物理体的平面。当立方体落下并击中地面时,两个物体之间存在明显的间隙,您可以看到这个here的视频:

我尝试了SCNPhysicsShapeTypeKey的所有不同组合,并尝试将SCNPhysicsBody的形状设置为nil(文档说:"离开此nil会让系统决定并使用最有效的边界表示" )但没有任何东西可以消除差距。

    // ...
    // plane physics
    var body = SCNPhysicsBody(type: SCNPhysicsBodyType.Static, shape: SCNPhysicsShape(geometry: result.node!.geometry!, options: [SCNPhysicsShapeTypeKey:SCNPhysicsShapeTypeConvexHull]));
    result.node!.physicsBody = body;
} else {
    // cube physics
    var body = SCNPhysicsBody(type: SCNPhysicsBodyType.Dynamic, shape: SCNPhysicsShape(node: result.node!, options: [SCNPhysicsShapeTypeKey:SCNPhysicsShapeTypeConvexHull]));
     result.node!.physicsBody = body;
}

我已经检查了我的dae文件(attached here)并应用了所有比例/变换as per this question,但结果相同。

我想我在这里遗漏了一些明显的想法?

1 个答案:

答案 0 :(得分:5)

@ Toyos'关于filing a bug的评论是一个好主意。但是,在这种情况下,最好不要依赖默认的凸壳生成。

TLDR:尽可能使用原始参数实体(或它们的化合物)作为物理形状。

当您从自定义几何体生成物理形状(即从DAE加载)时,SceneKit必须构建描述该几何体的凸包的复杂数据结构,并且必须通过该数据结构来执行碰撞检测。每个渲染帧(即每秒最多60次)。

当您使用其中一个内置参数形状(SCNBoxSCNSphere等)时,您向SceneKit发出信号,表示它可以使用该形状的理想化表示而不是复杂数据基于多边形网格的结构。

对于一个极端的例子,考虑一个球体:渲染一个体面的球体需要a lot of polygons。如果将这样的网格馈送到碰撞检测算法中,或者它会降低顶点数据的复杂性,或者它必须生成不那么复杂但不太准确的形状的近似(例如,十二面体) 。另一方面,球体是最简单的碰撞检测形状 - 你需要做的就是找出一个给定的点是否在一个球体内是从该点到球体的中心的距离,看看它是否& #39; s小于半径。 (做得对,你甚至不用担心费用sqrt。)