手続き型惑星、高さマップ、テクスチャ


19

現在、OpenGL手続き型惑星ジェネレーターに取り組んでいます。プレイヤーが惑星の表面に降りることができないスペースRPGにそれを使用したいので、ROAMに関連するものはすべて無視しました。現時点では、VBOで立方体を描き、球体にマッピングしています。

私はほとんどのフラクタルハイトマップ生成技術に精通しており、すでに独自のバージョンのミッドポイントディスプレイスメントを実装しています(この場合、私は知っているわけではありません)。

私の質問は、手順でハイトマップを生成する最良の方法は何ですか。タイル可能なハイトマップ/テクスチャを作成できるlibnoiseを見てきましたが、見る限りではこのようなネットを生成する必要があります。

タイルを明らかにする。

最適なルートを教えてください。

どんな入力でも大歓迎です。

回答:


18

最初に、人々が着陸できない場合に高さマップ(つまり、ジオメトリの変位)を実装する理由がわかりません。通常のマップまたは何かをマップする方が効率的です。

とはいえ、あなたが望むのは、任意(x, y, z)から(u, v)座標に変換することです。これは簡単です。キューブマップは必要ありません。

代替テキスト

代替テキスト

  1. すべての(u, v)テクセルには、高さ(heightmap RGB = height)と位置があり(x, y, z) = posます。
  2. 位置を見つけて正規化しNORMAL(x, y, z) = Nます。
  3. 新しい頂点= pos+N*height

これは、テッセレーションが高いほどうまく機能します。またlibnoise、ハイトマップに適切な球面マッピングを使用します。これは次のようになります(ただし、白黒)。

代替テキスト



1

中点変位の高さマッピングは、開始するのに適した場所です。OP、なぜそうではないと思いますか?

OPは、平面マップ(例:メルカトル図法)が数学的にugく複雑な歪みを持つため、惑星表面をキューブマップとしてモデル化するのに適しています。

私がOPだった場合、最初は大規模な惑星形状を忘れていました。各面が2 ** N + 1ピクセル(2,3,5,9,17,33 ...)で、各テクセルが高さ[0..N)をエンコードするキューブマップを作成します。0は高度です予想される最低のトレンチとNは、惑星で予想される最高の山の高度です。

次に、立方体の8つの頂点のランダムな高さを計算し、それらを立方体マップの6つの正方形に伝播して、各頂点が3回表示されるようにします。

エッジの中点のフラクタルの高さを再帰的に生成するとき、フェースエッジの頂点を、それらを共有する他のフェースに伝播するようにします。

完了すると、すべてのエッジテクセルが2倍になり、すべてのコーナーテクセルが3倍になるキューブマップが作成されます。法線マップに変換する必要はありません。MortenMikkelsenの論文のアルゴリズムを使用して、実行時にハイトマップから法線を直接レンダリングします。

実行時に、おそらくスクリーンへの惑星の投影をカバーするクワッドをレンダリングし、ピクセルシェーダーで単一の光線と球の交差テストを実行して、惑星に衝突するかどうか、どこで衝突するかを見つけます。確かに、高度にテッセレーションされた球体モデルをラスタライズし、滑らかなエッジも得られます。


1

ピクセルの絶対経度で最大変位をスケーリングした中点変位ノイズは、球面ノイズマップをすばやく生成できます。高度、勾配、日光または経度をパラメータとして使用するカラーテーブルを使用して、惑星を自動的にシェーディングすることができます。

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