equiview.png


正距円筒図からのトリミング

 「正距円筒図」と言う言葉やその説明は、これまで何度か登場していますね。リンクを張っておきます。

  バレリーナが回るオルゴール

  フラクタル正四面体

  YouTubeのCardboardで360度3D動画を鑑賞する

  YouTubeの360度動画を生成する

 これらのページで登場したのは、全てXi-TRACEで作成したCGだったわけですが、世間にも、360°ぐるっと撮影できる360°カメラなるものが存在します。作者は所有していないので、詳しいことはわかりませんが(1^^;)、恐らくそうしたカメラが出力するのも正距円筒図法で描画された画像データのはずです。
 1枚パシャリと撮影すれば、360°全方位の映像を記録できるという点で優れた特徴を持っていますが、一方で、正距円筒図は以下の様に画像が歪んでいます。

equirect.jpg

scrimg.png

 それはそうですよね、本来、人間の目では一度に捉えきれない360°の画像を1枚に押し込んでいるのですから。

トリミング

 そこで、今回のテーマです。画像が歪んでしまっている正距円筒図から、カメラで撮影したような、いつも見ている画像を切り出したいと思います。Olive+ R17で追加した「トリミング[正距円筒図]フィルタ」を使って切り出した画像をいくつかご覧に入れます。

equiview_trim.jpg

 元の正距円筒図では、フラクタルを構成している立方体の辺が歪んで湾曲して見えていましたが、上の画像では、いつも目にしているような画像であり、歪みが無いことがお分かりになるでしょうか?
 CGだからと言って、Xi-TRACEでレイトレーシングしなおしたわけではありませんよ。最初に示した正距円筒図から、任意の方向、任意の画角で切り出した画像です。

トリミング[正距円筒図]フィルタ

 まず、Olive+で正距円筒図を読み込みます。その後、「フィルタメニュー」→「変形」→「トリミング[正距円筒図]」と選択すると、以下の様なダイアログが開きます。

equiview.png

 設定ダイアログには、切り出し画像のプレビュが表示されており、垂直/水平スクロールバーが配置されています。水平スクロールバーは赤道方向の-180°〜+180°に対応しており、垂直スクロールバーは鉛直方向の0°〜180°に対応しています。プレビュを確かめながら、お好みの方向に合わせてください。
 その下に、「画角」を指定するフィールドがありますので、1°〜89°の間で指定してください。画角を小さい値にすると望遠レンズ、大きな値にすると広角レンズで切り取ったような画像になります。

 対象画像が通常の正距円筒図の場合には、「通常画像」のラジオボタンを選択します。対象画像が、2枚の正距円筒図を結合したステレオ3D画像だった場合、左右に2枚の画像が結合されていれば「Left-Right」を、上下に結合されていれば「Top-Bottom」を、選択してください。

 最後に、切り出す画像のサイズをドット数で指定して「OK」ボタンを押すと、指定したパラメータで切り出した画像を生成します。

スクリプト

 前節でご紹介したように、U/Iを使って画像を切り出すことの他、Olive+のスクリプト機能を使って、予め設定したシーケンスに従ってカメラを動かし、動画を作成することも可能です。以下、2つの命令を使います。

  view <wid/2>, <top_x>,<top_y>,<top_z>,<ref_x>,<ref_y>,<ref_z>,<eye_x>,<eye_y>,<eye_z> ;
  filter equiview, <sizx>,<sizy>[, <option>] ;

 view命令は、カメラを設定する命令です。

xman_view.png

 眺める方向や、画角など、カメラの特性を設定します。

 正距円筒図法で示した図中の記号を使って説明すると、z軸の負方向に(前)部分が見え、正方向には(後)部分が見えています。同様に、y軸正方向に(上)、負方向に(下)、x軸正方向に(右)、負方向に(左)が見えています。ここに、適切な投影面を指定すると、正距円筒図法で描画されたデータから、投影画像を得ることができるわけです。

 スクリプトを作る時は以下の様に、先にview命令で投影面を定義してから、filter命令を実行します。

  例)
    load "equirect.jpg";
    view 100, 0,1,0, 0,0,-100, 0,0,0;
    filter equiview, 960,540;

 view命令は、元はと言えばXi-TRACE用の命令です。Olive+だからと言って、一々無効化したりエラーにしたりするのは面倒なので、そのまま命令としては活きていました。今回はその命令を流用した形です。
 実は、これまでは全く意味が無かったため、マニュアル等には記載がありませんが、Xi-TRACEの一次変換命令なども、そのまま命令としては活きています。よって、以下の様な感じで、一次変換を使って投影面を定義することも可能となっています。

  model
  {
    roty 20;  // y軸の周りに20°回転
    view 100, 0,1,0, 0,0,-100, 0,0,0;
  }
  filter equiview, 960,540;

 カメラを回転させたり、違う向きに向けたりするのに、一々座標計算するのは面倒なので、一次変換命令を使って、MODELAに計算させてしまいましょう。
 一次変換命令や、その動作についてはOlive+のマニュアルには載っていませんので、Xi-TRACEのマニュアルでご確認くださいm(1__)m。


完成動画

 完成したデータと動画です。

Olive+スクリプト equiview.olv
Xi-TRACEデータ fractal_cube_cuboid.xitr



 Xi-TRACEのデータは、「YouTubeの360度動画を生成する」で作成したものをリンクしているだけです。結局、元の正距円筒図から座標変換して切り出しているだけですので、元画像の解像度が切り出し画像の解像度を決めています。
 そこで、いつもは計算させないような高解像度で計算したデータを用意するのに、「max_level=5;」「enb360=true;」「enbani=false;」「fn=69;」「XSIZ=6*1024;」「YSIZE=XSIZE;」などの微調整をして使いました。
 生成した正矩円筒図のサイズは、6,144×6,144ドット。Xi-TRACEも、Olive+も、グラフィックの最大サイズを6×1,024ドットまでに制限しているので、現状の最大画像です。

 レイトレーシングで計算させると、ちょっとしたデータでも計算時間が数時間に到達するため、どうしても短い時間の動画に切り詰めざるを得ませんでした。それに、今回はフラクタルの再帰レベルを5(max_level=5;)にしたのですが、物体数が増加することでその分計算時間が増えますので、「YouTubeの360度動画を生成する」の動画は、再帰レベル3(max_level=3;)で計算したものです。
 今回のケースでは、レイトレーシングは一回だけですので、再帰レベル5で動画を作成することができました。画像サイズが大きいので、その分時間はかかっていますが、30フレーム/秒で1分超のデータをレイトレーシングするのに比べたら、圧倒的に短い時間です。


home

download

gallery