找到足够远的位置

时间:2012-11-10 16:34:38

标签: c# position unity3d distance

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

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

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

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

非常感谢!

1 个答案:

答案 0 :(得分:2)

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

你可以实现它,考虑到你想放置的每个星球都“取决于”来自父母,不管怎样,太阳被排除在外并放置在原点。

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

使用这个简单的方案,你总是需要管理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>>半径(>>我的意思是真的“真的更大”,而不仅仅是“更大”)

这也应该为你提供最强大的“行星链”来处理,也许还有递归功能。

作为最后一步,您可以“渲染”他们在所有链中行走的位置,以增量方式将PlanetX位置添加到父级位置,仅处理OrbitAngle;你需要一些Sin / Cos数学,但你不会放松比例因子。

希望这有帮助

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