無限の宇宙をレンダリングする方法は?


15

ゲーム開発業界で3Dユニバースをレンダリングするためのベストプラクティスは何ですか?

具体的には:

  • データポイントが与えられ、静的です。各ポイントには位置、色、サイズがあります。
  • データセット全体は、使用可能なメモリよりもはるかに大きくなります。
  • ユーザーは、より大きな画像を一度に「ズームアウト」できる必要があります。

最も素朴なアプローチは、ユニバースをキューブに分割し、目に見えるものだけをレンダリングすることです。このシナリオで「ズームアウト」をどのように実装する必要があるのか​​わかりません。可能なズームレベルごとにキューブを事前に計算する必要がありますか?または、より良いアプローチがありますか?

テクノロジーにとらわれないソリューションを探しています。


2
ある種の最大表示距離を計画していますか、それとも個々の点をレンダリングする必要がないように遠い点をマージする方法がありますか、または「点」が不透明でほとんどの点が配置されるように配置されています特定の視点から隠されている?上記のいずれにも当てはまらない場合、ほとんどのポイント(または少なくともそれらのかなりの部分)が同時に表示されるカメラアングルをユーザーが見つけられないようにする方法がありません。
イルマリカロネン

4
ちなみに、少しエキゾチックですが、手続き的に生成されたデータを検討しましたか?カスタムクラフトエリアの利点はありませんが、結果は大量のデータではなく方程式に基づいているということです。創造性があれば、多くのことを単純化できます(:
アランウルフ

1
のズームアウト/ズームインは、infinite universe異なるレベルにズームした後、マンデルブロ曲線の2つのポイント間の関係を追跡することに似ています。あるレベルでは、精度を失い、それらを区別したり、再度見つけることさえできなくなります。
user2338816

1
@AlanWolfeカスタムクラフティングは依然として可能です-最前線の例は、フロンティアの古いゲームで、約1000の星またはソル(ソルとその実際の惑星と衛星を含む)に最も近い星の位置がありました。手続き的に生成されない場所にあることを確認し、別の「レイヤー」として追加します。
ルアーン

@IlmariKaronenはい、あなたは正しいです。最大の表示距離があり、
明唐

回答:


8

これは、私の推測とCelestiaのソースコードのスキミングに基づいています。

Celestiaを使用すると、惑星の周りを飛び回り、ズームアウトして銀河全体を見ることができます。ソースコードを参照したところ、octreeを使用していることがわかりました。これは、スペースを再帰的に8つのオクタントに分割する構造です。

レンダラーは、octreeをトラバースすることで環境をレンダリングし、遠くのオブジェクトを深くトラバースしません。

Celestiaは、オクタントの絶対光度も追跡します。オクタントの絶対光度は、オクタント内の星の絶対光度に基づいています。オクタントが互いに近い場合、セレスティアは星を個別にレンダリングし、オクタントが遠くにある場合、セレスティアはオクタントをオクタントの大きさの星としてレンダリングします。

また、オブジェクトに関連付けられた意味のある階層がある場合があります。たとえば、星に近い場合(データベースで半径が宣言されている場合)、その惑星はレンダリングされます。惑星が十分に近い場合(画面上のピクセルのカットオフ)、その3Dモデルが描画されます。

他の宇宙ゲームには、OrbiterとKerbal Space Programがあります。これらはクローズドソースです。また、手続き的にスターマップを生成したフロンティアギャラクシーも調べました。その分解によってゲームがどのように機能するかを分析するウェブサイトがありますhttp : //www.jongware.com/galaxy1.html


12

このパズルにはいくつかのピースがあり、それぞれが深く興味深いウサギの探検の穴を提供します。それらのいくつかは次のとおりです。

  • 詳細レベル-詳細なモデルまたは単純化されたモデル、スプライトまたは単なるドット、あるいは遠くにあるオブジェクトに対して自動的に(または「手動で」)選択します。
  • カリング-必要なものだけを描くことを選択します。これは、視野内にあるもの(錐台カリング)、他のものに隠れていないもの(オクルージョンカリング)、または他のアドホックな方法かもしれません。(@Alan Wolfeの答えは、カリングを容易にするのに役立つデータを整理する方法のいくつかを説明しています。)
  • ストリーミング-すべてのデータが一度にメモリに収まらない場合、必要に応じてストレージからメモリにワールドデータを取得します
  • スカイボックス-非常に遠いオブジェクトは、カメラから「無限の距離」にある球体に事前にレンダリングできます。

そして、あなた自身の秘密のソースは、特定のアプリケーションのニーズに基づいて、これらの組み合わせ、および他のテクニックをいつどのように使用するかです。


2

階層的および/またはスパースのいずれかがここで役立ちます。

空きスペースが多いため、空きスペースを表すためにストレージを使用する必要はありません。典型的な階層的アプローチは、Octツリーのようなもので、スペースを再帰的に8つの小さなキューブに分割し、オブジェクトが完全に占めることができる最小のキューブにオブジェクトを格納できます。

octreeは、視錐台内のすべてのオブジェクトのリストを照会できるので、視野角内にあり、あまり遠くないオブジェクトのみのリストを取得できるため、非常に優れています。スパースソリューションは、任意のx、y、zの場所に関する情報を要求できるスパースグリッドのようなものですが、空スペースではないセルの情報のみを保存する必要があります。

使用される他の一般的な階層的アプローチには、bspツリー(スペースを再帰的に2つの半分のスペースに分割する)と同様のkdツリーが含まれます。

個人的には、octreeが良い出発点になると思います。空きスペースにメモリを無駄にしないように、必要なだけ深く分割するようにしてください。また、静的オブジェクトと動的オブジェクトで異なるソリューションが必要になる場合があります。

一部のソリューション(bspなど)は非常に効率的ですが、構築に時間がかかるため、通常、オブジェクトの移動/変更には適していません。

これがお役に立てば幸いです。詳細について質問がある場合はお知らせください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.