public bool GetDeviceTransformByIndex_SteamVR(int index, out Vector3 position, out Quaternion rotation) { if (index < 0 || index >= trackedObjects.Length) { position = Vector3.zero; rotation = Quaternion.identity; return(false); } TrackedDevicePose_t pose = trackedObjects[index]; if (pose.bDeviceIsConnected && pose.bPoseIsValid && pose.eTrackingResult == ETrackingResult.Running_OK) { Matrix4x4 poseMat = TrackingSpaceOrigin.ConvertMatrixOpenVRToUnity(pose.mDeviceToAbsoluteTracking); position = TrackingSpaceOrigin.ExtractPosition(poseMat); position.z *= -1; //flip for OpenGL to DirectX conversion Quaternion quat = TrackingSpaceOrigin.ExtractRotation(poseMat); quat = Quaternion.Euler(new Vector3(-quat.eulerAngles.x, -quat.eulerAngles.y, quat.eulerAngles.z)); rotation = quat; return(true); } else { position = Vector3.zero; rotation = Quaternion.identity; return(false); } }