6

确定 a 是否SteamVR_TrackedObject是 Vive 控制器和 Vive 跟踪器的最佳方法是什么?


当 0 个 Controller 和 1 个 Tacker 配对时:

跟踪器Controller (right)CameraRig.

当 1 个 Controller 和 1 个 Tacker 配对时:

跟踪器设置为设备 2。

当 2 个 Controller 和 1 个 Tacker 配对时:

创建第三个SteamVR_TrackedObject并将其放置在CameraRig'sobjects数组中。同样,当控制器丢失跟踪时,跟踪器也会丢失。


在每种情况下,Tracker 最终都是不同的SteamVR_TrackedObject.index。检查 aSteamVR_TrackedObject是否是 Tracker 或找出indexTracker 是哪个的最佳方法是什么?

4

2 回答 2

10

SteamVR_TrackedObject我发现的唯一检查 a 的方法是检查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为索引:

GetComponent<SteamVR_TrackedObject>().index = (SteamVR_TrackedObject.EIndex)index;

到目前为止,找到这方面的任何文档都非常困难,但这里有一些来源:

于 2017-04-03T12:24:04.287 回答
3

只是偶然发现了这个老问题,我猜当被问到时,接受的答案是严格正确的——不过,现在有一种直接的方法:你可以使用GetTrackedDeviceClass

它将返回 enum 的值ETrackedDeviceClass。可能的值为:

  • Invalid- 如果此索引下没有被跟踪的设备,
  • HMD- 如果设备是耳机,
  • Controller- 如果设备是控制器 - 这是你的情况之一,
  • GenericTracker- 这是你的另一个案例
  • TrackingReference- 用于基站、支持摄像头等,
  • DisplayRedirect- 通过文档 - “不一定自己跟踪的附件,但可能会重定向来自其他跟踪设备的视频输出”
  • Max- 这个是无证的,我还没有偶然发现它
于 2019-09-06T12:47:24.953 回答