ハラダです。ここ数日、やたらと物をリリースしています。
会社としての直近の大物は 『psybertechno:geo』 なんですが、あれは語ることが多すぎるので、別の機会に取っておきます。今日はもうひとつのほう。会社というより、個人として作ったものの話です。
『atmosphere』という、空を描くためのライブラリを公開しました。
- デモ: https://takustaqu.github.io/atmosphere/
- npm:
@takustaqu/atmosphere - GitHub: https://github.com/takustaqu/atmosphere (MITライセンス)
何をするものかざっくりご説明すると、「Webサイト内にお好きな空を表示する」。
それだけのライブラリです。
昼なら、晴れなのか雨なのか、雲がどれだけ厚いのか、どんな種類の雲なのか。夜なら、光害がどれだけあって星がどこまで見えるのか、天の川を出すのか、流れ星を1時間に何個流すのか。そういったものを設定すると、ざっくりとその空がWebGLでレンダリングされます。空以外は何も描けません。地面も、建物も、鳥の一羽すら出ません。
なんでこんなものを作ったのか
あれは確か中学の頃、1997年だったか。セガサターンに『リアルサウンド 〜風のリグレット〜』が有りました。
Dの食卓で有名な、飯野賢治氏の1本ですね。
このゲーム、立ち上げると画面が真っ黒なんですな。
本当に何も出ない。音だけを聞いて、情景を頭の中に思い浮かべながらプレイする、ラジオドラマのようなゲームでした。
あの頃、ウォークマンProをヘッドホンアンプ代わりにしてプレイしたことを思い出します。
その2年後ぐらいにドリームキャスト版が出て、実はそちらには一応「画面」が付きました。
付いたと言っても、美しい空の写真がスライドショーを含めたいくつかのスクリーンセーバーが流れるだけ。ゲーム内容に直接紐づく画面は無しのまま。
そもそもパッケージからして空の写真のゲームでしたから、空の画像が流れてくるというのは個人的にも気に入っていました。写真は 稲越功一 氏によるものだそうな。
で、ここからが本題。
実はこの5年ほど、この『風のリグレット』の移植を個人的に作っていました。
この実装を公開する予定はなく、ただただ「自分がプレイできる環境が欲しい」という理由だけの、完全に私的なプロジェクトです。
おおむねうまくいき、最低限のUIが付いて、スマートフォンなりPCなりで自分の思う通りにプレイできるところまで出来たのがこの7月の事。
(オーディオのデコードに始まり、サターンのソフトウェアの解析と続いていたこのあたりのお話はしたいのですが....まぁ胸に仕舞っとくことになると思います)
この開発は、毎年この夏の7月ぐらいに仕上げたいな、と思いつつ終わらずに夏が終わっていたので、ようやっと長い夏休みの自由研究を終えたような、そんな気持ちでもあります。オリジナルのゲームの方も、7月発売のゲームだったので。
まぁプレイもできるようになり、自分の求める完成度になってくると、欲が出ます。
それぞれの情景に合った空が、画面に出てほしい。夕暮れの駅には夕暮れの空を、雨の場面には雨の空を。
自分の考える最高の形を今の時代のマシンパワーで実現できんか?
その結果として生まれたのが、この 空のシミュレーター でした。
曇り空が描けた日
最初はひどいものでした。積乱雲も出せない。夜空なんて何の考慮もない。
青空と、そこに雲がかかるあたりは早い段階からそこそこリアルだったんですが、転機は曇天です。
どんよりした曇り空が、パッと見て「あ、曇ってるな」と認識できる程度に描けるようになったあたりで、思ってしまったわけです。
もしかして、結構いいものを作ってしまったのではないか。
npmで公開するということに、これまであまり強い意識を持たずに生きてきました。
でもせっかくなので、これは自分なりのチャレンジとしてオープンソースにしてみようと。
始まりが始まりなので、会社ではなく個人のプロジェクトとして出しています。
まぁ、ここは元の実装に起因していないですし、公開しても良いでしょう、と。
中身の話を少しだけすると、依存ライブラリなしのフラグメントシェーダ1枚で、物理シミュレーションではなくプロシージャルに空を組み立てる方式です。雲は WMO の十種雲形(巻雲とか積乱雲とか、あの分類です)をそれぞれ量で指定して混ぜられます。台風の空が欲しければ乱層雲を厚く、夏の午後なら積雲を浮かべて、という具合。
公開2日、なんかいろいろ触ってます。
公開からだいたい2日経った今、気が乗ってきてしまい、さらに作り込みました。今回のメインは夜空とCPLフィルターです。
空の写真を本気で撮ろうとしたことのある人なら、C-PL(円偏光)フィルターをレンズに付けて偏光をカットし、空を青々と落とす、あれをやったことがあると思います。あれと近しいことがソフトウェア的にできるようになりました。レイリー散乱の偏光成分だけを減衰させるので、ミー散乱である雲や直射日光にはほぼ効きません。つまり曇り空に付けても何も起きない。正確でないにしても、大体同じような振る舞いです。
(頑張ると流れ星も見えます)
夜空のほうは、光害をボートルスケール(1〜9。1が最高の星空、9が大都市のど真ん中)で指定して星の見え方が決まり、天の川のオン・オフ、流れ星はZHR——1時間あたり何個流れるか——で設定できます。ペルセウス座流星群のピークを再現したければ100くらいに。月のレンダリングも不自然だったので直しました。とはいえ月のコントロールはまだ甘くて、ここはこれから賑やかにしていきたいところです。
内部的にはDisplay P3対応にしました。作りとしてはHDRを意識しています。ただ、今のWebGLとcanvasの仕様ではHDRのまま画面に出力する手段がないので、そこは現状のリミテーションです。器だけ先に用意して、時代が追いつくのを待っています。結果として露出コントロールなどが容易に行えるようになっています。
で、どこで使うのか
ライブラリ単体で何に使うんだ問題は、正直あります。何かと組み合わせるとなると、ユースケースは限られてくるでしょう。
Webサイトの演出に使ってもらうのが素直な線。あとは全方位でレンダリングできて、キューブマップの焼き出し機能も付けてあるので、3DやVR的な文脈でスカイボックスをプロシージャルな空に置き換えたい人にも、何かしら使ってもらえるかもしれません。
それと、これは個人的な推しの使い方なんですが。余ったディスプレイで、家の中にもう一つ「窓」を作ってみてほしいんです。デモページを開くと画面いっぱいに雲が流れていくんですが、これを眺めるのが体験として結構いい。ライブラリという提供形態なので少しだけハードルはありますが、紹介ページには時刻や雲量をいじれるコントローラーも付いていますので、まずはそこで空を一周見回してみてください。
不自然な空も、まだ普通に出ます。特に積乱雲。一番大事にしたかった雲なのに、正直まだ試行錯誤の途中で、これからも手を入れ続けることになると思います。
おしまいに
あの時「風のリグレット」の先にこういうアウトプットを作ることになるとは思ってもいませんでした。
こういう、仕事とは何の関係もない「作ったおもちゃ」を、これからもこうしてOSSにしていければと思っています。
まぁせっかく作ったんで、観ていって下さい。結構いい感じだと思います。
以上、公開自慢終わり。
あと、せっかくなので、 オーディオブック版の風のリグレット が出てるので、ぜひこれ聴きながら、その情景の空を作ってみて下さい。楽しいですよ。
それでは、ハラダでした。