2

複数の惑星を持つゲームを作っています。今、私はそれらの位置をランダムに生成したいので、それらが互いに近すぎないようにして衝突しないようにする必要があります.

各惑星には半径があるため、各惑星間の距離は次のようになります。それ自身の半径 + 他の惑星の半径 + 小さなオフセット。また、互いに離れすぎず、できるだけ近くにあるとよいでしょう。

最初の惑星を 0,0,0 に配置することから始めます。次に、2番目は簡単に計算できます(ランダムな方向と距離だけです)。3番目も実行可能ですが、その後は困惑しています。

ここで何か助けはありますか?Unityを使っているのでポジションはVector3、C#で作業しています。

どうもありがとう!

4

1 に答える 1

2

私は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を追加しましたが、現在は確認できません。概念を明確にするためだけにあり、確実に改善できます。

于 2012-11-11T00:35:49.620 に答える