YouTubeを見ていたら、360度動画を見かけました。これって、専用のカメラが無いと撮影できないのでしょうが、CGなら、用意すべき動画データの仕様さえわかれば作成できるはずです。
そこで、YouTubeの「360 度動画のアップロード」ページを読んでみました。
そのステップ1、巨大な画像サイズ「7,168×3,584〜8,192×4,096」は置いといて、「正距円筒図法、アスペクト比 2:1」ですか。正確にどうか(一致しているか)?は、わかりませんが……、なんとなく、そんな画像を生成する命令がXi-TRACEにあったような気がします。
viewenv <esphere>, <top_x>,<top_y>,<top_z>, <ref_x>,<ref_y>,<ref_z>, <eye_x>,<eye_y>,<eye_z>[, <eye_r>] ;
おっと、マニュアルに記載がないですね……(〜R09)。非公開命令でしたね。まあ、これを機に公開してしまいますけど。これ、「環境視野」という呼び名を付けてました。カメラ(視野面)の設定をするview命令(投影視野)の代わりに使用する命令です。
注目する点(<ref_x>,<ref_y>,<ref_z>)を、視点(<eye_x>,<eye_y>,<eye_z>)の位置から眺める形になります。この時、画面の上にしたい方向を(<top_x>,<top_y>,<top_z>)として指定します。ここまでの説明はview命令と全く同じ。この命令、全く別なことがしたくて作り込んだ機能でしたが、その「別なこと」が頓挫していて、お蔵入りになっていた機能です。<esphere>は、その「別なこと」のために用意したパラメータですが今は使わないので、<esphere>=0で使ってください。
この時、レンダリング結果は以下の様になります。
画像の中心にviewenv命令の参照点方向に見える映像が来ます。そこから画像サイズの1/4横にずれたところが、視点の右側・左側に見える映像です。画像の右端と左端はつながっていて、真後ろの映像が来ます。画像の上端は視点の真上、下端は視点の真下の映像が映ります。
水平方向にぐるっと360°、垂直方向に180°、丸々全方位が1枚の画像に収まります。多分、「正距円筒図法」というものと似通った状態に、なっているはずです。
後は、「アスペクト比 2:1」ですね。これは普通に、レイトレーシングする画面サイズの設定命令で、以下の様に縦と横のドット数が2:1になるように設定してやればOKなわけです。
screen 1080*2,1080, 32;
この場合、垂直方向180°(上から下まで)が、画像の縦長さ:1,080ドットに割り当たっています。実際にビュアで表示する時には、(表示する時の画角によりますが、)この1/2〜1/4程度の範囲を矩形領域に表示することになり、解像度が落ちることになります。逆に、ビュアで表示した時の解像度をある程度確保するためには、元の画像サイズを大きく取っておく必要があり、「7,168×3,584〜8,192×4,096」などといった、巨大な画像サイズが推奨されているものと考えられます。レイトレーシングでこのサイズを計算するのはしんどいので、今回は縦1,080ドット程度で勘弁させていただいています。
うむ、これだけです。非公開だった命令を一つ公開したら、終わってしまいました。後はいつも通りにデータを作ってレンダリングするだけ。テスト用に作ったデータが以下です。
Xi-TRACEデータ:equirect.xitr
上・下/左・右/前・後に計6つの球体を配置して、それぞれsin関数でゆらゆらさせてみました。360度動画なので、見る時に天地が分かるように紅白チェック柄の地面を設定しておきました。
先ほど示したデータをレイトレーシングして、AVI(Motion-JPEG)ファイル形式のファイルを作ります。
「360 度動画のアップロード」ページの続きを読むと、ステップ2に「メタデータを追加」する必要があると書かれています。説明に従って、「360 Video Metadata」というソフトウェアをダウンロードして、実行します。
すると、おや、ファイル形式が「.mov」または「.mp4」しか受け付けてくれません。ですよね……(1^^;)。こちらは「.avi」なんですけど。やむを得ず「.avi」→「.mp4」の変換ソフトウェアを探すハメに……。自前以外のソフトウェアだと、リンクを張っておいても、いつの間にかリンクが切れていたりして、保守しきれないのですよね……。と、いう事で、「.avi」→「.mp4」の変換ソフトウェアは、皆さんでお好きなものをお使いくださいm(1__)m。
ともあれ、「.avi」→「.mp4」変換できたとして先へ進みます。先ほどの「360 Video Metadata」を実行してメタデータを埋め込んだ「.mp4」ファイルを生成します。「Open」で「.mp4」ファイルを指定、「spherical」だけにチェックを入れて、「Inject metadata」ボタンを押す。出力ファイル名を問いあわせてくるので、元の「.mp4」ファイルとは別名で保存する。
メタデータを付加した方の「.mp4」ファイルを「360 度動画のアップロード」ページのステップ3に従ってアップロードしたら完了です。
こんな(↓)風に見えましたか?
左上に表示されるコントロールや、PCであればマウスで掴んでグルグルと前・後/左・右/上・下を眺めることができますので、お試しください。
作者はMicrosoftのIE派なのですが、どうも、YouTubeのページは色々なところで蹴られます。この360度動画も、IEで見ることはできるのですが、しばらく動かしていると、突然動画が表示されなくなったりしました。作者の環境のせいかもしれませんが……。仕方なくChromeをインストールしてみましたが、こちらでは安定して表示できています。
テストはすんなり成功してしまったので、何か、面白そうな動画データを作ってみたいのですが……。作者は今まで、「画角の中に何を配置するか?」みたいなアプローチでデータを作っていたんですね。「全体の空間を作り込んでから、その中にカメラを配置して、画角を決める」といったアプローチをしたことがありませんでした。レイトレーシングって、計算にとても時間がかかるので、画角の外で見えないところにリソースを費やすなんて、考えられなかったのが正直なところです。
ても、360度動画となると、全方位の情景を作り込んでおかないと、意味がありません。さてさて困りました。Xi-TRACEの機能としては360度動画を作成する能力があるのですが、それを活かしたデータを作成できるかどうかは使い手の腕次第、みたいです。
あっ。あんまりおもしろくなくて、没にしてあったフラクタルキューブがあったのを思い出しました。たしか、キューブの穴の中を通り抜けていたはず。
このデータのview命令をviewenv命令に置き換えてみます。
view 3*R, 0,0,1, rpx,rpy,rpz, epx,epy,epz, 0; // 通常視野
screen 1920,1080,32;
↓
viewenv 0, 0,0,1, rpx,rpy,rpz, epx,epy,epz, 0; // 環境視野
screen 1080*2,1080,32;
これだけ。簡単すぎ……。
データ自体は、「どうやったら動画作成時のカメラワークを簡単に記述できるか?」と言う試行錯誤をしているので、ゴタゴタした処理をしている部分がありますが、まだ試行錯誤中で今回は解説しないので、サラッと流してください……。
ちなみに、データ中のmax_levelという変数に設定する値をもう少し大きくした方が、フラクタルらしくなってカッコよかったのですが、メモリと処理速度の都合上max_level=4で動画を生成してあります。
このデータ、再帰的にcubeを定義していく手順を1段ショートカットしているのですが、ショートカットしなかった場合、cubeの総数は以下の様になります。
と、いう事で、ショートカットしない場合、max_level=4ですら非現実的な処理量、データ量になってしまいます。ショートカットした状態でも、max_level=4で二次曲面(平面を含む)の数は150,000個を超えていました。max_level=5では、メモリ消費量が膨大過ぎて、作者の環境ではメモリが確保できずエラー終了してしまいました……。ちゃんと検証してませんが、Xi-TRACEのメモリ使用量が2[GB]に迫った辺りでエラーになっていたので、恐らく、32ビット版アプリケーションの限界だと思い、深追いはしていません……(その場合、64ビットに移行するしか回避策が無いため。64ビットへの移行はハードルが高いです。16→32ビットの時にも痛い目を見てきたはずなのに、懲りてない私……)。
完成したデータと動画です。
フラクタルキューブの内部に視点が到達したところで、何秒か止めてありますので、グルグル周りを眺めてみてください。
Xi-TRACEデータ:fractal_cube.xitr
Xi-TRACEで直方体ブリミティブを使用可能となった、R11以降のリリースバージョン用に、データをアップデートしました。
Xi-TRACEデータ:fractal_cube_cuboid.xitr
見た目は全く変わりませんが、プリミティブ数が減っている分、省メモリ、高速演算可能となっています。max_levelを+1くらい大きくしても、メモリエラーにならなくなりました。ただし、処理時間(レイトレーシングが始まるまでの前処理)はたっぷりかかるので、覚悟して実行してください。
中でバージョンチェックして場合分けしているので、R11より前のバージョンでもエラーになりませんが、直方体プリミティブ(cuboid命令)の恩恵は受けられませんのでご注意ください。