Обнаружение жеста смахивания рукой в ​​Unity с помощью Kinect с OpenNI

У меня есть 3D-модель в моем проекте Unity, и у меня есть JavaScript, который поворачивает камеру на основе клавиш со стрелками на клавиатуре (влево/вправо).

Теперь мне нужен скрипт, который обнаруживает жест руки по горизонтали и возвращает вектор, который я буду использовать для поворота камеры.

Я использую ZigFu SDK с PrimeSense OpenNI/NITE. ZigFu SDK поставляется с примерами сценариев, одним из которых является SwipeDetector. Мне интересно, как он работает?

Моя установка: у меня есть 3 GameObjects: 3D-модель, основная камера и направленный свет.

Итак, как мне использовать скрипт SwipeDetector в моем проекте? Я делаю это прямо сейчас: 1) Создаю пустой игровой объект "SwipeDetection", 2) "перетаскиваю" скрипт SwipeDetector из ZigFu. Я вставил логи в скрипт SwipeDetector, но я их не вижу.


person Sagar Hatekar    schedule 07.02.2012    source источник


Ответы (1)


Привязки Zigfu (я предполагаю, что вы используете версию 1.4?) не имеют образца SwipeDetector, но они включают SwipeDetector MonoBehaviour. SwipeDetector обнаруживает вертикальные и горизонтальные движения, но, к сожалению, не определяет скорость движения.

У вас есть несколько вариантов:

  1. Используйте предоставленный детектор смахивания и поворачивайте камеру на фиксированную величину каждый раз, когда вы обнаруживаете горизонтальное смахивание (события SwipeDetector_Left или SwipeDetector_Right).

  2. Используйте предоставленный детектор размаха, начните вращение при размахе и остановите вращение при событии SwipeDetector_Release. Это было бы похоже на нажатие клавиш со стрелками (при условии, что у вас такое же поведение при событиях keydown/keyup)

  3. Следите за скоростью руки и проверяйте ее значение, когда происходит смахивание. Используйте это значение для поворота камеры. Вы можете отслеживать скорость, создав новый MonoBehaviour и реализовав Hand_Create, Hand_Update и Hand_Destroy (посмотрите любой из сценариев в папке HandpointControls). Держите очередь с точками руки из последних n кадров. Дельта между самой новой и самой старой точками будет вашей скоростью для этих n кадров (я рекомендую вам начать с 15 кадров или примерно полсекунды).

(Это будет включено в будущий выпуск Zigfu :))

Настройка вашего игрового объекта звучит правильно — если вы не видите никаких журналов, возможно, вы неправильно выполняете «жест фокусировки». Попробуйте помахать или коснуться сенсора — это должно вызвать событие Hand_Create. После того, как у вас есть действующая ручная точка, вы должны получить соответствующие события от детектора смахивания.

Также стоит упомянуть, что ваш игровой объект для обнаружения пролистывания должен иметь компонент HandPointControl (добавленный неявно с помощью RequireComponent) и что «ActiveOnStart» должен быть истинным.

person Shlomo Zippel    schedule 08.02.2012
comment
спасибо, что нашли время, чтобы подготовить полезный ответ! Допустим, я использовал 1-й вариант, как бы я обнаружил свайп? Я добавил некоторые подробности в свой вопрос для справки. - person Sagar Hatekar; 08.02.2012
comment
И да, я использую версию 1.4 - person Sagar Hatekar; 08.02.2012
comment
быстрый вопрос: какова подпись метода для SwipeDetector_Left/Right? - person Sagar Hatekar; 08.02.2012
comment
недействительным SwipeDetector_Left(), недействительным SwipeDetector_Right() - person Shlomo Zippel; 09.02.2012
comment
Хорошо, я почти уверен, что правильно делаю жест фокусировки. Я пытался махать/нажимать, но журналы не печатались :( И да, мой игровой объект Swipe имеет SwipeDetector и его неявную ссылку HandPointControl. ActiveOnStart также верен. - person Sagar Hatekar; 09.02.2012
comment
Тем не менее, принятие вашего ответа при условии, что будущий выпуск будет иметь смысл в ваших предложениях. - person Sagar Hatekar; 14.02.2012
comment
Привет, @SagarHatekar, ты когда-нибудь заставлял это работать? Хотелось бы узнать какие-либо дополнительные советы, чтобы заставить жесты зигфу работать. ваше здоровье - person ted.strauss; 25.02.2014
comment
Привет @ted.strauss Я не сдался :( Извините. - person Sagar Hatekar; 25.02.2014
comment
@ShlomoZippel, не могли бы вы опубликовать фрагмент кода, соответствующий тому или иному из описанных вами методов? код для # 2 был бы потрясающим. - person ted.strauss; 26.02.2014