「バーチャル空間に現実映像を取り込む」では、スマホで実写した動画をレイトレーシングのマッピングデータとして使って、現実世界の映像の中にレイトレーシング物体を配置しました(下図)。
ちょっと画像が小さいので、よ〜く見ていただかないとわからないのですが、中央の立方体パズルの影がちょっと不自然です。上のデータを作った時に気付いては、いました。左端に映り込んでいる手の影は境界線がぼやけているのに、立方体パズルの影はキパっと、定規で引いたような境界線が見えていて、違和感があります。
当時から、可能ではあったのですよ。パスレイトレーシングと言う方法で、レイ(視線ベクタ)をランダムに分散させることで、大きさを持った光線源によってできた影をぼかすことが出来るのです。
ただ、この時の立方体パズルでは、データを作るのにそこそこ複雑な物体定義が必要で、ここにパスレイトレーシングを適応してしまうと、「どんだけ計算時間かかるのよ?」ってことで泣く泣く(1;_;)断念したのでした。
今回は現実世界の映像中に配置する物体を一気に簡略化して、パスレイトレーシングによる計算時間の増大に対応してみます。
ゴムボールとか、ピンポン玉とか、単に球体を1つ置いておくのが一番単純な形状で良いのですが、少しだけひねって、たまごをモデリングしました。基本形状:楕円面×2個+平面×2個=計4個と言う事で、十分単純で高速に計算できて、テーブル(食卓)の上に転がっていてもあまり不自然ではない物体だと思われます。
後は、以下の様にcond命令のパラメータを設定すれば、パスレイトレーシングによって、境界線のぼやけた柔らかな影を表現することが可能となります。
cond 0,1, 10,10,10;
赤く着色したところが、パスレイトレーシングの倍率です。ここを0としておくと、通常のレイトレーシングとなります。N>0の値を設定する事で、通常のレイトレーシングに加えて、1ピクセルの中にN本のランダムな視線を発生させて、全ての計算結果の平均値をピクセルの色とします。
従って、原理上Nを指定すると通常レイトレーシングのN+1倍の時間がかかります。一方、Nが小さいと、ただのノイズとなって、ざらざらした感じの画像となります。
以下、パスレイトレーシングのパラメータを変化させながら、レイトレーシングしてみた結果です。
まずは、通常レイトレーシング:「cond 0,1, 10,10,0;」 (↓)。影とそうでない部分の境界がはっきりしています。
最小限の1倍パスレイトレーシング:「cond 0,1, 10,10,1;」 (↓)
10倍パスレイトレーシング:「cond 0,1, 10,10,10;」 (↓)
オーバサンプリング(cond命令第二引数)と組み合わせた90倍パスレイトレーシング:「cond 0,3, 10,10,10;」 (↓)
1〜10倍パスレイトレーシングくらいでは、画像のざらざら感(ノイズ)が残ってしまって、ダメダメです。90倍でも若干残っていますが、だいぶましになりました。ただし、計算時間は通常レイトレーシングの×100倍近くなっていますので、ご注意を。
大体、静止画を計算させる時以外は、あんまり強烈な倍率には設定していません。
完成したデータをリンクしておきます。
1) | Xi-TRACEデータ | egg_righting.xitr |
2) | マッピングデータ(動画) | realinv_map.avi (各自ご用意ください) |
3) | マッピングデータ(静止画) | egg_righting_table.jpg |
2)のマッピングデータは、YouTubeへのリンクになっています。YouTubeでご覧いただくことはできますが、1)のデータをご自身で計算してみようとする場合、このマッピングデータが必要となりますので、各自でご用意ください。
撮影方法と、データへの組み込み方法については、こちらで解説してあります。
3)のデータは、2)のマッピング用動画データが用意できなかった場合に、緊急避難として使用するマッピングデータ(静止画)です。
最後は、たまごが透明になって消えて行く様子をレイトレーシングで表現しています。