Действия второго контроллера VRTK HTC Vive

Мы начали создавать приложение для HTC Vive изначально без использования VRTK. Недавно мы перешли на использование VRTK и столкнулись с проблемой, когда мы хотим выполнить некоторые действия, когда один контроллер удерживает триггер, а другой нажимает другую кнопку. Как добиться этого с помощью VRTK? Наш текущий код:

controllerMain = SteamVR_Controller.Input((int)trackedObj.index);
controllerSecondary = SteamVR_Controller.Input(SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Leftmost));

// In Update()
if (controllerMain.GetPressDown(triggerButton) && controllerSecondary.GetPressDown(triggerButton))
{
    scaleSelected(gameObj); //enlarges selected GameObject based on distance between controllers
}

if (controllerMain.GetPressDown(triggerButton) && controllerSecondary.GetPressDown(gripButton))
{
    deleteObject(gameObj); //delete selected GameObject
}

Я не смог найти в документации VRTK примеров, где оба контроллера используются для взаимодействия с одним и тем же объектом. В документации / примерах все основано на событиях, в то время как наш код - нет, и нет примеров действий с обоими контроллерами. Как добиться подобного поведения?

ИЗМЕНИТЬ - VRTK


person stackErr    schedule 07.02.2017    source источник


Ответы (2)


Когда вы взаимодействуете с объектом (с контроллером захвата), вы знаете, какой контроллер выполняет захват, поэтому вы можете узнать другой контроллер, проверив руку существующего контроллера, а затем взяв другую руку, например:

GameObject otherController;
if(VRTK_DeviceFinder.IsControllerLeftHand(grabbingObject)
{
  otherController = VRTK_DeviceFinder.GetControllerRightHand();
}
else
{
  otherController = VRTK_DeviceFinder.GetControllerLeftHand();
}

Что в основном выполняет проверку текущего контроллера захвата, и если это левая рука, вам нужна правая рука (и наоборот).

Примеры сценариев Bow and arrow показывают, что их можно найти в каталоге примеров.

person TheStoneFox    schedule 07.02.2017

Просто сохраните состояние каждого триггера с помощью логического значения:

bool triggerMainPressed;
bool triggerSecondaryPressed;

void Update()
{
    if (controllerMain.GetPressDown(triggerButton))
    {
        triggerMainPressed = true;
    }
    if(controllerSecondary.GetPressDown(triggerButton))
    {
        triggerSecondaryPressed = true;
    }

    if (controllerMain.GetPressUp(triggerButton))
    {
        triggerMainPressed = false;
    }
    if(controllerSecondary.GetPressUp(triggerButton))
    {
        triggerSecondaryPressed = false;
    }


    if(triggerMainPressed && triggerSecondaryPressed)
    {
        scaleSelected(gameObj); //enlarges selected GameObject based on distance between controllers
    }
    else if(triggerMainPressed && controllerSecondary.GetPressDown(gripButton))
    {
        deleteObject(gameObj); //delete selected GameObject
    }   
}
person Ludovic Feltz    schedule 07.02.2017
comment
Да, это сработает (по сути, то, что у нас есть), но я специально ищу решение VRTK. Как мне узнать через VRTK, какой контроллер отправляет мне события? - person stackErr; 07.02.2017
comment
@stackErr Хо извините, я неправильно понял ваш вопрос - person Ludovic Feltz; 07.02.2017