#c_sharp #android #алгоритм #unity3d #unity3d_faq
Задача состоит в отслеживании движения телефона в пространстве, а именно в отслеживании определенных "жестов": вертикальные рывки вверх или вниз горизонтальные рывки вправо-влево повороты вокруг вертикальной оси на N градусов Общая проблема состоит в том, что нужен именно рывок - т.е. движение на относительно большое расстояние (или угол) за малое время. И поэтому нужно как-то отфильтровывать плавное перемещение, трясущиеся руки и т.п. В качестве исходных данных я обладаю показаниями акселерометра. Какие существуют алгоритмы для решения подобной задачи? Возможно уже где-то есть готовые примеры. Желательно все это на C# под Unity, но сойдет и любой другой язык или просто алгоритм.
Ответы
Ответ 1
Я сам таким не занимался, но то как я вижу решение опишу: Нужно написать самому скрипт. В принципе, ничего критически сложного. Для начала узнай что такое Fifo Внутри FixedUpate Считываешь последние показания в Input.Acceleration во всех областях на некоем промежутке времени и записываешь в Fifo. Пусть для начала Fifo будет размеров гдето в 30 ячеек. Потом опытным путем подберешь оптимальный размер Fifo в Upate сравниваешь среднее значение по всему Fifo. Если оно не больше чем некий макс уровень(подбирается опытным путем) - то это просто тряска рук. Иначе... Выясняешь какой из жестов был сделан. Соответственно проходишь по самой большой разнице по соответствующей оси(а в Fifo записываются все 3 оси) с помощью LINQ запроса и генерируешь некий ивент на который подписываешь нужные методы.... ну или же напряму делаешь вызов метода :) PS: повторюсь, я сам такого не делал. Но если бы делал, то в первую очередь действовал по даному описанию. А потом уже если бы не вышло искал бы другие варианты. Вряд ли готовые решения найдешь. А если и найдешь - то вряд ли толковые. Я даже свайпы сам писал когда-то, потому что свайпы что нашел в инете были не фонтан... А это,ведь, достаточно тривиальная задача... Апдейт: У него оказалась проблема, что после рывка, к примеру по направлению оси Х, "отлавливается" сперва событие движения вдоль этой оси, а потом против. Введи еще одну булевую переменную-флаг ReadyForNextAction. При вызове метода ставь ReadyForNextAction = false; И, собственно, просто делай игнорирование всех движений через этот флаг пока снова не устаканится акселерометр до "спокойного уровня" по всему фифо. Снова же, возможно прийдется немного править количество ячеек фифо в большую сторону, скорей всего...Но должно пофиксится. Если получишь хороший результат - кидай код сюда, для следующих поколений, так сказать)
Комментариев нет:
Отправить комментарий