项目中使用了两个手柄和一个追踪器,以前使用 vr::IVRSystem
hmd->GetTrackedDeviceIndexForControllerRole(vr::TrackedControllerRole_LeftHand)
hmd->GetTrackedDeviceIndexForControllerRole(vr::TrackedControllerRole_RightHand)
来分别获取左右手柄控制器的索引,但是测试发现这个 API 经常错误的返回追踪器索引,导致手柄显示及功能混乱。
后来选择放弃这个API,使用下面的办法实现了原有的功能:遍历所有可用设备,使用GetStringTrackedDeviceProperty获取设备名字属性,用手柄名字(vr_controller)和追踪器名字(vr_tracker)区分手柄和追踪器,定义第一个获取的手柄索引为右手,之后的为左手。
核心代码如下:
vr::TrackedDevicePose_t tracked_pos[vr::k_unMaxTrackedDeviceCount];
vr::VRCompositor()->WaitGetPoses(tracked_pos, vr::k_unMaxTrackedDeviceCount, NULL, 0);
for (int i = 0; i < vr::k_unMaxTrackedDeviceCount; ++i) {
vr::TrackedDevicePose_t pose = tracked_pos[i];
if(pose.bPoseIsValid && pose.bDeviceIsConnected) {
const vr::TrackedDeviceClass dev_class = hmd-