「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外すときに眼鏡も外れたりして、ちょっと悲しくなる。
たぶん、もっとスマートなやり方はありそう。