Как определить, является ли SteamVR_TrackedObject контроллером Vive или трекером Vive

Как лучше всего определить, является ли SteamVR_TrackedObject контроллером Vive или трекером Vive?


Когда подключено 0 контроллеров и 1 Tacker:

Трекер считается Controller (right) из CameraRig.

Когда подключены 1 контроллер и 1 Tacker:

Трекер установлен на устройство 2.

Когда подключены 2 контроллера и 1 Tacker:

Создание третьего SteamVR_TrackedObject и размещение его в массиве objects CameraRig. Также, когда контроллер теряет отслеживание, теряет и трекер.


В каждом сценарии Tracker оказывается другим SteamVR_TrackedObject.index. Как лучше всего проверить, является ли SteamVR_TrackedObject трекером, или узнать, какой index трекер?


person Liam Ferris    schedule 03.04.2017    source источник
comment
Вы рассматривали возможность использования triggers?   -  person Hristo    schedule 03.04.2017
comment
@Hristo Можете ли вы расшириться? Я не уверен, что вы имеете в виду? Если вы хотите проверить, есть ли у объекта триггерная кнопка, это не сработает. Поскольку трекер имеет пины (для подключения чего-либо в качестве триггера) и использует те же протоколы, что и контроллер.   -  person Liam Ferris    schedule 03.04.2017
comment
Омг, извини, что я хотел сказать tags   -  person Hristo    schedule 03.04.2017
comment
Как в теге определенные gameObjects перед запуском? Проблема в том, что каждый SteamVR_TrackedObject динамически устанавливается для устройства, и я не могу предсказать, как он будет назначен. Ищете лучший способ общения с API SteamVR и OpenVR.   -  person Liam Ferris    schedule 03.04.2017
comment
Да, вы можете назначить разные tags разным GameObjects, вот как вы можете их различать. По крайней мере, насколько я понимаю из вашего названия. ЦИТАТА: это Vive Controller или Vive Tracker.   -  person Hristo    schedule 03.04.2017


Ответы (2)


Единственный способ проверить 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;

Найти какую-либо документацию по этому поводу до сих пор было довольно сложно, но вот некоторые источники:

person Liam Ferris    schedule 03.04.2017
comment
Любить это. Также обратите внимание, что имена сенсорных контроллеров Oculus будут содержать controller_left и controller_right. - person hellowill89; 20.07.2018

Просто наткнулся на этот старый вопрос, и я думаю, что принятый ответ был строго правильным, когда его задавали - однако есть прямой способ сделать это сейчас: вы можете использовать GetTrackedDeviceClass.

Он вернет значение перечисления ETrackedDeviceClass. Возможные значения:

  • Invalid - если по этому индексу нет отслеживаемого устройства,
  • HMD - если устройство - гарнитура,
  • Controller - если устройство ну контроллер - это один из ваших случаев,
  • GenericTracker - это еще одно ваше дело
  • TrackingReference - для базовых станций, поддерживающих камер и т. Д.,
  • DisplayRedirect - по документации - «Аксессуары, которые не обязательно отслеживаются сами по себе, но могут перенаправлять вывод видео с других отслеживаемых устройств»
  • Max - этот недокументирован, я еще не наткнулся на него
person Pindwin    schedule 06.09.2019