ios - sceneKit 物理主体的比例不符合附加节点

标签 ios scenekit

在我的情况下,当附加节点的比例发生变化时,我需要更新物理体的比例。但是,节点的尺度变化后,节点的物理体始终是同一体。打印节点的比例后,我确定它包含新值。

我的代码在这里,它是示例,不能工作。当我缩小 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/

相关文章:

ios - 在 Xcode 4 中创建静态库

ios - 使用 Alamofire 在主体中使用简单字符串的 POST 请求

html - 通过 safari 启动 IMDb iOS 应用程序 - 它接受命令吗?

swift - 未调用方法renderer(_:didAdd节点:,用于 anchor :)

ios - ARKit 面部跟踪 SceneKit 对象移动不正确

ios - 导入的 blender 模型旋转不正确

objective-c - 我想知道是否需要在项目的某些文件中通知 URL 网络服务(我的应用程序访问的)

ios - 使用 AFNetworking 加载离线缓存的 JSON

swift - 在 ARKIt 中使用 SCNFloor

animation - SceneKit Swift3 编译器错误