atali Blog

Loading

球体プロジェクションに挑戦! #2 地球

正距円筒図法の世界地図テクスチャを貼り付ければ球体モデルが地球になります。しかし静止画を貼っただけではまさに静的で、地球というより地球儀という感じ。太陽光源による昼夜の移り変わり・人工的な灯りによる生命の気配・雲の動きによる大気変動、を加えて生き生きした地球にしてみます。ただし時間がない(コンテンツはムービーのみで完結するのが本来で、この作業は納品間際のブラッシュアップにすぎない)ので極力簡単に、らしく見えればOKといういつもの方針で。

作成した地球の映像(アプリ化用に手を加えたものだが、雲や灯りなど基本的な表現は同じ)。イベントの投影では上にムービーを被せたうえ背景として目立ちすぎないよう輝度を落としており、ここまでする必要があったかといえば…


テクスチャ

テクスチャにはNASAが公開している画像を利用しました。昼の地球・夜の地球・雲の3枚。いずれも正距円筒図法でCG素材にもってこいです。実際、ゲームの素材ファイルを調べてみると同じNASA画像が使われていることがあったりします。

夜の灯り

昼夜の表現は平行光源でライティングすれば済むとして、街灯りはどうするか。夜、すなわち陰になった部分だけ街灯りテクスチャを光らせればいいわけで、次のようにしました。

まず、昼の地球テクスチャのαチャンネルに街灯りテクスチャを格納します(別テクスチャにしても良いが枚数を減らしたほうが軽い)。街灯りは輝度のみのグレースケールなので1チャンネルで問題ありません。そして、光源に背いて暗くなるほどこのα値を強く輝度としてRGBに加えるピクセルシェーダを作ります。さらにこの輝度は時間軸に沿って微かに増減・明滅するようにします。これで光源の反対側、夜の部分に街灯りが浮かび上がる表現ができました。

light

街灯りテクスチャは夜の地球画像から高輝度部分を抽出したもの。これを昼の地球テクスチャのαチャンネルに格納する

雲の動き

雲はUVを適当に動かせばなんとかなるか? それではウネウネするだけで芳しくない。ならばパーティクルで? しかしそれらしく調整するには時間が足りない(雲画像の濃淡に従い分布させるだけでもそれらしくなると思うが)。簡単に実装でき、そこそこ見栄えのする方法は…? 苦肉の策として、次の方法を試してみました。

雲テクスチャを加工し、ややぼかした雲テクスチャ・強くぼかした雲テクスチャを作ります。元テクスチャとそれら合わせて3テクスチャを、画像ファイルのRGB各チャンネルに格納します(雲も濃淡のみのグレースケールなので各1チャンネルで良い)。そしてまたシェーダを作ります。このシェーダはRGB各チャンネルの値を時間軸に沿って増減させ、その合計値を輝度として表示するもの。ただしチャンネルごとに増減の位相をずらしており、結果要するに、ボケ味の異なる3枚のテクスチャが繰り返しディゾルブ表示されます。それだけのことですが、雲が生まれては消えていくような感じが出て、思いのほか効果的でした。

cloud

元画像(左)とぼかし加工した画像

仕上げ

とはいえ、地球全体の街灯りが一様に明滅する・雲が一様にディゾルブするだけではさすがに機械的で不自然な印象なので、適当にバラけさせてやることにします。単に乱数を用いるとザラザラになるためパーリンノイズを利用します。内部で生成するのが理想かもしれませんが(Unityにはその機能もある)、もはやコードを書く余裕がないのと周波数の異なるパーリンノイズを負荷なく合成したかったためテクスチャ画像として持つことにしました(雲画像のαチャンネルが余っていたのでそこに格納)。

perlin-noise

周波数の異なる複数のパーリンノイズを合成。なお球に貼るためテクスチャはシームレスとする

で、そのパーリンノイズの値を街明かりの明滅周期・雲のディゾルブ周期の位相に反映させるようシェーダを修正(灯りと雲のシェーダは1つに統合されており、雲テクスチャ内のパーリンノイズを灯りにも反映させられる)。するとピクセルごとに微妙なずれが生じ、一定の周期こそ感じるものの、だいぶ自然な印象を得ることができました。

Moon

月もある。せっかくリアルタイムレンダリングなので、ムービーがループするたび地球/月を切り替えたり自転方向を変化させたりした。じつはパノラマを表示する機能も実装しており、現場の様子を球体に鏡のように映す演出も考えていたが、設営に手一杯で高画質パノラマの撮影時間がなかった

Related article