初めまして、meleap でインターンシップをさせて頂いている金丸です。『ZED Stereo Camera の Spatial Mapping を活用した AR アプリ』の可能性に関して今回調査したのでその報告をしたいと思います。
主に行ったことは、ZED のマッピング情報を AR に活用することができるのか。その中で、ARKit を用いて ZED のマッピング情報を活用したアプリケーションの作成に挑戦しました。
1. ZED Stereo Camera
1.1 ZED Stereo Cameraとは?
皆さん、 ZED Stereo Camera(ZED) を知っていますか?
まず、ステレオカメラとは人と同じように二つのカメラを用いることで通常の単眼のカメラでは得ることのできなかった奥行きに関しての情報を得ることができます。

ZED では、この二つのカメラを用いて動的に深度を計算することで高度な 3Dマッピングを行うことができます。AR/VR 環境に高度なマッピング情報が活用されれば、現実と AR/VR 空間の差はさらに縮まると期待されています。
1.2 ZED の問題点
ZED のマッピング情報を AR 空間上で活用するためには大きく2つの課題を解決する必要がありました 。
まず一つ目に、ZED 本体と iPhone の併用ができないという点です。そこで、Spatial Mapping のマッピング機能により作成した 3D mesh だけを抜き出すことを考えました。3D mesh はプログラムの設定で PC 内に保存することができ、そのファイルを AR アプリを作る Unity 上に持っていくことで解決することができました。また、マッピング情報に関しては Spatial Mapping を起動時の ZED 本体の位置から相対的な位置に保存されているため、AR アプリの起動位置さえ注意すれば実空間と同様の形の3D meshを展開できます。
二つ目に、マッピング情報の反転に関してです。ZED を用いて取り込んだマッピング情報は右手座標系で 3D mesh を作成しているのに対して、Unity 上で 3D オブジェクト(3D mesh) を展開すると Unity では左手座標系でオブジェクトを表示してしまうので反転した状態のメッシュができてしまいます。

これには、ZED SDK のプログラムを直すことと反転をモデリングソフトなどを活用して戻すことの二つの解決策が考えられますが、前者に関しては利用者権限でいじれない領域なのでダメでした…。単純に反転しているだけなのかをモデリングソフトを用いて調査した結果、X 軸の反転のみ行えば元のマッピング情報と同じものが得られることがわかったので、マッピング情報を利用する際にはモデリングソフトにおけるミラーによる反転または 、Unity 上で X 座標の Scale を反転させることを忘れずに行うようにしてください。
2. マッピング情報のARアプリへの活用
実は 、今回用いたARKit にも 3D 空間を読み出し、マッピングを行う機能があります。なぜ ARKit にもマッピング機能があるのに ZED のマッピング情報を利用しようとしているか説明したいと思います。
ARKit のサンプルアプリの中にはオブジェクト・平面の検出を行っているものもあります。しかし、一部の空間に対しての検出精度は高いですが、全体的な実空間の検出精度はまだよくない状態です。(今後より良くなっていく可能性は十分にあります。) そこで、今回 ZED の高度なマッピングと AR アプリを合わせることを考えました。ZED の高精度のマッピングを利用することで特定の空間に対して実空間と AR 空間をうまく適合させる事ができます。
今回は実験の意図を込め、3D mesh に対して球を投げると爆発する、つまり、実空間の物に Unity で作成した球が実際にぶつかっているように見える、というような簡易的なアプリを作成しました。また、複数人で AR 体験を共有できるように Photon Server を用いて球・プレイヤーに関しての情報を同期するよう工夫しました。
3. Photon
3.1 Photon Server とは?
Photon はマルチプレイヤーゲームの開発を簡単に進める事ができるプラットフォームです。通常、プレイヤーの挙動や位置などの同期にはサーバーを立て、同期したい情報を送受信するプログラムを組み込む事が必要となりますが、Photon Server に接続することでそれらが容易にできるようになるというものです。有名なのですと、動物タワーバトルなどのアプリがありますね。ログイン設定、サーバー接続など Photon に関してはうら干物さんのブログの方に詳しく載っていますので割愛させていただきます。
Photon Server を利用したアプリは多くありますが、AR と Photon を組み合わせたアプリはあまりないので、どのように位置同期をしているかについて詳しく書きたいと思います。(基本的には変わらないのですが…)
3.2 同期方法に関して
まず、PhotonNetwork.Instantiate() で同期したいオブジェクトを生成します。
PhotonNetwork.Instantiate() で生成しないと他のプレイヤーとの同期ができなくなってしまうので注意してください。また、Resources 内に Prefab を作成しないと Photon Server 接続時にオブジェクトの生成ができなくなるので注意してください。
PhotonNetwork.Instantiate("オブジェクト名", Position, Rotation);
//PhotonNetwork.Instantiate()で生成することで共有することができるオブジェクトを作り出せる
同期は Photon View と Photon Transform View の observed components に同期したいオブジェクトを入れることで Photon Server がオブジェクトの同期部分を行なってくれます。


