196の日記

完全に開発メモと雑談、その他忘れそうな計算式などを書き溜める場所になっています!

Unity Oculus Vive Hololens など HMDのトラッキングを無効に...

...したいですね。僕にはわからないです笑 なので教えてくださる方がいるとありがたい。

擬似的にHMDを動かないようにする

 設定でなにやらできそうな気もしますが、わからないものはわからないので、トラッキングによる移動分を相殺することで、擬似的に動かないように見せることは可能です。

手順
1.MainCamera を新たに作った GameObject の子オブジェクトにする。
2.Update 内で UnityEngine.VR 内の InputTracking.GetLocalPosition(VRNode)により、HMDの座標を取得。
3.固定したい座標を真ん中として、2で取得したHMDの移動分を先ほど作った親オブジェクトに移動してもらう。
(例として、原点座標に固定しておきたいのなら、取得したVector3の値に-1をかけたものを親オブジェクトのpositionに設定する。)



おすすめは、親オブジェクトを固定したいポイントに置き、カメラはローカルで 0, 0, 0の座標に。あとはstart時に親のポジションを記憶し、カメラが移動した分を取得し、"親の最初の座標+毎回取得したHMD値*-1" を親のpositionに上書きしていけばうまく相殺できるはずです。

//Update内
positionParent.transform.position = ( -1 * InputTracking.GetLocalPosition (VRNode.CenterEye) );

今回はたまたま原点に固定だったので、毎回-1をかけたものをそのまま使用しております。この値に任意のポジションを足してやれば、自分で指定したワールド座標にHMDを持っていくことができます。


回転も似たような手法で解決可能ですが、首の位置を固定する出番はHMDではさすがにないと思うので省略。





余談

Unity - マニュアル: イベント関数の実行順


このリンクを見てもらえるとわかるのですが、マウスのInputEventはupdateより前に処理されています。なので、HMDのInputもおそらくUpdate前でしょう。(不確か)
ただ、その値の上書きはUpdateより後です。なのでUpdateで毎回原点座標で上書きしても、それをトラッキングの値でさらに上書きされるので、結局相殺ができません。どのタイミングで上書きされているのか、またトラッキングをオフにする機能もあるのであれば教えていただきたいです。笑



とりあえずなんとかなってます。以上