如何判断一个 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配对时:

追踪器取为CameraRigController (right)

当1个控制器和1个Tacker配对时:

追踪器设置为设备 2。

当2个控制器和1个Tacker配对时:

正在创建第三个 SteamVR_TrackedObject 并将其放入 CameraRigobjects 数组中。此外,当控制器失去跟踪时,跟踪器也会失去跟踪。


在每个场景中,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 - 这个没有记录,我还没有偶然发现它