【问题标题】:Control an object by physics通过物理控制物体
【发布时间】:2014-10-31 03:28:39
【问题描述】:

我阅读了苹果文档(Scene Kit Vehicle)中的示例,他们在车辆上使用了 SCNPhysicsVehicle。 SCNPhysicsVehicle 允许设置速度、刹车和一切。我希望能够控制一个 SCNNode(包含一个 SCNSphere)。物理有什么办法做到这一点?

【问题讨论】:

  • 该示例代码从附加到汽车节点的物理主体创建一个SCNPhysicsVehicle。如果您想模拟具有包含球体的节点的车辆,请将物理主体附加到该节点并从该节点创建一个SCNPhysicsVehicle(与示例代码对其汽车节点所做的相同方式)。或者这不是你要问的?
  • @rickster 我不认为我的球体是载具,是吗?
  • 车辆是您制造的任何东西。 :) 您是否希望您的球体像车辆一样运行——也就是说,在发动机转速、转向和制动方面是可控的?如果是这样,请使用SCNPhysicsVehicle。否则,只要给它一个物理体,你就可以通过施加力、直接设置速度等来控制它。
  • @rickster 我不认为SCNPhysicsVehicle 适合我的情况:)。你如何施加力、速度等?我的意思是如何将我的操纵杆/加速度计连接到我的球体的物理上?在更新中?

标签: ios scenekit scnnode


【解决方案1】:

仅当您希望场景中的元素表现得像轮式车辆时才使用SCNPhysicsVehicle — 在发动机转速、制动和转向方面对其进行控制,并在其移动和枢轴转动时通过旋转的轮子来显示它随着它的转向。

要对场景中的元素进行更简单的基于物理的控制,请创建一个SNCPhysicsBody 并将其附加到您想要物理行为的节点。然后,为了让它运动,对其施加力或冲量,直接设置它的velocity,将它与其他物体一起设置为collide,或者让它因为场景的gravity 而落下。与物理学有关的事情太多了,无法在一个答案中找到答案——请阅读 SCNPhysicsBody Class Reference 以查看所有内容。

如果您专门寻找操纵杆/倾斜控制,即使如此,也有多种方法可供选择,具体取决于您正在寻找什么样的游戏“感觉”。但也有一些共同的主题:

您可以做的一件事是根据操纵杆方向对每一帧施加一个力;例如在您的更新方法中:

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 范围转换为对您的游戏有意义的单位。)

还有很多其他选项 - 例如,您可以自己计算得出操纵杆位置与当前方向/速度之间的增量 - 尝试一些选项以找出最适合您正在寻找的游戏玩法.

【讨论】:

  • 您的回答仍然很棒。你知道如何定义最大值吗?我想我可以用球体的速度来计算它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 2019-07-15
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多