2017-08-07 40 views
0

在我的情況下,當附加節點的尺度改變時,我需要更新物理體的尺度。然而,節點的規模變化後,節點的物理體總是身份。在打印節點的比例之後,我確信它包含新的值。sceneKit物理體的尺度不附加節點

我的代碼在這裏,它是樣本,不工作。當我收縮碰撞網格時,物理體仍然保持身份尺度的大小。

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; 

回答

1

與互聯網搜索的一些努力,我發現物理引擎通常不支持大規模transforms.There一些informations

我還發現通過零形狀參數+ bodyWithType:形狀:將工作正常。

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的物理模擬忽略包含物理模擬身體碰撞時,節點的 規模 財產。相反,使用此選項可在創建自定義物理形狀時提供比例因子。 (如果創建節點的物理體而不指定自定義形狀,則SceneKit使用該節點的縮放屬性在創建時推斷此比例因子。)

這解釋了爲什麼pass nil會起作用。在不指定形狀的情況下創建節點的物理體時,sceneKit會根據附加節點的幾何形狀自動計算形狀,這將考慮節點的比例變換。

您還可以使用選項SCNPhysicsShapeScaleKey指定比例因子。

+0

我希望我可以upvote你一百倍! – charlesrockbass