Blenderで地球を作成

ドイツのLasse Foster氏がBlenderのCyclesレンダー用でフォトリアルな地球大気シェーダーを作成・配布していた。気圧式(気圧や密度を求める式)に基づいて大気密度を計算するノードを組んだものらしい。

事前準備

Gumroadの該当ページでシェーダーの入ったblendファイルをダウンロードする。現時点で2.83用が最新なのでそれを選択してダウンロード。今回使用したバージョンはv2.93.2だが、それでも使えた。価格は任意なので0でも大丈夫(だが気に入ったら支払うとよいだろう)。なお、配布されているファイルはCC0ライセンスとなっている。

次に、以下のリンク先からすべてのテクスチャをダウンロードする。上3つはNASAサイト。最後のひとつは違うが、作成元データはNASAのものを使っている(パブリックドメイン)。

  • December, Blue Marble Next Generation
    • 2004年12月の地球画像データ。自分は21600 x 10800のPNGにした。なお並んでいる10800 x 10800の正方形画像は全球をA1・A2~D1・D2まで8分割したものだが、そこまで大きな画像は不要だと思う。NASA Visible Earth - Homeで好みの季節(月)の画像を探して選べばよい。
  • Blue Marble: Topography
    • 地形データ(高さマップ)画像。こちらも同様に21600 x 10800のPNGにした。
  • Blue Marble: Clouds
    • 雲データ画像。こちらは半球で分割された高解像度画像が必要なので、「cloud.E.2001210.21600x21600」と「cloud.W.2001210.21600x21600」の2つをダウンロード。
  • Natural Earth III – Extra Data
    • 海洋マスク画像。「2. Land/water mask」にある「16,200 x 8,100 PNG (4.8 MB)」をダウンロード。

オブジェクトを作成

Blenderを起動して球体を作成。「セグメント」が256、「リング」は128とかなり細かく割って作成する。滑らかにしておかないと、影などでがたつきやちらつきが出てしまう。最初から細かく割るのは、粗く割ってサブディビジョンサーフェスモディファイアを設定する手法だと直径の値が変動してしまうから、おそらくそれを避けるためなのではないかと思う。「UVを生成」はオンにしておく。

作成した球を右クリックしてスムースシェードを設定し、オブジェクト名を「Earth」に変更。プロパティシェルフの[アイテム]タブで球の寸法を30×30×30 [m]に設定し、【Ctrl+A】でスケールを適用。

次にその球体をコピーして、雲用オブジェクトなので名を「Clouds」に変更し、サイズを1.0007倍する。これは実際の雲の高さに近いものだという。

さらに球体のコピーをもう1つ作り、大気用なのでオブジェクト名を「Atmosphere」にする。こちらのサイズは大体1.2倍くらいにする。

なお、レンダーはCyclesにしておく。

地球オブジェクトにテクスチャとシェーダーを設定

[ファイル]>[アペンド]で事前にダウンロードしてあったシェーダーの入りblendファイルを選択し、中の「NodeTree」フォルダを開いて、「CloudHemiCombiner」「Clouds」「Earth」「Spheric Atmosphere Barometric」の各ノードファイルを移植する。

作業しやすいように、ビューレイヤーにおいて眼のマークをクリックして「Earth」以外のすべてのオブジェクトをビューポート上で不可視にする。

Blender最上部のタブでワークスペースを「Shading」に切り替えるか、もしくは画面を分割して表示を「シェーダーエディター」に変更し、「Earth」オブジェクトに新規マテリアルを割り当てて名前を「Earth」に変更する。

[プリンシプルBSDF]ノードを削除し、[追加]>[グループ]から先ほど移植した[Earth]ノードグループを追加する。追加した[Earth]ノードグループの2つある出力を[マテリアル出力]ノードで対応する同名の入力ソケットへ接続し、[テクスチャ座標]ノードと[マッピング]ノード、[画像テクスチャ]ノードを出す。[テクスチャ座標]ノードの[UV]出力から[マッピング]ノードの[ベクトル]入力へ繋ぎ、[マッピング]ノードの[ベクトル]出力から[画像テクスチャ]ノードの[ベクトル]入力へと繋ぐ。[画像テクスチャ]ノードにダウンロードしてあった地球画像を読み込んだら、その[カラー]出力を[Earth]ノードグループの[ColorMap]入力へ繋ぐ。

そして[画像テクスチャ]ノードをコピーしてそちらでは地形データ(高さマップ)画像を開き、その[カラー]出力を[Earth]ノードグループの「Displacement/Height」入力へ接続する。

最後にまた[画像テクスチャ]ノードをコピーしてこちらは海洋マスク画像を開き、その[カラー]出力を[Earth]ノードグループの「Land/Water」入力に接続する。

