Sphere World実装C ++
-
19-08-2019 - |
質問
胞子や無限大にあるが、胞子の中間段階のない球面世界や、無限大宇宙のような複数の世界など、球面世界を実装、保存、レンダリングする最良の方法は何でしょうか。惑星自体がどのように生成されるか、またはそのサイズ/スケールについては仮定しません。
解決
レンダリングでは、惑星の表面から遠くにシームレスに移動するために、何らかの詳細レベルのアルゴリズムを使用する必要があります。多くの動的LODアルゴリズムがあります(こちらを参照)。 ROAMと呼ばれる古いアルゴリズムは、球体または惑星を処理するように適合させることができます( spherical ROAM )。ジオメトリクリップマップは新しい、より一般的なアルゴリズムで、球面に適用できます同様 。
データの保存に関しては、テクスチャリング、ハイトマップなどの手順生成(必要に応じて)を検討することをお勧めします。これは、InfinityとSporeの処理方法に似ています。プロシージャルテクスチャについて少し読むことができますこちら。地形の複雑さ/現実性に応じて、プロシージャルハイトマップはよりシンプルになります。最も単純なレベルでは、perlinノイズ関数によって頂点の高さを単純に移動できます。
他のヒント
表面に関するデータを保存するものを探している場合は、 HEALpix をご覧ください。 。これは、天体コミュニティによって空(別の球面)のマッピング専用に開発されたソフトウェアです。
HEALpixは、表面の位置とサイズを記述するメッシュを作成し、それぞれにIDを割り当てます。次に、そのIDをキーまたはインデックスとして使用して、その特定のレベルについて必要な詳細にアクセスできます。
HEASpixは、隣接する表面領域を見つける方法を提供し、各メッシュポイントの中心と頂点の位置を提供できます。
これは、必要に応じて各面を細分化することができる階層メッシュであるため、理論的には、必要に応じてメッシュの一部を低解像度で、その他の部分をより詳細に表示できます。 (メモリ制限まで)無限に割り切れるという優れた特性があり、特定の解像度のグリッドの各ピクセルは、その解像度レベルの他のすべてのピクセルと同じ面積を持ちます。
配布パッケージには、おそらく必要のないものがたくさんありますが、コアライブラリは役に立つはずです。
これはおそらくあなたが探しているものではありません...しかし、一体何なのでしょう。良い話です。
昔、恐竜がまだ地球を歩き回っていて、メモリがキロバイト単位で測定されていた頃、私は惑星をフラクタルに生成するためにいくつかのソフトウェアで遊んでいました。
アイデアは、惑星を表す2NxNの長方形を作成することでした。惑星を半分に束ねて、毎回2つの半分を少しずつ移動します。 (ランダムな位相シフトと振幅を持つカットの正弦波。シフトのための別のランダムな正弦波。)あとで、低レベルの領域を水で満たし、残りを高度で色分けします。
次に、直径Nの球体を上部に配置して投影し、地図のNxN領域を球体の半分に巻き付けます。地図上で球体を移動すると、回転しているように見えました。