在我的情况下,当附加节点的比例发生变化时,我需要更新物理体的比例。但是,节点的尺度变化后,节点的物理体始终是同一体。打印节点的比例后,我确定它包含新值。
我的代码在这里,它是示例,不能工作。当我缩小 collisionMesh 时,物理体仍然保持同一尺度的大小。
SCNNode *collisionMesh = childNode;
collisionMesh.scale = self.selectedRsc.scale;
NSLog(@"selectedRsc:%@",aimNode);
NSLog(@" selectedRsc scal:%@",[NSValue valueWithSCNVector3: aimNode.scale]);
NSLog(@" collisionMesh scal:%@",[NSValue valueWithSCNVector3: collisionMesh.scale]);
SCNPhysicsBody *body = [SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeKinematic shape:[SCNPhysicsShape shapeWithGeometry:collisionMesh.geometry options:nil]];
body.categoryBitMask =bitmaskCollision;
collisionMesh.physicsBody = body;
最佳答案
通过在互联网上搜索,我发现物理引擎通常不支持比例变换。有一些 informations .
我还发现将 nil 传递给 +bodyWithType:shape: 的 shape 参数可以正常工作。
SCNNode *collisionMesh = childNode;
collisionMesh.scale = self.selectedRsc.scale;
NSLog(@"selectedRsc:%@",aimNode);
NSLog(@" selectedRsc scal:%@",[NSValue valueWithSCNVector3: aimNode.scale]);
NSLog(@" collisionMesh scal:%@",[NSValue valueWithSCNVector3: collisionMesh.scale]);
//this will work fine, physics body will get correct scale.
SCNPhysicsBody *body = [SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeKinematic shape:nil];
body.categoryBitMask =bitmaskCollision;
collisionMesh.physicsBody = body;
所以我进一步挖掘了苹果的文档并注意到了这个描述。 根据SCNPhysicsShapeScaleKey reference
SceneKit’s physics simulation ignores the scale property of nodes containing physics bodies when simulating collisions. Instead, use this option to provide a scale factor when creating custom physics shapes. (If you create a physics body for a node without specifying a custom shape, SceneKit uses the node’s scale property to infer this scale factor at creation time.)
这解释了为什么 pass nil 会起作用。在不指定形状的情况下创建节点的物理体时,sceneKit 会根据附加节点的几何形状自动计算形状,这将考虑节点的比例变换。
您还可以使用 SCNPhysicsShapeScaleKey
选项指定比例因子。
关于ios - sceneKit 物理主体的比例不符合附加节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45551402/