我正在努力建立一个带炮塔的坦克,但由于这个联合整个模型正在震动,你有什么想法导致这种行为吗?
项目链接:Project
这就是我的成就:
SCNNode *tankNode = [extraScene.rootNode childNodeWithName:@"Main_Body" recursively:YES];
[tankNode setScale:SCNVector3Make(0.003, 0.003, 0.003)];
[tankNode setPosition:SCNVector3Make(0, 1, 0)];
[tankNode setPhysicsBody:[SCNPhysicsBody dynamicBody]];
[tankNode setRotation:SCNVector4Make(0, 1, 0, -M_PI_2)];
[scene.rootNode addChildNode:tankNode];
SCNNode *turretNode = [tankNode childNodeWithName:@"Turret" recursively:YES];
turretNode.physicsBody = [SCNPhysicsBody staticBody];
SCNNode *gunNode = [turretNode childNodeWithName:@"gun" recursively:YES];
gunNode.physicsBody = [SCNPhysicsBody staticBody];
SCNPhysicsHingeJoint *gunJoint = [SCNPhysicsHingeJoint jointWithBodyA:turretNode.physicsBody axisA:SCNVector3Make(0,0,1) anchorA:SCNVector3Make(0.1,0.1,0.1) bodyB:gunNode.physicsBody axisB:SCNVector3Make(0,0,1) anchorB:SCNVector3Make(0.1,0.1,0.1)];
[scene.physicsWorld addBehavior:gunJoint];
SCNPhysicsHingeJoint *turretJoint = [SCNPhysicsHingeJoint jointWithBodyA:turretNode.physicsBody axisA:SCNVector3Make(0,1,0) anchorA:SCNVector3Make(0.1,0.1,0.1) bodyB:tankNode.physicsBody axisB:SCNVector3Make(0,1,0) anchorB:SCNVector3Make(0.5,0.5,-0.1)];
[scene.physicsWorld addBehavior:turretJoint];
答案 0 :(得分:1)
我认为有两个问题:
答案 1 :(得分:0)
我只是在这里猜测,但我想象你在tankNode的物理体内放置了一个关节,因为你已经缩放了tankNode,而不是它的物理形状。
记住缩放SCNNode不会缩放其物理形状。
如果您需要缩放坦克:确保您也可以缩放物理体 -
SCNVector3 Scale=SCNVector3Make(0.003, 0.003, 0.003);
然后你的物理形状应该缩放:
NSDictionary *options=[NSDictionary dictionaryWithObject:
[NSValue valueWithSCNVector3:Scale] forKey:SCNPhysicsShapeScaleKey];
现在从缩放形状创建一个物理体:
SCNPhysicsShape *physicsGeometry=[SCNPhysicsShape shapeWithGeometry:tankNode.geometry options:options];
最后将物理形状添加到坦克
tankNode.physicsBody=[SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeDynamic shape:physicsGeometry];
你的物理身体和坦克节点现在大小相同。
如果你需要大炮和炮塔上的物理,即大炮需要碰撞,就可以用同样的方式创建它的物理身体。
你的代码会建议炮塔和枪是坦克的孩子。最好/最简单的方法是将炮塔置于炮中,这样枪就是炮塔的一个孩子,然后将炮塔放在坦克上。这样,移动坦克移动枪,炮塔和坦克,移动炮塔移动炮塔和枪,移动枪只移动枪。
同样在您的3d创作软件中,不要忘记将枢轴移动到每个节点所需的旋转中心(或使用SCNNode.pivot属性设置它)。
如果父/子层次结构正确,你甚至不需要在这种情况下使用关节:)
我希望这会有所帮助。