Жесты в Unity
Существует два ключевых способа принять меры по взгляду в Unity, жесты рук и контроллеры движения в HoloLens и иммерсивном HMD. Доступ к данным для обоих источников пространственных входных данных через одни и те же API в Unity.
Unity предоставляет два основных способа доступа к пространственным входным данным для Windows Смешанная реальность. Общие API Input.GetButton/Input.GetAxis работают в нескольких пакетах SDK для Unity XR, а API InteractionManager/GestureRecognizer, характерный для Windows Смешанная реальность, предоставляет полный набор пространственных входных данных.
Высокоуровневые интерфейсы API составных жестов (ЖестRecognizer)
Пространство имен: UnityEngine.XR.WSA.Input
Типы: GestureRecognizer, GestureSettings, InteractionSourceKind
Приложение также может распознавать составные жесты более высокого уровня для источников пространственных входных данных, касания, удержания, манипуляции и навигации. Эти составные жесты можно распознать как в руках, так и в контроллерах движения с помощью жестаRecognizer.
Каждое событие жеста в жестеRecognizer предоставляет SourceKind для входных данных, а также целевой луч головы во время события. Некоторые события предоставляют дополнительные сведения о контексте.
Для записи жестов с помощью распознавателя жестов требуется всего несколько шагов:
- Создание распознавателя жестов
- Укажите, какие жесты следует отслеживать
- Подписка на события для этих жестов
- Начало записи жестов
Создание распознавателя жестов
Чтобы использовать ЖестRecognizer, необходимо создать ЖестRecognizer:
GestureRecognizer recognizer = new GestureRecognizer();
Укажите, какие жесты следует отслеживать
Укажите, какие жесты вы хотите использовать с помощью SetRecognizableGestures():
recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);
Подписка на события для этих жестов
Подпишитесь на события для интересующих вас жестов.
void Start()
{
recognizer.Tapped += GestureRecognizer_Tapped;
recognizer.HoldStarted += GestureRecognizer_HoldStarted;
recognizer.HoldCompleted += GestureRecognizer_HoldCompleted;
recognizer.HoldCanceled += GestureRecognizer_HoldCanceled;
}
Примечание.
Жесты навигации и манипуляции являются взаимоисключающими для экземпляра жестаRecognizer.
Начало записи жестов
По умолчанию жестRecognizer не отслеживает входные данные до вызова StartCapturingGestures(). Возможно, событие жеста может быть создано после вызова StopCapturingGestures(), если входные данные были выполнены до кадра, в котором была обработана stopCapturingGestures(). ЖестRecognizer будет помнить, был ли он включен или выключен во время предыдущего кадра, в котором на самом деле произошел жест, и поэтому это надежно для запуска и остановки мониторинга жестов на основе взгляда этого кадра нацеливание.
recognizer.StartCapturingGestures();
Остановка захвата жестов
Чтобы остановить распознавание жестов, выполните приведенные действия.
recognizer.StopCapturingGestures();
Удаление распознавателя жестов
Не забудьте отменить подписку из подписанных событий, прежде чем уничтожить объект GestureRecognizer .
void OnDestroy()
{
recognizer.Tapped -= GestureRecognizer_Tapped;
recognizer.HoldStarted -= GestureRecognizer_HoldStarted;
recognizer.HoldCompleted -= GestureRecognizer_HoldCompleted;
recognizer.HoldCanceled -= GestureRecognizer_HoldCanceled;
}
Отрисовка модели контроллера движения в Unity
Модель контроллера движения и телепортация
Чтобы отобразить контроллеры движения в приложении, которые соответствуют физическим контроллерам, которые пользователи держат и сформулируют, как нажаты различные кнопки, можно использовать префаб MotionController в наборе средств Смешанная реальность. Этот префаб динамически загружает правильную модель glTF во время выполнения из установленного драйвера контроллера движения системы. Важно динамически загружать эти модели, а не импортировать их вручную в редакторе, чтобы приложение отображало физически точные трехмерные модели для любых текущих и будущих контроллеров, которые могут иметь пользователи.
- Следуйте инструкциям по началу работы, чтобы скачать набор средств Смешанная реальность и добавить его в проект Unity.
- Если вы заменили камеру предварительной подготовкой MixedRealityCameraParent в рамках шагов "Начало работы", вы можете пойти! Этот префаб включает отрисовку контроллера движения. В противном случае добавьте Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab в сцену из области проекта. Вы хотите добавить этот префаб в качестве дочернего родительского объекта, который вы используете для перемещения камеры вокруг, когда пользователь телепортирует в сцене, чтобы контроллеры пришли вместе с пользователем. Если приложение не включает телепортирование, просто добавьте префаб в корень сцены.
Создание объектов
Создание объектов в виртуальной реальности является сложной проблемой, чем вначале может показаться. Как и в большинстве физически основанных взаимодействий, при броске в игру действует неожиданно, это сразу очевидно и прерывает погружение. Мы провели некоторое время, думая о том, как представлять физическое правильное поведение, и придумали несколько рекомендаций, включенных через обновления нашей платформы, что мы хотели бы поделиться с вами.
Вы можете найти пример того, как мы рекомендуем реализовать бросы здесь. В этом примере приведены четыре рекомендации.
Используйте скорость контроллера вместо позиции. В ноябрьском обновлении до Windows мы ввели изменения в поведении, когда в состоянии отслеживания позиционного отслеживания "Приблизительно". В этом состоянии сведения о скорости контроллера продолжают сообщаться до тех пор, пока мы считаем, что его высокая точность, которая часто превышает позицию, остается высокой точностью.
Включите угловую скорость контроллера. Эта логика содержится в
throwing.cs
файле статического метода в связанномGetThrownObjectVelAngVel
выше пакете:При сохранении угловой скорости объект должен поддерживать ту же угловую скорость, что и в момент броска:
objectAngularVelocity = throwingControllerAngularVelocity;
Поскольку центр массы брошенного объекта, скорее всего, не находится в источнике поз захвата, скорее всего, имеет другую скорость, чем контроллер в рамке ссылки пользователя. Часть скорости объекта способствовала таким образом мгновенной тангенциальной скорости центра массы брошенного объекта вокруг источника контроллера. Эта тангенциальная скорость является кросс-продуктом угловой скорости контроллера с вектором, представляющим расстояние между источником контроллера и центром массы вызываемого объекта.
Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos; Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
Общая скорость вызываемого объекта — это сумма скорости контроллера и эта тангенциальная скорость:
objectVelocity = throwingControllerVelocity + tangentialVelocity;
Обратите пристальное внимание на время , когда мы применяем скорость. При нажатии кнопки это событие может занять до 20 мс, чтобы это событие переплылось через Bluetooth в операционную систему. Это означает, что если вы опрашивать состояние контроллера с нажатия, чтобы не нажимать или наоборот, контроллер представляет информацию, которую вы получаете с ним, на самом деле будет впереди этого изменения в состоянии. Кроме того, контроллер, представленный нашим API опроса, пересылается для отражения вероятной позы в то время, когда кадр будет отображаться, что может быть более 20 мс в будущем. Это хорошо для отрисовки удерживаемых объектов, но усугубляет нашу проблему времени для целевого объекта, так как мы вычисляем траекторию на момент, когда пользователь выпустил бросок. К счастью, при обновлении ноября при отправке события Unity, например InteractionSourcePressed или InteractionSourceReleased, состояние включает исторические данные о позе обратно при нажатии или освобождении кнопки. Чтобы получить самую точную отрисовку контроллера и целевого контроллера во время бросков, необходимо правильно использовать опросы и события, как это необходимо:
- Для отрисовки каждого кадра контроллера приложение должно разместить gameObject контроллера в предпрогнозируемом контроллере для времени фотона текущего кадра. Эти данные получаются из API опроса Unity, таких как XR. InputTracking.GetLocalPosition или XR. WSA. Input.InteractionManager.GetCurrentReading.
- Для контроллера, предназначенного для нажатия или выпуска, приложение должно выполнять передачу и вычислять траектории на основе исторического контроллера для этого события прессы или выпуска. Эти данные можно получить из API-интерфейсов событий Unity, таких как InteractionManager.InteractionSourcePressed.
Используйте позу захвата. Угловая скорость и скорость передаются относительно положения захвата, а не указателя.
Создание будет продолжать улучшаться с помощью будущих обновлений Windows, и вы можете ожидать, чтобы найти дополнительные сведения об этом здесь.
Контроллеры жестов и движения в MRTK
Вы можете получить доступ к жесту и контроллеру движения из диспетчера входных данных.
Обучение по руководствам
Пошаговые руководства с более подробными примерами настройки доступны в академии Смешанная реальность:
MR Input 213 — контроллер движения
Следующий этап разработки
Если вы следите за процессом разработки Unity, который мы изложили, вы находитесь в разгар изучения основных стандартных блоков MRTK. Отсюда вы можете перейти к следующему стандартному блоку:
Или перейдите к возможностям и API платформы смешанной реальности:
Вы можете в любой момент вернуться к этапам разработки для Unity.