В течение последнего месяца я пытался получить входные данные контроллера с моей виртуальной гарнитуры с помощью скрипта Python (openvr). До сих пор мне удалось перевести матрицу из радианов в градусы, но я понятия не имею, значат ли эти числа что-нибудь, поскольку у меня нет возможности их интерпретировать. Правильно ли я обращаюсь к матрице и использую math.grades по назначению?
[это может быть случайная ерунда]
Мой сценарий:
import math
import openvr
import numpy as np
import time
def get_controller_position():
# Initialize OpenVR
openvr.init(openvr.VRApplication_Scene)
# Get the VR system
vr_system = openvr.VRSystem()
try:
while True:
# Create arrays for poses with the correct size
poses = openvr.TrackedDevicePose_t * openvr.k_unMaxTrackedDeviceCount
poses = poses()
# Get poses from the compositor
openvr.VRCompositor().waitGetPoses(poses, None)
# Check for connected controllers
for device_index in range(openvr.k_unMaxTrackedDeviceCount):
device_class = vr_system.getTrackedDeviceClass(device_index)
if device_class == openvr.TrackedDeviceClass_Controller:
pose = poses[device_index]
if pose.bPoseIsValid:
# Extract the matrix from the pose object
matrix = pose.mDeviceToAbsoluteTracking
# Manually extract the 3x4 matrix
mat = np.array([
[matrix[0][0], matrix[0][1], matrix[0][2], matrix[0][3]],
[matrix[1][0], matrix[1][1], matrix[1][2], matrix[1][3]],
[matrix[2][0], matrix[2][1], matrix[2][2], matrix[2][3]],
])
# Extract position (last column of the 3x4 matrix)
position = mat[:, 3]
# Extract rotation form matrix(top-left 3x3 part)
xp=(math.degrees(math.atan2(mat[1][0],mat[0][0])))
yp=(math.degrees(math.atan2(mat[2][0],math.sqrt((mat[2][1])**2+(mat[2][2])**2))))
zp=(math.degrees(math.atan2(mat[2][1],mat[2][2])))
print(f"Controller {device_index}:")
print(f"Position: {position}")
print(f"Rotation: \n{xp,yp,zp}")
# Sleep for 0.1 seconds between checks
time.sleep(0.1)
finally:
# Shutdown OpenVR when exiting the loop
openvr.shutdown()
if __name__ == "__main__":
get_controller_position()
Подробнее здесь: https://stackoverflow.com/questions/789 ... ler-output