サーバー接続時に ID を指定することでプレイヤーによって同期するべきオブジェクトを分けることができます。同期に関しては、オブジェクトの ID を確認し、その ID のプレイヤーに関する端末のカメラの向き、位置を同期します。プレイヤーの同期を行う事で子オブジェクトである球の初期位置などの情報も同期することができます。これらの同期は PUN RPC を用いて行いました。特に AR アプリを複数人で利用する場合にはカメラが複数存在するため、自分のカメラと他人のカメラをちゃんと識別する必要があるので注意してください。
void Start () {
if (myPV.isMine) //自分であれば実行
{
//MainCameraのtargetにこのゲームオブジェクトを設定
cam = Camera.main;
//カメラの識別
}
}
void Update() {
if (myPV.isMine) //自分であれば実行
{
Vector3 campos = Camera.main.gameObject.transform.position;
player.transform.position = new Vector3(campos.x, campos.y, campos.z);
player.transform.rotation = Camera.main.gameObject.transform.rotation;
//cameraのある位置にPlayerを配置。また、playerの向きもcameraに合わせる
if (Input.GetButtonDown("Fire1"))
{
Shot();
//球の生成、挙動、消滅を行うプログラム
}
}
}
Photon での同期において骨格となるプログラムは上記のようになっています。Camera に関してオーナーを把握し、オーナーのカメラに対して Player の位置、向きを同期します。また、ボタンのタップ(クリック)に対して球の挙動に関して同期するプログラムを走らせます。
4. アプリの紹介
アプリ上での mesh の見え方とその誤差や Photon での同期状況など作成したアプリの紹介をして行きます。
メッシュ空間と実空間の両端における誤差は AR Marker による起動だとこの程度出てきます。また、メッシュ作成時に複雑な形の物は読み込めないのでそこでも誤差が多少出てしまいます。

iPhone と Player の位置関係は次のようになります。向きに関しても iPhone と Player で同期が取れていることがわかると思います。

球の軌道とメッシュとの衝突は次の動画のような形で表されます。
アプリの作成にあたって現状、ZED の mesh 情報を ARKit に応用するには次のような問題点が存在しています。
- ARKit 起動時に多少のラグが発生する。
- AR Marker を利用していても mesh と実空間の間に多少のズレがある。
- カメラの状態を維持しないと mesh 情報やプレイヤーの位置情報がズレてしまう。(急な動きに対応できない)
- ZED で作成した mesh を Unity にインポートすると mesh の高さゼロの地点が 作成時の mesh の中で一番低い場所となってしまう
- ZED で平面 mesh を作る時に若干斜めに平面を認識してしまう
- 床や壁と色が似ていたりするオブジェクトの認識が甘い
5. 今後の展望は?
現実とゲームがより密に繋がると思います。例えば、一部のオブジェクトのメッシュ情報を与える事で実空間上に違和感なくアイテムを出現させる事ができたり、フィールド全体のメッシュ情報を与えたARサバイバルゲームのようなものが作成できると考えられます。
ZED を用いてもマッピング精度は多少のずれがあったり、苦手とする空間があったりします。また、現実問題として大きなフィールドでのメッシュの作成には手間がかかりますし、作成する mesh が大きくなる分データが膨大になることが考えられます。それに当たり、どの程度の負荷まで AR アプリが耐えられるのかテストしていくことも求められます。
6. 最後に
今回作成したマッピング情報の AR への活用ではまだ問題点が残っている状態です。しかし、AR ゲームにおいて大きな障害である現実との違和感の一つを空間のマッピングを利用することで解決できると感じました。今ある問題点の多くは今後マッピングの精度の向上や AR と各デバイスとの連携により解決していくと思います。現実と AR の違いがわからなくなる日は近いかもしれません。
最後に、触れたことのない技術を体験し、その技術の様々な可能性を探るという経験は自分の中でとても有意義なものでした。最先端の技術に触れることで、まだ見たことのない技術を使って何かを作り、一歩先の未来を垣間見ることができることの面白さを知ることができました。