我有一个具有动态物理体的立方体和一个具有运动物理body.When的平面,我把一个立方体放置在平面上,它会落在平面上,并且会反弹。
问题是:当立方体很小或很轻时,它只是通过plane.For实例,立方体有0.1*0.1*0.1工作良好,但是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;发布于 2017-07-07 03:13:19
我很惊讶你竟然会有碰撞。参见SCNPhysicsBodyType文档 --运动类型是指你移动的物体(通过设置它们的位置等)会引起碰撞,但它们本身不会受到其他物体与它们碰撞的影响。
如果将地板类型设置为静态,可能会看到更好的结果。静止物体不会移动(不管是物理相互作用的结果,还是你设置的位置),所以物理引擎可以更准确地检查其他物体是否与它相撞。
编辑:需要查看的其他内容:
SCNPlane而不是SCNBox。(请注意,如果这有帮助的话,您可以创建形状不同于其可见几何形状的物理体。)我不确定SceneKit的情况,但是很多物理引擎比较容易检查“从上一帧开始某个对象是否通过了这个无限的边界?”而不是“这个框架上这个有限区域内的某个物体吗?”发布于 2017-07-14 03:05:22
最后,我发现这与SceneKit的物理模拟有关。如果立方体落得太快,它就会在物理模拟步骤中与平面产生很大的穿透。在这种情况下,sceneKit只是让它通过飞机而不是碰撞。当我把立方体的速度改变为一个小值时,它就会与平面相撞。
我的解决办法是,当发生大侵彻时,给立方体一个向上的速度,也就是下降速度的30%。诀窍是调整立方体的速度,直到碰撞发生。
发布于 2019-03-03 07:48:53
只适用于球形物理形状
对于这个问题,SCNPhysicsBody具有特殊属性:continuousCollisionDetectionThreshold
例如,在涉及射弹和目标的游戏中,如果一个小弹丸在一段时间内移动到比目标厚度更远的地方,它可能会通过目标。通过设置弹丸的continuousCollisionDetectionThreshold以匹配其直径,您可以确保SceneKit总是检测弹丸与其他对象之间的碰撞。
https://stackoverflow.com/questions/44948313
复制相似问题