「UnityでQuest2アプリ作成」回転角の扱い

先日投稿したVR内のカメラの移動について、参考にさせてもらったBlogから、どこを調整して動くようになったのか、忘れないようにメモを追加しておく。
元ネタは、milkway8008さんの一年ほどまえの記事。
milkyway8008.hatenablog.com

何種類か説明してくれている移動方法のうち、まずジョイスティック移動を動かしてみようとしたら、GetLocalRotationがサポートから外れたようで、ちょっと書換えが必要だった。もとの記述はこんな感じ。

//HMDのY軸の角度取得
Vector3 changeRotation = new Vector3(0, InputTracking.GetLocalRotation(XRNode.Head).eulerAngles.y, 0);
//OVRCameraRigの位置変更
this.transform.position += this.transform.rotation * (Quaternion.Euler(changeRotation) * changePosition);

いろいろググって、最終的に下記のように書き換えて、とりあえず動いた。

private List<XRNodeState> nodeStates = new List<XRNodeState>();
//HMDの角度取得
InputTracking.GetNodeStates(nodeStates);
var headState = nodeStates.FirstOrDefault(node => node.nodeType == XRNode.Head);
headState.TryGetRotation(out headQuaternion);
//OVRCameraRigの位置変更
this.transform.position += this.transform.rotation * (headQuaternion * changePosition);

GetLocalRotationを置き換える方法は下記が参考になった。
角度を取得する前に、まず状態のLISTを取得して、そこから角度を取り出す手間が必要になった模様。
流用の際に、headstateがnullの場合の扱いは省略したけど、とりあえず動いてはいる。
unity3d - replacement for InputTracking.GetLocalPosition in unity - Stack Overflow
元にした、milkway8008さん作成の記述では、最初にEular角でY軸周りの角度を取得して、Cameraの動きを計算するときにQuaternionに変換しているように見える。
GetLocalRotationはTryGetRotationに置き換え。
下記のReferenceによれば、TryGetRotationでは Quaternionを直接返すようなので、そのままCameraの動きに適用すれば一応動くけど、Y軸周りの回転だけを抽出することはできていない。
XR.XRNodeState-TryGetRotation - Unity スクリプトリファレンス

角度の扱いについて、もう少し細かい操作ができるように勉強は必要。

[追記]
回転角の変換については、きっちりとまとめてくれているサイトがあるので、そこを見ながら調整。
bluebirdofoz.hatenablog.com
とりあえず視線の向きを拾って、左右の向きだけが変えられるように変更。たぶん、これで元ネタと同様の動きになったハズ。

        Vector3 changeRotation = new Vector3(0, headQuaternion.eulerAngles.y, 0);
        this.transform.position += this.transform.rotation * (Quaternion.Euler(changeRotation) * changePosition);

それにしても、Build&RunのたびにHMDを被るのって面倒…。
HMD外すときに眼鏡も外れたりして、ちょっと悲しくなる。
たぶん、もっとスマートなやり方はありそう。