光源を設置

ここで[レンダープレビュー]に切り替え、光源を置く。[追加]>[ライト]>[サン]で新規ライトを追加し、その際に[ライトを追加]パネルにおいてX軸で78度ほど回転させる。[オブジェクトデータプロパティ]タブで[ライト]>[サン]>[強さ」を10に設定。

背景を設定

[ワールドプロパティ]パネルで、[サーフェス]>[背景]の「強さ」を0にする。これで背景が真っ暗になる。現実の写真だと明るい地球に露出を合わせた場合、露光時間が短くなるため背景の宇宙は真っ暗になって星はほぼ写らないのでこれで充分かもしれない。

とはいえ近年は高感度カメラも使われるようになり、低軌道上から星々を写した画像も見るようになった。なので、星を設定したければするとよいだろう。以下にNASA全天画像へのリンクと、それをBlenderへ導入するTwitterでの解説動画(この方は古い画像を使っているが基本は一緒)を紹介しておく。もしAfter Effectsがあるなら、プラグイン「Optical Flares」でこの全天画像を再描画して使うというのがよくある手法だとどこかで見た。

背景参考資料

参考として、現実の低軌道上からの星空画像をいくつか並べておく。まずはISSからのタイムラプス映像。

カメラの露出設定によっては以下のような画像も撮影できる。

露出を明るい対象(太陽電池アレイや地球)に合わせれば、当然このように星は写らなくなる。

以下のような画像もあるが、さすがに長時間露光しないと無理なものだろう。うっすらと地球を取り巻く赤や緑の光は大気光である。

雲オブジェクトにテクスチャとシェーダーを設定

さて次は「Clouds」オブジェクトを可視にして、それに新規マテリアルを割り当てて名前を「Clouds」にする。

シェーダーエディターで色々と設定

シェーダーエディターで[プリンシプルBSDF]ノードを削除して、[追加]>[グループ]から[Clouds]ノードグループを追加したら、[テクスチャ座標]ノードを出して、[Clouds]ノードグループの[UV]入力に接続する。[Clouds]ノードグループを選択して右上のアイコンをクリックするか【Tab】キーで展開し、さらにその中の[cloud Hemi combiner]ノードグループを開くと、[画像テクスチャ]ノードが2つ並んでいるので、それぞれで東半球(E)と西半球(W)の画像を読み込む。

【Tab】もしくは【Ctrl+Tab】キーでノードグループを閉じ、[Coverage]スライダを1に設定。これは、レンダリングで単一レイヤーしか使わない場合に、雲が十分に密集していることを確認するため。

その後、「atmosphere」オブジェクトを可視にして、新しいマテリアルを作成し「atmosphere」と命名。[プリンシプルBSDF]ノードを削除して、[Spheric Atmosphere Barometric]シェーダグループを追加して、マテリアル出力の[ボリューム]入力に接続。

パフォーマンスの調整

PCにグラフィックカード(グラボ)を搭載している場合は、「レンダープロパティ」タブを開いて[デバイス]を[GPU演算]に変更することでパフォーマンスが向上する。

次に同タブの[ライトパス]メニューを開き、[最大バウンス数]の[合計]を2、[ディフューズ]を2、[光沢]を2、[透過]を5、[伝播]を2に設定する。[ボリューム]は0のままでよい。

コースティクス]の[光沢フィルター]を2に設定し、コースティクスの[反射][相対]をどちらもオフ。

[ボリューム]のドロップダウン設定で、ステップサイズを0.01に設定。0.1にすると、場合によってはステッピング・アーティファクトが発生する。これは、〔大気層の?〕ボリュームが非常に浅いため、小さすぎたり大きすぎたりするとダメだかららしい。[最大ステップ数]は12に減らしておく。それ以上やっても、レンダリング時間が増えるだけ。

カラーマネジメント]ドロップダウンに移動し、好みに応じて[ルック]を「medium contrast」以上に設定。通常は「medium contrast」~「high contrast」を使う。

その他いろいろ

あとは動画を参考に色々と設定を調整。

レンダリング

上記シェーダーのファイルや指定先のテクスチャファイルをダウンロード後、新規ファイルで球を作成して動画と同様に設定し、何も調整せずにレンダリングした結果が以下。なおBlenderのバージョンはv2.93.2と古いが、それは2年ほど前に書きかけていた記事を引っぱり出してきたものだからである。なので、後半は息切れしているが勘弁。

欲を言えば、球の直径が30 mなので、せめてこれを127.42 m(地球直径12,742 kmの10万分の1)にできると嬉しいのだが、単純に拡大して、大気用ノードグループにあるBlender内の直径を修正しただけでは30 mのときと同様の大気効果が表示されなかった。どうにかならないものか。