はじめに

社内ハッカソン 2017 の XR チームです。
今回 XR チームは Vive を装着した人間のモーションを遠隔地の AR 表示されているアバターに投影するソフトを作成しました。

「いや、それ7時間で作れるんですかね……?」という声が聞こえてきそうですが、なんとか完成までこじつけました。

というわけでまず、完成品をご覧ください。


使っている SDK とか

ザックリ図でやっている事と使っている物をまとめると以下のような感じです。

clipboard.png

書くまでも無いですが、開発エンジンは Unity です。

この内容を実装するにあたってアプリが 2 つ必要です。

  • アクターが使う VR アプリ
  • 観客が使う AR アプリ

アクター VR アプリ

まず、アクター VR 側に必要な機能は以下です。

  • Vive を使用して腕、足、頭の5点をトラッキングする
  • FinalIK の VRIK を使用してトラッキング出来ないボーンのデータを補完する
  • トラッキングした Transform を Photon に送信する
  • THETA で撮影した360度全天球動画をリアルタイムで受けて HMD 側に表示する

以上を実装した結果、
アクターは自分の動きが反映されたモデルと自分を見ている客の反応を HMD 上で確認できることになります。 (画像は Vive をつけているアクター側の映像)

clipboard.png

Photon の話

送信に Photon をあえて使う必要がなかったのですが(むしろ LAN 内通信で十分) コードを書かずにデフォルト機能がとても充実していてスピード重視のために使用しました。

WAN 通信で同期するのにコードが1行も要らないという素晴らしい時代です。 (しかも開発用程度のリソースであれば無料)

VRIK の話

VRIK は最高です、5 カ所トラッキングするだけでそれっぽい人のポーズになります。

クライアント側との Prefab の手足の位置情報のやり取りがしやすいように同期するパラメータ分、空オブジェクトを作って各種 Vive のポジショントラッキングの結果の GameObject から Transform 転写してます。

clipboard.png

同期に必要なパラメータですが、基本的に Vive でトラッキングした 5 つの Transform を送れば、 VRIK の補間はクライアント側で行えるのでデータ容量としては非常に軽いです。

VRIK の同期方法では 2017 JVR Fest でのなっつーさんの講演の「 VRIK をネットワーク同期させる」を参考にさせていただきました。
講演の内容はネット上になかったので当時のメモや記憶を頼りに実装しました。  

THETA の話

THETA から全天球動画をライブで受け取るにあたってRICOH THETA UVC Blenderを使用しています。

Unity からのアクセスは簡単で

WebCamDevice[] devices = WebCamTexture.devices;
WebCamTexture webCamTexture = new WebCamTexture (devices [0].name);

でサクッとアクセスできます。

Windows だと少し面倒でレジストリ弄らないとアクセスできなかったりします。

Getting Unity to recognize THETA UVC FullHD Blender Camera

THETA 周りはこちらの記事を参考にしました。

Unity+THETA S+UVC Blender でライブストーリミング画像を表示してみる

観客が使う AR アプリ

観客側が使う AR アプリの機能は以下のような感じです。

  • Vuforia を使用してマーカーの上にアバターを出す
  • Photon から必要な Transform を受け取る
  • 受け取った Transform をベースに VRIK で補間する

使用したアバターは FinalIK を買うと付いてくるセットアップ済みのミリタリーなキャラクターです。(画像参照)

マーカーには御札を使用し、回りには血しぶきが飛んでいます……

本当は幽霊とかお化けのアバターになる予定だったのですが VRIK の設定が間に合わなかったのでデフォルトのままです。

clipboard.png

Vuforia の話

Vuforia は Unity 2017.2 で機能の 1 つとして内蔵されました。 使用するには Unity インストール時に Vuforia のコンポーネント選択が必要になっているので忘れないようにチェックしましょう。

Vuforia 自体は設定 UI が一部場所変更されていたりはしますが、基本的には統合前と同じ様な感じで使えます。

一度はやってみたいと思う Vuforia + ARKit を組み合わせた MR コンテンツですが、 Unity2017.2.0f2 現在では組み合わせることは出来ません。
ただ未確認ですが、 Unity2017.3 から Vuforia のバージョンが 7 にアップデートされたようなので最新版では組み合わせることが出来そうでした。

マーカー単体より ARKit の方が圧倒的にトラッキング精度が良いので出来れば組み合わせて使いたいですね。

Photon の話

コードを全く書かずにデフォルトの Component をひっつけるだけで受け取った Transform を反映させることができます。

また、 VRIK にはアクター側の手足の位置情報が反映された Transform を参照させるだけでモデルはアクターと同じ動きができるようになります。

clipboard.png

VRIK の話

基本的にやることは送信側と全く同じで参照する Transform が、 Vive の TrackObject か Photon で共有された Object かの違いしかありません。

VRIK のパラメータは送信側と同じにしておかないと同じ動きにならないのでここは注意しないといけません。

clipboard.png

雑なまとめ

「ヘイ、ジョン!大変だ」

「どうしたんだいマイケル」

「このハッカソンの記事、ソースコード2行しかかかれていないんだ!」

「なんだそんなことか、安心しなよマイケル。そもそもこの二つのアプリ合わして10行もコード書いてないんだ」

「「 HAHAHA !」」

まじめなまとめ

以上、アプリの内容の説明でしたが、なんとここまで 10 行もソースコードを書いていません。
Unity と各種 SDK でネットワークが絡んだ VR AR アプリを GUI ポチポチで簡単に作れてしまいます。

いやー良い時代ですね!

今回は単純な AR で実装しましたが、文中で出た ARKit+Vuforia での MR 実装や、 Hololens で実寸大のアバターを出すなど VR+MR の組み合わせも面白そうです。

今回観客側 AR アプリは 1 台使用しただけですが理論上複数台使用可能で、各種 SDK さえ対応していればマルチプラットフォームでクライアントを Build できます。

最近は VRchat が流行っていますが、これをベースに MRchat とかいかがでしょうか?