2

我正在制作一个有多个行星的游戏。现在我想随机生成它们的位置,所以我需要确保它们彼此不会太近,这样它们就不会发生碰撞,也不会彼此相距太远,因为你应该能够看到它们。

每个行星都有一个半径,所以每个行星之间的距离应该是:它自己的半径+任何其他行星的半径+一个小的偏移量。如果它们彼此之间的距离不太远,尽可能靠近,那就太好了。

我只是从将第一个行星放置在 0,0,0 开始。然后第二个很容易计算(只是一个随机方向,然后是距离)。第三个也是可行的,尽管在那之后我很难过。

这里有什么帮助吗?我正在使用 Unity,所以位置是 Vector3,我正在使用 c#。

非常感谢!

4

1 回答 1

2

我不使用统一,但我认为这个问题不是统一/c# 特定的。

考虑到您想要放置的每个行星都“依赖”于父级,您可以实施它,以某种方式,太阳被排除并放置在原点。

所以说,太阳它位于(0,0,0),Planet1 属于太阳并且它位于一定的半径距离,所以它有自己的半径和旋转角度(总是与它的父级相关)。行星 2 可能有太阳作为父母,所以它是一颗“行星”,或者来自行星 1,成为它的月亮。等等...

使用这个简单的方案,您总是需要管理 4 个可以轻松实现为类的东西,即(未经测试,我在这里没有编译器就编写了它,检查可能的语法错误):

public class Planet
{
  public Planet Parent;     //if null, I'm the first in chain
  public float OrbitRadius; //From my parent
  public float OrbitAngle;  //0-360 around my parent
  public float Radius;      //Planet size

  //EDIT:
  public Vector3 Position;

  public void CalculatePosition()
  {
    if(Parent == null) this.Position = new Vector(0, 0, 0);
    this.Position = Parent.Position + OrbitRadius + Math.Sin(OrbitAngle * Math.PI / 180.0f);  //Check if it has to be done for each vector component
  }

}

此外,您可以轻松实现太阳、行星、卫星、卫星的卫星 :-)

每次创建行星时,都会分配其父级,随机化类值,仅关注 OrbitRadius >> Radius(>> 我的意思是真的“真的更大”,而不仅仅是“更大”)

这也应该给你一个最强的“行星链”来处理,也许是递归函数。

作为最后一步,您可以“渲染”他们在整个链条中的位置,以增量方式将 PlanetX 位置添加到父位置,仅处理 OrbitAngle;你在这里需要一些正弦/余弦数学,但你不会因为比例因子而松懈。

希望这可以帮助

编辑:我添加了一种CalculatePosition,现在无法验证,它只是为了澄清概念并且肯定可以改进。

于 2012-11-11T00:35:49.620 回答