2

我正在尝试加入一个带炮塔的坦克,但由于这个联合,整个模型都在摇晃,你知道是什么导致了这种行为吗?

项目链接:项目

这就是我做到的:

    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];
4

2 回答 2

1

我认为有两个问题:

  • 您正在分配一个节点与其子节点之一(炮塔和坦克)之间的约束。这不太可能给出预期的结果,因为子节点的位置是相对于其父节点的(假设约束移动父节点,它也会移动子节点)。
  • 您正在两个静态物体(枪和炮塔)之间分配约束 - 这应该没有效果
于 2014-07-13T23:54:34.853 回答
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];

您的物理体和 Tank 节点现在大小相同。

如果您需要对大炮和炮塔进行物理处理,即大炮需要碰撞,请以相同的方式创建其物理体。

您的代码表明炮塔和枪是坦克的孩子。最好/最简单的方法是将炮塔作为主炮,使炮成为炮塔的子级,然后将炮塔作为坦克的父级。这样一来,动坦克就动枪、炮塔和坦克,动炮塔就动炮塔和火炮,动炮只动火炮。
此外,在您的 3D 创作软件中,不要忘记将枢轴移动到每个节点所需的旋转中心(或使用 SCNNode.pivot 属性设置它)。

如果父/子层次结构正确,您甚至根本不需要使用关节:)

我希望这有帮助。

于 2015-02-06T16:30:21.247 回答