Как получить начальное состояние "активированного устройства" с помощью openvr? - PullRequest
0 голосов
/ 29 мая 2020

Если я запрашиваю подключенные контроллеры при инициализации, я не могу понять, какая «рука» какая.

Псевдокод инициализации:

vr = VR_Init(...);
for(i until k_unMaxTrackedDeviceCount)
{
  if(!IsTrackedDeviceConnected(i)) continue;
  switch(GetTrackedDeviceClass(i))
  {
    case TrackedDeviceClass_HMD:
      hmd_model = ...; //works great!
    break
    case TrackedDeviceClass_Controller:
      if(GetControllerRoleForTrackedDeviceIndex(i) == TrackedControllerRole_LeftHand)
        left_model = ...; //never gets here!
      if(GetControllerRoleForTrackedDeviceIndex(i) == TrackedControllerRole_RightHand)
        right_model = ...; //never gets here!
      if(GetControllerRoleForTrackedDeviceIndex(i) == TrackedControllerRole_Invalid)
        //oh no what do i do //always gets here!
  }
}

дополнительное примечание: GetControllerRoleForTrackedDeviceIndex(i) не Кажется, это задокументировано здесь ... почему бы и нет? устарело? Это действительно важная функция!

Однако в каждом кадре я могу ждать событий активации, что отлично работает:

while(PollNextEvent(...))
{
  if(eventType == VREvent_TrackedDeviceActivated)
  {
    switch(GetTrackedDeviceClass(i))
    {
       ... //same as after initialization, works to load models
       ... //here, `GetControllerRoleForTrackedDeviceIndex` works great!
    }
  }
}

Если контроллеры не подключены в запускается, но затем подключается (тем самым вызывая событие VREvent_TrackedDeviceActivated), все работает отлично.

Однако, если они подключены при запуске, я не могу понять, какая рука какая , поэтому я не могу загрузить их правильные модели, и они также никогда не запускают событие активации.

У меня также есть WaitGetPoses l oop каждый кадр, который выглядит так:

WaitGetPoses(...)
for(i until k_unMaxTrackedDeviceCount)
{
  if(!...bPoseIsValid) continue;
  switch(GetTrackedDeviceClass(i))
  {
     ... //same as above, but deal with maintaining matrices
     ... //here, `GetControllerRoleForTrackedDeviceIndex` works great!
  }
}

Одно из «решений» - каждый кадр WaitGetPoses запроса «есть ли у меня left_hand_model? Нет? Загрузить его!». Но было бы гораздо лучше управлять этим только при инициализации, а затем с любыми VREvent_TrackedDevice{Dea,A}ctivated событиями, а не «каждый раз, когда на контроллер ссылаются в любом контексте». Похоже на ошибку, заключающуюся в том, что нет способа получить начальное состояние или гарантировать, что любое входящее отсутствующее состояние вызывает событие.

tl; dr: Я не получаю надежное начальное состояние точно какие устройства подключены в openVR. Как это сделать?

также: отсутствие документации для GetControllerRoleForTrackedDeviceIndex (важная функция для любого приложения VR ...) вызывает обеспокоенность - использую ли я устаревший API? Я ищу документацию не в том месте? OpenVR - мертвый проект?

...