SceneKit 动态物理身体从地板上掉下来

ooO*_*lly 5 3d ios scenekit arkit

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

问题是:当立方体小或轻的,只是经过plane.For例如,立方体有0.1 * 0.1 * 0.1,做工精细而在0.05 * 0.05 * 0.05 sucks.In这种情况下,我仍然可以物理接触身体的通知。

这是我创建几何的代码:

//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;
Run Code Online (Sandbox Code Playgroud)

ric*_*ter 1

我\xe2\x80\x99让你感到惊讶\xe2\x80\x99竟然发生了冲突。请参阅SCNPhysicsBodyType 文档\xe2\x80\x93 运动学类型适用于您移动(通过设置其位置等)以引起碰撞的物体,但 \xe2\x80\x99 本身不会受到与它们碰撞的其他物体的影响。

\n\n

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

\n\n
\n\n

编辑:其他需要调查的事情:

\n\n
    \n
  • 使用 aSCNPlane而不是 aSCNBox来表示您的地板。(请注意,如果有帮助的话,您可以创建形状与其可见几何形状不同的物理体。)我不确定 SceneKit 的情况,但对于许多物理引擎来说,检查“有一些物体自上一帧以来就通过了这个无限边界?” 而不是“这个框架上的这个有限区域内是否有某个物体?”
  • \n
  • 为移动物体启用精确的碰撞检测。
  • \n
\n

  • 多谢!我误解了 SCNPhysicsBodyTypeKinematic。但是当我尝试 SCNPhysicsBodyTypeStatic 时,立方体仍然穿过地板。 (2认同)