我阅读了苹果文档(场景套件车辆)中的示例,他们在车辆上使用了 SCNPhysicsVehicle。 SCNPhysicsVehicle 允许设置速度、刹车等一切。我希望能够控制一个SCNNode(包含一个SCNSphere)。物理上有什么方法可以做到这一点?
最佳答案
仅当您希望场景中的某个元素表现得像轮式车辆时才使用 SCNPhysicsVehicle
— 控制它的发动机速度、制动和转向,并用旋转的轮子显示它移动时转动,转向时转动。
为了对场景中的元素进行更简单的基于物理的控制,创建一个 SNCPhysicsBody
并将其附加到您想要物理行为的节点。然后,要使其运动,对其施加力或脉冲,直接设置其速度
,将其设置为collide。与其他 body 一起,或者由于场景的gravity
而让它掉落.与物理学有关的事情太多了,无法用一个答案来概括——阅读 SCNPhysicsBody Class Reference查看所有内容。
如果您正在寻找专门的操纵杆/倾斜控制,即使那样,也有多种方法可供选择,具体取决于您正在寻找什么样的游戏“感觉”。但是有一些共同的主题:
- 由于您需要持续控制,您可能需要轮询
renderer:didUpdateAtTime:
or one of the other render-loop methods. 中的输入 - 倾斜和操纵杆提供可变输入,因此您可能需要可变控制。无论你对物理 body 做什么,都应该通过加速度计输入或操纵杆进行缩放 axis value .
您可以做的一件事是根据操纵杆方向在每一帧上施加一个力;例如在你的更新方法中:
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 范围转换为对您的游戏有意义的单位。)
还有很多其他选项——例如,您可以自己计算得出操纵杆位置和当前方向/速度之间的差值——尝试一些选项,找出最适合您正在寻找的游戏玩法的选项.
关于ios - 用物理学控制一个物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26647351/