【问题标题】:Constant orbit using physics in Unity3D在 Unity3D 中使用物理的恒定轨道
【发布时间】:2013-02-01 13:42:37
【问题描述】:

我正在玩 Unity3D 并向场景中的对象添加物理效果。我目前在屏幕中心有一个球体(行星),并且我有另一个球体(月亮)位于它的外面,它没有移动。当我运行游戏时,我希望月球通过施加力来绕行星运行。我已经能够通过调用rigidbody.AddForce() 来获得添加的力,这会将其移动到指定的方向,但不会绕行。我不确定如何对其施加力,以便它以恒定的速度连续围绕球体运行。

我尝试了一些使用ConfigurableJoint 的示例,它会在轨道上运行,但它开始会弹跳一点,然后开始运行。我的目标是让一堆轨道卫星以自己的速度运行,它们能够相互反弹,但不会失去速度。

有什么想法吗?

【问题讨论】:

  • 实际上,您会在月球上不断向行星施加力,而月球的初始速度大致垂直于该力。但是,不能保证轨道会稳定。尤其是当卫星开始相互反弹时。联合可能是一种更实用的方法。不确定“弹跳”是什么意思。
  • +1 就像 Ginosaji 所说,我的第一个想法是使用来自现实世界的已知公式,Newtons gravitation lawCentripetal force。设置Bounciness = 1并希望它不会太生涩
  • 我知道它没有使用您想要的物理,但 Transform.RotateAround 会起作用吗? docs.unity3d.com/Documentation/ScriptReference/…
  • 嗯,我现在可能会继续走Joints 的道路,看看我能从中学到什么……@Shredder2500 我最初使用的是Transform.RotateAround(),但后来我决定我想要物理和逼真的碰撞响应。

标签: c# unity3d game-physics


【解决方案1】:

要让月球绕轨道运行,您需要给月球一个初始速度。然后让它向行星加速,这是一个恒定的力。

gameObject.rigidbody.AddForce(1, 0, 0);
gameObject.constantForce.relativeForce = Vector3(0, 1, 0);

【讨论】:

    【解决方案2】:

    一般而言,您最终会失败,因为您的积分方法中的舍入错误会使您慢慢脱离轨道。您可以按照建议的方式非常接近,但您可以考虑做一些更像 Kerbal Space Program 的事情,它似乎将轨道预先计算为椭圆,然后跟随该椭圆,直到它有理由相信它应该停止,而不是严格“模拟”轨道...

    如果发生碰撞,请让普通物理学解决碰撞问题,然后根据结果重新计算您的新轨道并开始跟踪。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      相关资源
      最近更新 更多