Delphi
DelphiDay 25

トリックアートに着想を得た立体表示

More than 1 year has passed since last update.

こんにちは. 慶應大の井阪建と申します.

 Delphi Advent Calender 2015のラストを務めさせていただきます. このような記事を書きながら過ごすクリスマスは最高ですね.
 普段研究では, Delphiをメイン言語として使っています. 特にこだわりなどがあるわけではなく, luxideaこと中山さんに勧められて使い始めました. 仕様などは詳しくないので, ボロが出ないようあまり細かいことは触れないようにしたいと思いますw

さて, みなさんの中でこのようなトリックアートをご覧になった方はいらっしゃいますでしょうか?

 壁からキャラクタの腕が飛び出してきているように見えますよね. 初めて見たときはびっくりしました. これは永井秀幸さんという若手(24才, 僕よりも若い)のアーティストの作品です. このトリックアートの原理は, アナモルフォーシスと呼ばれています.1 簡潔にいうと, ある1点から見たときの3次元空間像を, そこから見たままに2次元平面に写し取ってしまおう! という考えです.
 ある特定の1点から見ると立体的に見えるという仕組み, ということは・・視点をずらしてしまうと不自然に見えてしまうわけです. それなら, 立て掛けたスケッチブックを2枚のディスプレイに置き換えて, ユーザの視点を追跡し, 適切に見えるようコンテンツの描画をリアルタイムに微調整してやれば, 運動視差効果も相まって, 裸眼でそのコンテンツを立体的に見せることができるのでは?という着想に至りました.

以下, 実装について述べます. 環境はRad Studio XE7となります.

fig4.png

 上図が手法の基本的な流れになります. まず, Viewport3D上に直交した2枚のPlaneと対象のModel3Dを配置します. このバーチャル空間を, 現実世界で直交に配置されたディスプレイに描画することを考えます. 上述したアナモルフォーシックな描画はどのようにすれば実現できるでしょうか?
 Camera座標を頂点とした視野錐台の後方面(以下, スクリーンとします)を, Planeの位置, 角度, 大きさと同一に揃えてやれば, そのCamera座標に対応する現実空間の座標からディスプレイを見たときに適切に表示されそうです. バーチャル空間ではPlaneの位置は通常固定ですから, スクリーンの位置も固定されるわけです. このような透視変換はCamera位置が変化すると, 視野錐台の形状が左右上下で不均等になることから, off-axis投影と呼ばれています.

fig5.png

 Delphiでは, System.Math.Vectorsの中に透視変換を行うCameraのプロパティが宣言されています. ここでスクリーンのパラメタを弄ろうと考えたのですが, 読み取り専用の値に設定されており, 書き換えることができません. そのままではカメラの移動と共にスクリーン位置も動いてしまいます. Cameraが動いたら, 反対向きに同じ分だけスクリーンを動かしたいわけです. そこで, クラスヘルパで書き込み可能な値にしています. こうすることで, 上図のようにCamera位置が変わると, 壁面と床面の描画は変化せず, Model3Dの描画だけ変化するという結果が得られます. 実装にあたって, luxideaことサイバー和尚様に非常にお世話になりました.
 余談ですが, 最初, 通常の透視変換をしたあと, 得られた画像をPlaneが元の矩形に戻るように射影変換するという, とてもムダなことをしていましたorz

さらに, ユーザの視点移動に伴ってカメラ位置を変化させます.

 OpenCVの顔追跡ライブラリを使ってWebカメラから, ユーザの顔の位置と大きさを取得し, その値でCamera位置を制御することで, リアルタイムに描画更新を行っています. こちらに結果動画がありますのでご覧ください.
 光源を動かして, 影の形状を変化させるということもしたかったのですが, 現環境ではシェーダの取り扱いがいかんせん難しい. ということで, 今回はLight, Model3D共に不動という設定になっております. 初期テクスチャはAutodesk Mayaの方でModel3DにベイクしたものをRad Studioで読み込んでいます.
 先日, 学内の技術展示会 KEIO TECHNO-MALL 2015 に本システムを出展したところ, 悪くない感触を得ることができました.

この手法の弱みとして, 両眼視差情報が欠けていることが挙げられます.

 冒頭で書きましたが, アナモルフォーシスというのはあくまでも1点から見たとき, つまり単眼で見たときに最大の威力を発揮します. ですので, 片目で見るとより立体的に見えます. ただ, ユーザに片目を意図的に瞑ってもらうというのは, 体験としてどうかと思うわけです.
 そこで, 両眼視差の欠損を補う方策を色々考えています. 詳しくは来年3月以降に公開される私の修士論文をぜひご参照ください. 学外向けにもPDFが公開されるはずですので.
 それではみなさま, 良いお年をお過ごしください.


  1. レオナルド・ダ・ヴィンチの時代からあったりします