首页 文章

sceneKit动态物理体穿过地板

提问于
浏览
2

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

PROBLEM 是:当立方体小或轻时,它只是通过平面 . 例如,立方体有0.1 * 0.1 * 0.1工作正常,但0.05 * 0.05 * 0.05糟透了 . 在这种情况下,我仍然得到身体接触通知 .

这是我创建几何的代码:

//cube
//when dimension is 0.1 everything is fine
float dimension = 0.05;
SCNBox *cube = [SCNBox boxWithWidth:dimension height:dimension length:dimension chamferRadius:0];
cube.materials = @[material];
SCNNode *node = [SCNNode nodeWithGeometry:cube];
node.physicsBody = [SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeDynamic shape:nil];
node.physicsBody.mass = 1;
node.physicsBody.categoryBitMask = phsicBodyCategoryCube;
node.physicsBody.collisionBitMask = phsicBodyCategoryPlane;
node.physicsBody.contactTestBitMask = phsicBodyCategoryPlane;

//plane
self.planeGeometry = [SCNBox boxWithWidth:100 height:0.01 length:100 chamferRadius:0
plane.physicsBody = [SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeKinematic
                    shape: [SCNPhysicsShape shapeWithGeometry:self.planeGeometry options:nil]];
plane.physicsBody.categoryBitMask = phsicBodyCategoryPlane;
plane.physicsBody.collisionBitMask = phsicBodyCategoryCube;
plane.physicsBody.contactTestBitMask = phsicBodyCategoryCube;

2 回答

  • 0

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

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


    编辑:要研究的其他事项:

    • 使用 SCNPlane 而不是 SCNBox 作为您的楼层 . (注意,你可以创建形状与其可见几何形状不同的物理实体,如果有帮助的话 . )I 'm not sure about SceneKit' s,但很多物理引擎更容易检查“自上一帧以来有一些物体通过了这个无限边界吗?" than "在这个框架上的这个有限区域内有一些物体吗?“

    • 为移动物体启用精确碰撞检测 .

  • 1

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

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

相关问题