在我的情况下,当附加节点的比例改变时,我需要更新物理体的比例。然而,在节点规模改变之后,节点的物理体始终是身份。打印节点的比例后,我确定它包含新值。
我的代码在这里,它是样本而不是工作。当我收缩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;
答案 0 :(得分:4)
通过在互联网上搜索,我发现物理引擎通常不支持缩放变换。有一些informations。
我还发现传递nil到形状参数+ bodyWithType: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;
所以我进一步挖掘了苹果的文档并注意到了这个描述。 根据{{3}}
SceneKit的物理模拟忽略了 规模 模拟碰撞时包含物理实体的节点的属性。相反,使用此选项可在创建自定义物理形状时提供比例因子。 (如果为节点创建物理主体而未指定自定义形状,则SceneKit使用节点的scale属性在创建时推断此比例因子。)
这解释了为什么传递nil会起作用。当创建节点的物理主体而不指定形状时,sceneKit会自动计算基于附加节点几何的形状,这将考虑节点的比例变换。
您还可以使用SCNPhysicsShapeScaleKey
选项指定比例因子。