ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

HoloLens の World Anchor を使用する

HoloLensにはWorld Anchor / Spcial Anchor という機能があります。これはアプリ内の3Dオブジェクトの座標を固定する機能です。

HoloLens内の座標は少々ややこしく、原点(0,0,0、すなわちカメラ座標)は起動時のHoloLensの位置になります。これは起動ごとに空間内の座標が変わることを意味します(1mmも狂わずまったく同じ位置で起動することは不可能なので)。

そのためアプリで使用する3Dオブジェクトを座標で固定することはできません。そこで

Anchorを使って空間に固定します。Anchorは原点座標によらず、空間の固定された位置に置かれます。Anchor(アンカー)は目印、碇といういみで、3Dオブジェクトから碇を下すイメージをするとわかりやすいでしょうか。

次の動画をみると、起動と終了を繰り返しても、3Dオブジェクトが移動後の位置に固定されていることがわかります。


HoloLens World Anchor Demo (空間にオブジェクトをピン止めする)

 

World AnchorおよびHoloLensの座標系についてはこの辺りを参照しています。なお、座標系については、きちんと理解できていないので、間違いがあれば指摘していただけると嬉しいです。

サンプルプロジェクトはこちらにあります。

github.com

このリンク先のスクリプトをそのままコピーします。

そして固定したい3Dオブジェクトに追加します。アンカーは名前で識別するので「Object Anchor Store Name」に名前を設定します(ここでは「Cube」としています)。

アンカーの復元は起動時、保存はAir Tap(OnSelect())時に行われます。AirTapを検出するためにカーソルとGaze/Gesture Managerを追加します。なお、AnchorはUnityエディター上では動作せず、実機での確認となります。

f:id:kaorun55:20160606102838p:plain

以上でAnchorの準備はOKです。

初期起動時は、Cubeが顔に合わせて移動します。視線を合わせてAir Tapすると、そこに固定されます。再度Air Tapするとまた顔に合わせて移動します。

f:id:kaorun55:20160606101415p:plain

CubeをAir Tapして固定した状態でアプリを終了します。

なお、Bloomで戻っただけでは前回の状態から復帰するので、テストの際は「Remove」から完全に終了させます。

f:id:kaorun55:20160606103316p:plain

これを何度か繰り返す、Cubeの位置を変える、自分位置を変えてアプリを起動するなどしても、Cubeは必ず空間の同じ位置に現れます。

これで空間に名前を付けられるようになったので、家電制御などに使えそうですね。