我阅读了苹果文档(Scene Kit Vehicle)中的示例,他们在车辆上使用了 SCNPhysicsVehicle。SCNPhysicsVehicle 允许设置速度、刹车和一切。我希望能够控制一个 SCNNode(包含一个 SCNSphere)。物理有什么办法做到这一点?
1 回答
SCNPhysicsVehicle
仅当您希望场景中的元素表现得像轮式车辆时才使用- 在发动机速度、制动和转向方面控制它,并通过在移动时旋转和在转向时旋转的轮子来显示它。
要对场景中的元素进行更简单的基于物理的控制,请创建一个SNCPhysicsBody
并将其附加到您想要物理行为的节点。然后,为了让它运动,对它施加力或冲量,直接设置它velocity
,设置它与其他物体碰撞,或者只是让它由于场景的gravity
. 与物理学有关的事情太多,无法在一个答案中找到——阅读SCNPhysicsBody 类参考以查看所有内容。
如果您正在寻找专门的操纵杆/倾斜控制,即使如此,也有多种方法可供选择,具体取决于您正在寻找什么样的游戏“感觉”。但是有一些共同的主题:
- 由于您想要连续控制,您可能想要轮询输入
renderer:didUpdateAtTime:
或其他渲染循环方法之一。 - 倾斜和操纵杆提供可变输入,因此您可能需要可变控制。无论您对物理主体做什么,都应根据加速度计输入或操纵杆轴值进行缩放。
您可以做的一件事是根据操纵杆方向在每一帧上施加一个力;例如在您的更新方法中:
GCControllerAxisInput *joystickX = controllers[0].extendedGamepad.xAxis;
[sphereNode.physicsBody applyForce:SCNVector3(xAxis.value * SCALE_FACTOR, 0, 0) impulse:NO];
使用此选项,在一个方向或另一个方向上握住操纵杆就像发射推进器:您在特定方向上握住操纵杆的时间越长(越强),您的球体就会移动得越来越快。而且你必须在相反的方向上尽可能多地握住操纵杆,以施加足够的反作用力来阻止那件疯狂的事情。
另一种方法是直接设置速度:
sphereNode.physicsBody.velocity = SCNVector3(xAxis.value * SCALE_FACTOR, 0, 0);
使用此选项,当您不推杆时,球体保持静止,并且您将杆推得越远,球体移动得越快,最高速度可达SCALE_FACTOR
.
(在这两个示例中,SCALE_FACTOR
都将操纵杆的 -1 到 1 范围转换为对您的游戏有意义的单位。)
还有很多其他选项——例如,你可以自己计算得出操纵杆位置和当前方向/速度之间的增量——尝试一些选项来找出最适合你正在寻找的游戏玩法的选项。