gpt4 book ai didi

c# - 找到足够远的位置

转载 作者:太空宇宙 更新时间:2023-11-03 11:13:33 25 4
gpt4 key购买 nike

我正在制作一个有多个行星的游戏。现在我想随机生成它们的位置,所以我需要确保它们不会靠得太近以免发生碰撞,也不会离得太远,因为您应该能够看到它们。

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

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

我该如何开始?我使用的是 Unity,所以位置是 Vector3,我在 C# 中工作。

最佳答案

我不使用 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;你在这里需要一些 Sin/Cos 数学,但你不会因比例因子而丢失。

编辑

我添加了一种CalculatePosition,现在无法验证,只是为了理清概念,肯定可以改进。

关于c# - 找到足够远的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13323825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com