Если я запрашиваю подключенные контроллеры при инициализации, я не могу понять, какая «рука» какая.
Псевдокод инициализации:
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 - мертвый проект?