なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ

書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

2022/06/16

OpenVR SDK で SetOverlayTransformTrackedDeviceRelative した座標の絶対値が知りたい

カテゴリー:VRC#Unity

DLL Injection の記事はどうした!と言われそうですが、この後に書く予定です。許してください。
ということで、この記事では、 OpenVR SDKSetOverlayTransformTrackedDeviceRelative あと適用した座標についての絶対値をとる方法についてメモです。

といってもカンタンで、単純に渡した HmdMatrix34_t を使えば取得できます。
例えばこんな感じで SetOverlayTransformTrackedDeviceRelative したとしたら:

var baseMatrix = Matrix4x4.TRS(position, transform.rotation, transform.localScale);
var matrix = new HmdMatrix34_t
{
    m0 = baseMatrix.m00,
    m1 = baseMatrix.m01,
    m2 = baseMatrix.m02,
    m3 = baseMatrix.m03,
    m4 = baseMatrix.m10,
    m5 = baseMatrix.m11,
    m6 = baseMatrix.m12,
    m7 = baseMatrix.m13,
    m8 = baseMatrix.m20,
    m9 = baseMatrix.m21,
    m10 = baseMatrix.m22,
    m11 = baseMatrix.m23
};
var trackedDeviceIndex = OpenVR.System.GetTrackedDeviceIndexForControllerRole(_attachedControllerRole);
Overlay.SetOverlayTransformTrackedDeviceRelative(_handle, trackedDeviceIndex, ref matrix);

絶対値は:

var pTrackedDevicePoseArray = new TrackedDevicePose_t[OpenVR.k_unMaxTrackedDeviceCount];
OpenVR.System.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0f, pTrackedDevicePoseArray);

var controller = pTrackedDevicePoseArray[trackedDeviceIndex];
var renderingPosition = controller.mDeviceToAbsoluteTracking.GetPosition() + matrix.GetPosition();
var renderingRotation = controller.mDeviceToAbsoluteTracking.GetRotation() * matrix.GetRotation();

それぞれ、 renderingPositionrenderingRotation の値が絶対値になります。
ということで、メモでした。