Я купил Leap Motion несколько месяцев назад, и в спешке и азарте заказа, я купил версию без крепления разработчика VR. На прошлой неделе, однако, у меня наконец-то появилась возможность сесть и поиграть с ним, и я создал базовое приложение Sticker Shooter, которое использует управление жестами Leap Motion для съемки объектов с камеры VR, которые прилипают, когда сталкиваются с вещами в окружающей среде.

[идентификатор подписи = "" align = "alignnone" ширина = "864]

Компоненты датчика Leap Motion, © Leap Motion, 2015[/caption]

Так что же такое контроллер Leap Motion? Проще говоря, это устройство, которое позволяет вам взаимодействовать с экраном (или средой виртуальной реальности, в нашем случае) с помощью рук и пальцев, которые отслеживаются с помощью комбинации камеры и инфракрасных датчиков и передаются в данное приложение в качестве входных данных. . Одной из моих любимых демонстраций, использующих Leap Motion, является ElementL, игра, в которой вы можете бросать огненные шары и водяные пузыри, чтобы отогнать демонов-скелетов.

[идентификатор подписи = "" align = "alignnone" ширина = "600]

Игровой процесс ElementL: Ghost Story с использованием контроллера Leap Motion для ручного ввода, LeapMotion.com[/caption]

В этом посте я поделюсь процессом и кодом, который я написал, чтобы начать интегрировать Leap Motion в мой собственный проект с использованием Unity.

Начало работы с интеграцией контроллера Leap Motion в приложение Unity оказалось довольно простым. Общая архитектура управления обновлением и вводом выглядит примерно так:

  1. Приложение инициализируется во время установки, и создается объект контроллера.
  2. Контроллер формирует список обнаруженных устройств Leap Motion.
  3. Слушатель подключен к контроллеру для отслеживания событий
  4. Контроллер настроен на прием определенных жестов из списка жестов (если вы используете предопределенные жесты из программного обеспечения Leap).
  5. В цикле обновления игры контроллер запрашивает кадры и проверяет, были ли обнаружены определенные жесты в данном кадре.
  6. Если определенный жест найден, установите для выполнения действия, учитывая, какой жест был записан

В своем приложении я создал общий сценарий игры и начал добавлять две глобальные переменные для сценария:

Controller leapController;
 Listener leapListener;

В основной функции запуска приложения я инициализировал контроллер и добавил прослушиватель для устройства (включая дополнительные проверки отладки!). Затем я настроил обнаружение жестов, включив два отдельных типа жестов: круговой жест и касание. Эти жесты обозначаются Gesture.GestureType.‹TYPE›:

void Start () {
 leapController = new Controller();
 leapListener = new Listener();
// Log that the Leap Motion device is attached and recognized
 foreach(Device item in leapController.Devices)
 {
 Debug.Log("Leap Motion Device ID:" + item.ToString());
 }
 // Add a listener so that the controller is waiting for inputs
 leapController.AddListener(leapListener);
 // Check that the leap is fully connected and ready for input
 Debug.Log("Leap Motion connected: " + leapController.IsConnected);
// Set up the gesture detection
 leapController.EnableGesture(Gesture.GestureType.TYPE_CIRCLE);
 leapController.EnableGesture(Gesture.GestureType.TYPESCREENTAP);
 Debug.Log("Circle Gesture Enabled: " + leapController.IsGestureEnabled(Gesture.GestureType.TYPE_CIRCLE));
 Debug.Log("Screen Tap Gesture Enabled: " + leapController.IsGestureEnabled(Gesture.GestureType.TYPESCREENTAP));
 
 }
Within the Update() loop for my application, I created a "Check for Gestures" function that was called on each frame firing. Since Unity calls Update() once per frame, and the Leap Motion controller also grabs gestures on a frame-by-frame basis, I call CheckForGestures() in Update() so that that gestures aren't lost.
Within my CheckForGestures() function, I grab two frames from the controller object: the current one, and the previous one. Some of the Leap Motion gestures are tracked over multiple frames, so this would be used in checking for those. That said, the ones that I was tracking are detected in a single frame, so I didn't end up using the previous frame yet. For each frame object, a list of detected gestures is provided, so I went ahead and grabbed the list and iterated through them to see if my desired gestures were detected. If they were, I fired a sticker:
void CheckForGestures()
 {
 if(leapController.IsConnected)
 {
 // Check the list of gestures for a circle
 Frame current = leapController.Frame();
 Frame previous = leapController.Frame();
GestureList gesturesInFrame = current.Gestures();
 foreach(Gesture gesture in gesturesInFrame )
 {
 Debug.Log("Captured a gesture: " + gesture.Type.ToString());
 if (gesture.Type == Gesture.GestureType.TYPESCREENTAP || gesture.Type == Gesture.GestureType.TYPECIRCLE) ;
 {
 FireSticker();
   }
  }
 }
}
And that was it! With just a few lines of code, capturing and using gestures with Leap Motion adds a new level of interactivity into a basic point & click app!