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の座標系についてはこの辺りを参照しています。なお、座標系については、きちんと理解できていないので、間違いがあれば指摘していただけると嬉しいです。
サンプルプロジェクトはこちらにあります。
このリンク先のスクリプトをそのままコピーします。
そして固定したい3Dオブジェクトに追加します。アンカーは名前で識別するので「Object Anchor Store Name」に名前を設定します(ここでは「Cube」としています)。
アンカーの復元は起動時、保存はAir Tap(OnSelect())時に行われます。AirTapを検出するためにカーソルとGaze/Gesture Managerを追加します。なお、AnchorはUnityエディター上では動作せず、実機での確認となります。
以上でAnchorの準備はOKです。
初期起動時は、Cubeが顔に合わせて移動します。視線を合わせてAir Tapすると、そこに固定されます。再度Air Tapするとまた顔に合わせて移動します。
CubeをAir Tapして固定した状態でアプリを終了します。
なお、Bloomで戻っただけでは前回の状態から復帰するので、テストの際は「Remove」から完全に終了させます。
これを何度か繰り返す、Cubeの位置を変える、自分位置を変えてアプリを起動するなどしても、Cubeは必ず空間の同じ位置に現れます。
これで空間に名前を付けられるようになったので、家電制御などに使えそうですね。