【问题标题】:Find position far enough away找到足够远的位置
【发布时间】:2012-11-10 16:34:38
【问题描述】:

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

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

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

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

非常感谢!

【问题讨论】:

    标签: c# position unity3d distance


    【解决方案1】:

    我不使用 unity,但我认为这个问题不是 unity/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,现在无法验证,只是为了澄清概念,肯定可以改进。

    【讨论】:

    • 我喜欢这个解决方案,我只是在想随机的位置,虽然这给人一种自然的感觉(有太阳和所有)。甚至可以让它们四处移动,我什至没有首先想到,但可能非常酷。谢谢!你不仅给了我一个解决方案,还给了我一些很酷的新东西来思考:D
    • 我很高兴它有帮助,玩得开心 ;-)
    猜你喜欢
    • 1970-01-01
    • 2018-09-10
    • 2021-06-03
    • 2018-07-18
    • 1970-01-01
    • 2022-12-24
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多