htc vive 开发时手柄识别经常识别到追踪器上的问题解决办法

项目中使用了两个手柄和一个追踪器,以前使用 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->GetTrackedDeviceClass(i);
		if (dev_class == vr::TrackedDeviceClass_Controller) { // 判断是否是控制器(手柄和追踪器都是控制器)
			const uint32_t buff_len = hmd->GetStringTrackedDeviceProperty(i, vr::Prop_RenderModelName_String, NULL, 0, NULL);

			if (buff_len == 0)
				continue;

			std::string prop_val;
			prop_val.resize(buff_len);

			hmd->GetStringTrackedDeviceProperty(i, vr::Prop_RenderModelName_String, &prop_val[0], buff_len, NULL);

			if(prop_val.find("vr_tracker")!= std::string::npos) {
				// 设置追踪器索引为i
				...
			} else if (prop_val.find("vr_controller")!= std::string::npos)  {
				// 设置手柄索引i
				...
			}            
		}
	}
}

 

你可能感兴趣的:(htc vive 开发时手柄识别经常识别到追踪器上的问题解决办法)