如何确定 SteamVR_TrackedObject 是 Vive 控制器还是 Vive 追踪器

Posted

技术标签:

【中文标题】如何确定 SteamVR_TrackedObject 是 Vive 控制器还是 Vive 追踪器【英文标题】:How to determine whether a SteamVR_TrackedObject is a Vive Controller or a Vive Tracker 【发布时间】:2017-04-03 12:24:04 【问题描述】:

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


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

Tracker 被视为Controller (right)CameraRig

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

跟踪器设置为设备 2。

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

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


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

【问题讨论】:

你考虑过使用triggers吗? @Hristo 你能扩展一下吗?我不确定你是什么意思?如果您要检查对象是否具有触发按钮,那么它将不起作用。因为跟踪器有针脚(连接一些东西作为触发器)并使用与控制器相同的协议。 天哪,对不起,我想说tags 在开始之前标记某些游戏对象?问题是每个SteamVR_TrackedObject 都被动态设置为一个设备,我无法预测它将如何分配。寻找与 SteamVR 和 OpenVR API 对话的最佳方法。 是的,您可以将不同的tags 分配给不同的GameObjects,这样您就可以区分它们。至少从我对你的标题的理解来看。引用:“是 Vive 控制器或 Vive 跟踪器”。 【参考方案1】:

我发现的检查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设置为索引:

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

到目前为止,要找到有关这方面的任何文档都相当困难,但这里有一些资料来源:

OpenVR wiki ETrackedDeviceProperty 值列表

【讨论】:

爱它。另请注意,Oculus 触摸控制器名称将包含“controller_left”和“controller_right”。【参考方案2】:

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

它将返回枚举值ETrackedDeviceClass。可能的值是:

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

【讨论】:

以上是关于如何确定 SteamVR_TrackedObject 是 Vive 控制器还是 Vive 追踪器的主要内容,如果未能解决你的问题,请参考以下文章

如何确定样本量

如何确定滚动视图中当前可见的区域并确定中心?

Flink on YARN时,如何确定TaskManager数

如何确定 div 是不是滚动到底部?

七步法计算测量不确定度:第四步

如何确定控件何时对用户可见?