本日はMRTKv2.xの調査枠です。
MRTKv2.xを使ったMetaQuest3向けアプリでハンドレイのポインタが正常に動作しない問題が発生したので情報を記事に残します。
今回はMRTKv2.x側のコード修正による回避方法についてです。
前回記事
以下の前回記事からの続きです。
bluebirdofoz.hatenablog.com
問題の原因とMeta XR SDK側の修正による回避方法は以下の記事を参照ください。
bluebirdofoz.hatenablog.com
問題の回避策
本問題はMeta XR SDKのv66でOVRHand.csの初期化処理に修正が入り、PointerPoseのルートオブジェクトが変わったことが原因です。
MRTKv2.xでは以下のOculusHand.csでPointerPoseの姿勢をポインターに利用しており、この処理を修正することで問題に対処できます。
Packages/MixedRealityToolkitFoundation/Providers/Oculus/XRSDK/MRTK-Quest/Scripts/Input/Controllers/OculusHand.cs
OculusHand.csの以下の該当コードを修正します。
・修正前
129: // Leverage Oculus Platform Hand Ray - instead of simulating it in a crummy way 130: currentPointerPose.Position = trackingOrigin.TransformPoint(hand.PointerPose.position); 131: 132: Vector3 pointerForward = trackingOrigin.TransformDirection(hand.PointerPose.forward); 133: Vector3 pointerUp = trackingOrigin.TransformDirection(hand.PointerPose.up);
・修正後
129: // Leverage Oculus Platform Hand Ray - instead of simulating it in a crummy way 130: // PointerPoseの親オブジェクトが変わったことを考慮してローカル座標の姿勢を取得するように修正する 131: Vector3 pointerPosePosition = hand.PointerPose.localPosition; 132: Vector3 pointerPoseForward = hand.PointerPose.parent == null ? 133: hand.PointerPose.forward : 134: hand.PointerPose.parent.InverseTransformDirection(hand.PointerPose.forward); 135: Vector3 pointerPoseUp = hand.PointerPose.parent == null ? 136: hand.PointerPose.up : 137: hand.PointerPose.parent.InverseTransformDirection(hand.transform.up); 138: 139: currentPointerPose.Position = trackingOrigin.TransformPoint(pointerPosePosition); 140: Vector3 pointerForward = trackingOrigin.TransformDirection(pointerPoseForward); 141: Vector3 pointerUp = trackingOrigin.TransformDirection(pointerPoseUp);
修正を行ってアプリを実行すると、以下の通り正常な位置からハンドレイのポインターが飛ぶようになります。