【问题标题】:sceneKit dynamic physic body fall through floorsceneKit 动态物理身体从地板上掉下来
【发布时间】:2017-12-10 10:13:24
【问题描述】:

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

问题是:当立方体很小或很轻时,它只是通过平面。例如,立方体有 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;

【问题讨论】:

  • 您尝试过更改physicsWorld.timeStep 的值吗?
  • 不,我没有改过。

标签: ios 3d scenekit arkit


【解决方案1】:

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

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


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

  • 为您的楼层使用SCNPlane 而不是SCNBox。 (请注意,如果有帮助,您可以创建形状与其可见几何形状不同的物理主体。)我不确定 SceneKit,但对于许多物理引擎来说更容易检查“有 some object 自上一帧以来通过这个无限边界?"比“在这个框架上的这个有限区域内有某个对象吗?”
  • 为您的移动物体启用精确的碰撞检测。

【讨论】:

  • 非常感谢!我误解了 SCNPhysicsBodyTypeKinematic。但是当我尝试 SCNPhysicsBodyTypeStatic 时,立方体仍然穿过地板。
【解决方案2】:

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

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

【讨论】:

  • 您好,您能否提供更多有关您如何解决问题的信息。
【解决方案3】:

仅适用于球形物理形状

对于这个问题SCNPhysicsBody有特殊属性:continuousCollisionDetectionThreshold

例如,在一个涉及射弹和目标的游戏中,一个小的 如果射弹移动得比目标更远,它可能会穿过目标 一个时间步内目标的厚度。通过设置弹丸的 ContinuousCollisionDetectionThreshold 来匹配它的直径,你 确保 SceneKit 始终检测到弹丸之间的碰撞 和其他对象。

【讨论】:

    猜你喜欢
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2014-09-18
    • 2018-08-19
    相关资源
    最近更新 更多