如何判断一个 SteamVR_TrackedObject 是 Vive Controller 还是 Vive Tracker
How to determine whether a SteamVR_TrackedObject is a Vive Controller or a Vive Tracker
确定 SteamVR_TrackedObject
是 Vive 控制器还是 Vive 追踪器的最佳方法是什么?
当0个控制器和1个Tacker配对时:
追踪器取为CameraRig
的Controller (right)
。
当1个控制器和1个Tacker配对时:
追踪器设置为设备 2。
当2个控制器和1个Tacker配对时:
正在创建第三个 SteamVR_TrackedObject
并将其放入 CameraRig
的 objects
数组中。此外,当控制器失去跟踪时,跟踪器也会失去跟踪。
在每个场景中,Tracker 最终都是不同的 SteamVR_TrackedObject.index
。检查 SteamVR_TrackedObject
是否为追踪器或查找哪个 index
追踪器的最佳方法是什么?
我发现检查 SteamVR_TrackedObject
的唯一方法是检查 ETrackedDevicePoperty.Prop_RenderModelName_String
:
uint index = 0;
var error = ETrackedPropertyError.TrackedProp_Success;
for (uint i = 0; i < 16; i++)
{
var result = new System.Text.StringBuilder((int)64);
OpenVR.System.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_RenderModelName_String, result, 64, ref error);
if (result.ToString().Contains("tracker"))
{
index = i;
break;
}
}
然后你可以设置SteamVR_TrackedObject.index
到index:
GetComponent<SteamVR_TrackedObject>().index = (SteamVR_TrackedObject.EIndex)index;
到目前为止,要找到关于此的任何文档都非常困难,但这里有一些来源:
刚刚偶然发现了这个老问题,我想当它被问到时,接受的答案是完全正确的——不过现在有一个直接的方法:你可以使用 GetTrackedDeviceClass.
它将 return 枚举的值 ETrackedDeviceClass
。可能的值是:
Invalid
- 如果该索引下没有被追踪的设备,
HMD
- 如果设备是耳机,
Controller
- 如果设备是控制器 - 这是您的案例之一,
GenericTracker
- 这是您的另一个案例
TrackingReference
- 用于基站、支持摄像头等,
DisplayRedirect
- 根据文档 - "Accessories that aren't necessarily tracked themselves, but may redirect video output from other tracked devices"
Max
- 这个没有记录,我还没有偶然发现它
确定 SteamVR_TrackedObject
是 Vive 控制器还是 Vive 追踪器的最佳方法是什么?
当0个控制器和1个Tacker配对时:
追踪器取为CameraRig
的Controller (right)
。
当1个控制器和1个Tacker配对时:
追踪器设置为设备 2。
当2个控制器和1个Tacker配对时:
正在创建第三个 SteamVR_TrackedObject
并将其放入 CameraRig
的 objects
数组中。此外,当控制器失去跟踪时,跟踪器也会失去跟踪。
在每个场景中,Tracker 最终都是不同的 SteamVR_TrackedObject.index
。检查 SteamVR_TrackedObject
是否为追踪器或查找哪个 index
追踪器的最佳方法是什么?
我发现检查 SteamVR_TrackedObject
的唯一方法是检查 ETrackedDevicePoperty.Prop_RenderModelName_String
:
uint index = 0;
var error = ETrackedPropertyError.TrackedProp_Success;
for (uint i = 0; i < 16; i++)
{
var result = new System.Text.StringBuilder((int)64);
OpenVR.System.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_RenderModelName_String, result, 64, ref error);
if (result.ToString().Contains("tracker"))
{
index = i;
break;
}
}
然后你可以设置SteamVR_TrackedObject.index
到index:
GetComponent<SteamVR_TrackedObject>().index = (SteamVR_TrackedObject.EIndex)index;
到目前为止,要找到关于此的任何文档都非常困难,但这里有一些来源:
刚刚偶然发现了这个老问题,我想当它被问到时,接受的答案是完全正确的——不过现在有一个直接的方法:你可以使用 GetTrackedDeviceClass.
它将 return 枚举的值 ETrackedDeviceClass
。可能的值是:
Invalid
- 如果该索引下没有被追踪的设备,HMD
- 如果设备是耳机,Controller
- 如果设备是控制器 - 这是您的案例之一,GenericTracker
- 这是您的另一个案例TrackingReference
- 用于基站、支持摄像头等,DisplayRedirect
- 根据文档 - "Accessories that aren't necessarily tracked themselves, but may redirect video output from other tracked devices"Max
- 这个没有记录,我还没有偶然发现它