cmbruns/pyopenvr

how do you use mDeviceToAbsoluteTracking to find the tracking data for a controller

Simontho001 opened this issue · 5 comments

heres my code

import sys
import time
import openvr
import math
def from_matrix_to_pose_dict(matrix):
    pose = {}
    # From http://steamcommunity.com/app/358720/discussions/0/358417008714224220/#c359543542244499836
    position = {}
    position['x'] = matrix[0][3]
    position['y'] = matrix[1][3]
    position['z'] = matrix[2][3]
    q = {}
    q['w'] = math.sqrt(max(0, 1 + matrix[0][0] + matrix[1][1] + matrix[2][2])) / 2.0
    q['x'] = math.sqrt(max(0, 1 + matrix[0][0] - matrix[1][1] - matrix[2][2])) / 2.0
    q['y'] = math.sqrt(max(0, 1 - matrix[0][0] + matrix[1][1] - matrix[2][2])) / 2.0
    q['z'] = math.sqrt(max(0, 1 - matrix[0][0] - matrix[1][1] + matrix[2][2])) / 2.0
    q['x'] = math.copysign(q['x'], matrix[2][1] - matrix[1][2])
    q['y'] = math.copysign(q['y'], matrix[0][2] - matrix[2][0])
    q['z'] = math.copysign(q['z'], matrix[1][0] - matrix[0][1])
    pose['position'] = position
    pose['orientation'] = q
    return pose
openvr.init(openvr.VRApplication_Scene)
poses = []  # will be populated with proper type after first call
for i in range(100):
    poses, _ = openvr.VRCompositor().waitGetPoses(poses, None)
    hmd_pose = poses[openvr.k_unTrackedDeviceIndex_Hmd]
    matrix = (hmd_pose.mDeviceToAbsoluteTracking)
    d = from_matrix_to_pose_dict(matrix)
    print(d)       
    sys.stdout.flush()
    time.sleep(0.2)
openvr.shutdown()

its doing what i want it to except that its getting data from the head mount display and i want it to get data from a controller instead how would i do so?

Please, post the code using the code formatting (markdown).

fixed it sorry not very familiar with this website

its doing what i want it to except that its getting data from the head mount display and i want it to get data from a controller instead how would i do so?

This code of yours:

poses, _ = openvr.VRCompositor().waitGetPoses(poses, None)

reads poses for all devices, which are currently tracked. This includes headset, lighthouses, controllers. You are reading the first pose:

hmd_pose = poses[openvr.k_unTrackedDeviceIndex_Hmd]

which indeed is a HMD pose. You need to figure out, which pose corresponds to what (i.e. at which index is your controller) and get it there.

I found a little script online that finds the index but what would I do with that I'm not familiar with this library

You will get the pose exactly the same way as you did for the HMD:

controller_pose = poses[controller_index]

and then do whatever you want with it.

There is not much documentation for the Python code, as it basically mimics the native API. So for example, for how to use WaitGetPoses you might want to read the official doc (https://github.com/ValveSoftware/openvr/wiki/IVRCompositor::WaitGetPoses), or even read the source code (https://github.com/ValveSoftware/openvr/blob/master/headers/openvr.h).