我正在制作一个有多个行星的游戏。现在我想随机生成他们的位置,所以我需要确保它们彼此不太靠近,这样它们就不会相互碰撞,因为你们应该能够看到所有这些,所以它们之间的距离太远了。
每个行星都有一个半径,所以每个行星之间的距离应该是:它自己的半径+任何其他行星的半径+一个小的偏移量。如果他们离彼此不太远,那就太好了。
我首先将第一颗行星放置在0,0,0。然后第二个很容易计算(只是一个随机方向,然后是距离)。第三个也是可行的,但在那之后我很难过。
这里有什么帮助吗?我正在使用Unity,所以位置是Vector3,我在c#中工作。
非常感谢!
答案 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,现在无法验证它,只是在那里澄清概念并且可以肯定地进行改进。