在场景套件中使用铰链接头进行奇怪的摇动

时间:2014-07-13 01:24:25

标签: ios scenekit

我正在努力建立一个带炮塔的坦克,但由于这个联合整个模型正在震动,你有什么想法导致这种行为吗?

项目链接: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];

2 个答案:

答案 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属性设置它)。

如果父/子层次结构正确,你甚至不需要在这种情况下使用关节:)

我希望这会有所帮助。