「2025年大阪•関西万博誘致計画案」森美術館展示を実現した技術〜センサー編
こんにちは。PARTYでソフトウェアエンジニアをやっている森(@d_forest)です。
今回は、森美術館で11月19日に始まった未来と芸術展の「2025年大阪•関西万博誘致計画案」展示を実現した技術について紹介します。
未来と芸術展とは?
11月19日に始まった六本木ヒルズにある森美術館での企画展です。100点を超える展示があり、かなり見応えがあります。
本展は、「都市の新たな可能性」、「ネオ・メタボリズム建築へ」、「ライフスタイルとデザインの革新」、「身体の拡張と倫理」、「変容する社会と人間」の5つのセクションで構成し、100点を超えるプロジェクトや作品を紹介します。
「2025年大阪•関西万博誘致計画案」展示とは?
PARTYがテクニカルを担当した、「未来と芸術展」に出展している作品です。模型へのプロジェクションマッピングと透過スクリーンを利用したオープンARが楽しめる、近未来的な作品に仕上がっています。
技術構成(Kinect v2 + Unreal Engine 4 + Resolume Arena 6)
Icon made by Freepik from www.flaticon.com
このプロジェクションマッピングとオープンARを実現している構成を簡単にまとめたのが上図です。
スクリーンの前に立つ人の頭の位置をKinect v2を使って検出し、UE4に実寸で再現したヴァーチャル展示空間のカメラに位置に反映し、通常のProjection Matrixの代わりに、Off-Axis Projection Matrixで透過スクリーンに描画する画をつくり、同時に壁面、プロジェクションマッピング用の映像も加えて、Resolumeでマッピングを調整して各プロジェクタに映像をスピーカーに音を出力しています。
KinectはC++製コンソールアプリで制御しており、そこからはOSCでUE4に値を送信。UE4からはSpoutでResolumeに映像を出力しています。
すべてをまとめて処理しているマシンは、GeForce GTX2080ti、GeForce GTX2070の2枚のGPUが刺さったモンスターマシンになっています。
全体の設計と実装を弊社スーパーエンジニアの梶原さんが、センサーの選定とセンサーを制御するためのC++製コンソールアプリを私が担当しました。
センサー以外の詳しいお話は後日、PARTY テクニカルディレクターの梶原さんにお願いするとして、センサー部分のお話をもう少し深ぼっていきます。
センサーの選定(Real Sense vs Kinect v2)
今回、センサーの選定にあたっては手頃なところでReal SenseとKinect v2とが選択肢としてありました。
選定時点でAzure Kinectも出てはいましたが、時間の都合で手元にあった2つからの選択になりました。
最初は、以下の点からReal Senseに軍配が上がっていました。
- 1台のマシンに2台接続できる
- 接続しているUSBから給電できる
- 小さい
しかし、実際の展示相当の配置で確認してみると、画角が狭く、頭を捉えられる範囲が想定よりもかなり少ないことがわかりました。特に縦の画角が狭く、センサーが見上げる配置になってしまう今回の展示では致命的でした。そのため、途中でKinect v2にセンサー候補を変更しました。
Kinect v2は発売から5年以上も経つのに、展示利用での安定感は流石といったところです。
ヘッドトラッキングの実装
ヘッドトラッキングに求められた主な要件は以下でした。
- 複数人いてもスクリーン中心に一番近い人ひとりを検出する
- 検出した座標をUnreal Engine 4上の仮想空間に合わせた位置に調整する
これを実現するため、Kinect v2 SDK提供のBodyTrackingと、Affine変換による座標の調整、PCLを使った点群クラスタリングによる人の推定を組み合わせて実装しました。
Affine変換による座標の調整
センサーの位置が腰より低い位置からの見上げる配置になる今回の展示では、Affine変換による座標の調整が必須でした。
Affine変換にはEigenを使いました。見上げている状態(離れるほど高さが低くなる)を仮想空間ではまっすぐ向いているように線形変換してあげます。
また、Unreal Engine 4で再現された仮想空間上のセンサー位置は、実際の位置と違うところにある想定で作られていたので、これも、Affine変換で平行移動することで仮想空間上の正しい座標になるように調整しています。
実際のコードと更に詳しい解説は、3D Sensor Advent Calendar に参加している下の記事に書いたので、あわせて御覧ください。
PCLによる人の推定
PCLの人の推定との組み合わせが必要な理由は、Kinect v2 SDK提供のBodyTrackingでは「最大人数を検出したあと、新しい人を検出することができなくなってしまう」からです。
今回の展示ではオープンARという特性もあり、混雑時にはセンサーの前に多くの人がいつことが容易に想像できます。
そうすると、奥にいる人を先に検出して最大人数を超えてしまった場合、スクリーン中心に近い人の検出ができなくなってしまい、透過スクリーンの映像が正しく映っていないように見えてしまいます。
そこで、PCLを使って一定量の点群の塊がある場合は人がいると推定し、スクリーン中心に一番近い点群の塊と比較し、そこに人の検出がないと想定できる場合は、Kinectを再起動する仕組みを入れました。
こちらも、実際のコードに詳しい解説を下の記事に書きましたので、あわせてどうぞ。
まとめ
実はこの展示をする前まで、3Dセンサーを使った開発はおろか、C++での開発もやったことがありませんでした。最初はどうなるかと思いましたが、先人たちの知恵のおかげでなんとか完成までこぎつけました。
再三になりますが、ここに書ききれなかった実際のコードと、その解説は3D Sensor Advent Calendarに参加した記事に書きましたので、是非こちらも御覧ください。
未来と芸術展は2020年3月末まで開催しているので、プロジェクションマッピングとオープンARの新しい体験を是非してみてくださいね。
______________________________________
PARTYでは未来の体験を社会にインストールすべく、好奇心旺盛なエンジニアを募集してます!