Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios sceneKit动态物理身体穿过地板_Ios_3d_Scenekit_Arkit - Fatal编程技术网

Ios sceneKit动态物理身体穿过地板

Ios sceneKit动态物理身体穿过地板,ios,3d,scenekit,arkit,Ios,3d,Scenekit,Arkit,我有一个具有动态物理体的立方体和一个具有运动物理体的平面。当我将立方体放置在平面上方时,它将落在平面上,并且预计会反弹 问题是:当立方体很小或很轻时,它只是穿过平面。例如,立方体的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 = [SC

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

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

我很惊讶你会遇到碰撞。请参见–运动学类型适用于移动(通过设置其位置等)以引起碰撞,但自身不受其他实体碰撞影响的实体

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


编辑:要查看的其他内容:

  • 在地板上使用
    SCNPlane
    而不是
    SCNBox
    。(请注意,如果有帮助的话,您可以创建形状不同于其可见几何体的物理实体。)我不确定SceneKit的形状,但对于许多物理引擎来说,检查“自上一帧以来是否有某个对象通过此无限边界?”比检查“此帧上此有限区域内是否有某个对象”更容易
  • 为移动对象启用精确碰撞检测
最后我发现这都是关于SceneKit的物理模拟。如果立方体下落过快,它将在物理模拟步骤中与平面进行大的穿透。在这种情况下,sceneKit只是让它穿过飞机而不是碰撞。当我将立方体的速度更改为一个小值时,它与平面发生碰撞


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

仅适用于球形物理形状

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

例如,在涉及投射物和目标的游戏中,一个小的 如果射弹的移动距离超过目标距离,则射弹可能会穿过目标 一个时间步长内的目标厚度。通过设置射弹的 continuousCollisionDetectionThreshold以匹配其直径,您可以 确保SceneKit始终检测弹丸之间的碰撞 和其他物体


您是否尝试过更改
物理世界.timeStep
值?不,我没有更改。非常感谢!我误解了SCNPhysisbodytype。但当我尝试使用SCNPhysicsByTypeStatic时,多维数据集仍然会穿过地板。嗨,你能提供一些关于如何解决问题的更多信息吗。