【问题标题】:How to detect position of Vive base stations?如何检测 Vive 基站的位置?
【发布时间】:2017-08-24 11:11:11
【问题描述】:

所以我对 Unity 和 VR 完全陌生,但对于一个项目,我需要检测基站的位置。

我试过用谷歌搜索,但由于我不知道所有的术语,我真的不知道在哪里寻找什么。

我能找到的只是如何检测控制器。

【问题讨论】:

  • 我怀疑这是信息暴露,因为 OpenVR 是各种硬件的抽象 API。并非所有硬件都有基站,例如带摄像头的裂谷轨道。其他头显可能使用完全不需要外部传感器/灯塔的由内向外跟踪。这是一个隐藏的跟踪实现细节。
  • 刚刚在openvr.h 标头中注意到了这一点:enum ETrackedDeviceClass { ... TrackedDeviceClass_TrackingReference = 4, // Camera and base stations that serve as tracking reference points ...}。所以你可以得到他们的位置。 GetSortedTrackedDeviceIndicesOfClass 方法应该给出姿势数组的索引。好吧,如果你直接访问 API - 不了解 Unity。

标签: unity3d virtual-reality htc-vive openvr


【解决方案1】:

这是一种方法,全部使用 Unity 代码:

var nodeStates = new List<XRNodeState>();
InputTracking.GetNodeStates(nodeStates);

foreach (var trackedNode in nodeStates.Where(n => n.nodeType == XRNode.TrackingReference))
{
    bool hasPos = trackedNode.TryGetPosition(out var position);
    bool hasRot = trackedNode.TryGetRotation(out var rotation);

}

【讨论】:

    【解决方案2】:

    在 OpenVR 中,基站是“被跟踪的设备”,就像控制器和 HMD 一样。 Unity 的标准 SteamVR 插件已经有一种方法可以获取任何被跟踪设备的位置,例如查看控制器是如何在标准 [CameraRig] 预制件中实现的。

    唯一的问题是您需要提供设备的“索引”,每次重新连接耳机时,该索引可能会发生变化。 SteamVR 插件使用SteamVR_ControllerManager 组件处理这个问题,但顾名思义——它只处理控制器。您应该能够实现类似的东西,或者只是编辑脚本并找到行

    if (deviceClass == ETrackedDeviceClass.Controller ||
        deviceClass == ETrackedDeviceClass.GenericTracker)
    

    并将ETrackedDeviceClass.TrackingReference 添加到此列表中。然后,您应该能够复制控制器对象并将它们附加到 SteamVR_ControllerManager 的“附加对象”数组中,以使基站出现在您的场景中。

    【讨论】:

      猜你喜欢
      • 2013-07-27
      • 2011-03-22
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 2019-08-16
      • 2021-08-23
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多