おそらく、誰かが素晴らしい古い学校の宇宙ゲームStar Control 2を覚えているでしょう。あるとき、私は、展開中の地球規模の大惨事を背景に探検されるべき未知の惑星を持つ巨大な星の地図に衝撃を受けました。 著者がソースコードを公開して以来、このゲームは新しい名前The Ur-Quan Mastersで最新のプラットフォームに移植されています。
ソースを調べてみると、惑星のテクスチャを生成する単純なアルゴリズムを発見し、同様のテクスチャを生成できるPythonプログラムを作成しました。
アルゴリズム
- 断層形成アルゴリズムを使用して高さマップを形成します( 「断層形成」 )
- 参照RGBカラーとそれらの間のグラデーションを使用して高さマップに色を付けます
高さマップの形成
- 生成された惑星のテクスチャと同じ次元の高さのマトリックスを作成します。 北は上、南は下、そしてマトリックスの水平線は惑星の平行に沿った円形スキャンです。 高さの値は0から255までしか変更できないため、グレーの濃淡で表示すると便利です
- マトリックスをベース標高で埋めます(例:128):
- 北から南へ2つのランダムなばらばらの線を生成します。 これらの線は「断層を形成します」-惑星の表面を2つの部分に分割します。1つは固定定数( 標高デルタ )に上げ、もう1つは同じ定数に下げます。 わかりやすくするために、定数を10にします。
- 前の段落を指定された回数繰り返します ( iterations num )。
以下の図では、10回の反復、100回の反復、1000回の反復:
RGBカラーで高さマップを着色する
- 高さの範囲全体(0から255)を、これらのパーツの境界上のN + 1の参照ポイントを使用して、N個のほぼ等しいパーツに分割します。
- 範囲の各参照ポイントのRGBカラーを設定します
- 範囲のすべての中間点のRGBカラーを計算し、アンカーポイント間の色成分を線形補間します。 つまり、高さを参照色間のグラデーションで塗りつぶします
- 惑星のテクスチャを生成し、DEMの各セルを前の段落で計算されたRGBカラーに置き換えます
同じ高さマップを着色するためのいくつかの可能なオプションは次のとおりです。
プログラム
プログラムを実行するには、 Python 2.7とそのためのいくつかのライブラリ( NumPy 、 PIL 、およびPyOpenGL)をインストールする必要があります。
プログラムはgitリポジトリからダウンロードできます: https : //github.com/barabanus/starcontrol
このプログラムは、 planet.py (テクスチャを生成)とspace.py (テクスチャを重ね合わせた回転する惑星を描画)の2つの独立したスクリプトで構成されています。
いくつかの管理機能:
- 参照色を変更するには、色の付いた正方形を左クリックします。 MacOSでは、ポップアップダイアログで、画面から色をサンプリングできます。
- 新しい参照色を作成するには、グラデーションを左クリックします
- 参照色を削除するには、色の付いた正方形を右クリックします
- テクスチャを保存するには、マウスの左ボタンでクリックします。 これは、このテクスチャで回転する惑星を描くスクリプトを実行します。
このプログラムはMacOSで作成され、WinXPでテストされました。 コードの誤りを見つけて修正したり、レンダリングを装飾したりする場合は、変更を書いて提案してください。