Управление гироскопом в 2D пространстве
| |
romeo98 | Дата: Воскресенье, 21 Сентября 2014, 13:54 | Сообщение # 1 |
участник
Сейчас нет на сайте
| Здравствуйте! Работаю над 2D проектом для android. Игра для управления использует гироскоп. Я написал скрипт, который поворачивает игрока взависимости от состояния гироскопа. Он работает, но работает резко и глючно. Сейчас он вот в таком состоянии: Код public Transform player;
//PlayerWorldToScreen.y + Acc.y private float accX = 0.1f; private float accY = 0.1f;
void Update() { if(Mathf.Abs(Input.acceleration.x) > 0.1f ){ accX = Input.acceleration.x * 2; } if (Mathf.Abs(Input.acceleration.y) > 0.1f ) { accY = Input.acceleration.y * 2; }
Vector3 screenPlayer = Camera.main.WorldToScreenPoint(player.position); Vector3 accScreen = new Vector3(screenPlayer.x + accX, screenPlayer.y + accY, 0); transform.position = Camera.main.ScreenToWorldPoint(accScreen); Vector3 diff = transform.position - player.position; diff.Normalize(); float rot_z = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg; player.rotation = Quaternion.Euler(0f, 0f, rot_z - 90); }
Как бы сделать все плавнее и точнее? Скажем так... сейчас вокруг игрока воображаемый квадрат, на котором есть точка. Точка изменяет положение взависимости от состояния гироскопа (см. код выше). Игрок все время смотрит на эту точку. Я думаю, чтобы было плавнее и точнее нужно сделать "круг", вместо "квадрата". Не могу придумать формулу, по которой буду вычислять координаты этой точки на окружности. Известные параметры для вычисления тогда будут радиус, сила гироскопа по Y и X. В итоге я должен получить точку на этой окружности, чтобы повернуть туда игрока.
Если есть другие варианты- пишите. Может я херней страдаю, а это можно сделать за 2 строчки...
Flist - social platform PuzzleSystem - Open-source Unity Asset [2D] Mission: Defender
Сообщение отредактировал romeo98 - Воскресенье, 21 Сентября 2014, 17:48 |
|
| |
MANMANA | Дата: Воскресенье, 21 Сентября 2014, 15:10 | Сообщение # 2 |
почти ветеран
Сейчас нет на сайте
| А вот на этом же самом сайте в статьях есть статья про плаааавный такой гироскоп :), может, поможет? А так... Lerp?
http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг VKонтакте 3Dbuffer
Последнее:
Новый раздел "Текстуры"
Как запатентовать, защитить техническое решение, игру, идею
|
|
| |
romeo98 | Дата: Понедельник, 22 Сентября 2014, 13:30 | Сообщение # 3 |
участник
Сейчас нет на сайте
| Цитата MANMANA ( ) А вот на этом же самом сайте в статьях есть статья про плаааавный такой гироскоп :), может, поможет? Тут такое дело... У меня в нулевой точке стоит объект, а игрок сам вращается вокруг этого объекта. Он вращается так, что этот объект все время находится в верхней части экрана. Если использовать Input.gyro.attitude, как в том туторе, который ты мне дал, то по началу все работает правильно, а потом, в один момент, игрок оказывается вверх ногами в Editore. происходит конфликт. Я поворачиваю налево, а игрок поворачивает направо. В моем рабочем, но лагучем коде я решил проблему так: Код Vector3 screenPlayer = Camera.main.WorldToScreenPoint(player.position); Vector3 accScreen = new Vector3(screenPlayer.x + accX, screenPlayer.y + accY, 0); transform.position = Camera.main.ScreenToWorldPoint(accScreen); Тоесть, все координаты делал относительно изображения на камере, а не координат в Editor. Этот скрипт, кстати, который я дал, вешается на пустышку, если кто не понял (не на игрока).
Добавлено (21.09.2014, 18:13) --------------------------------------------- Есть другой вариант, но мне придется переделать всю систему управления. Не вращать камеру с игроком вокруг объекта, в вращать сам объект со всеми дочерними объектами.
Сцена игры:
Добавлено (21.09.2014, 19:07) --------------------------------------------- Тогда появился другой вопрос. Вроде переделывать не много, но, если я буду использовать Код transform.rotation = ConvertRotation(Input.gyro.attitude); , то как из attitude.x и attitude.z получить угол поворота по оси z для объекта? Нужно учитывать оба параметра.Добавлено (22.09.2014, 13:30) --------------------------------------------- Up
Flist - social platform PuzzleSystem - Open-source Unity Asset [2D] Mission: Defender
Сообщение отредактировал romeo98 - Воскресенье, 21 Сентября 2014, 19:10 |
|
| |
falcoware | Дата: Понедельник, 22 Сентября 2014, 14:11 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| romeo98, если есть две оси х и у, то z можно получить как cross_product(x, y) А угол между осями как аркосинус дот_продакт.
Сообщение отредактировал falcoware - Среда, 01 Октября 2014, 09:48 |
|
| |
Малышев-Никифоров | Дата: Вторник, 30 Сентября 2014, 06:27 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| .
Сообщение отредактировал Малышев-Никифоров - Среда, 01 Октября 2014, 10:22 |
|
| |
Ranger | Дата: Вторник, 30 Сентября 2014, 06:43 | Сообщение # 6 |
почти ветеран
Сейчас нет на сайте
| Малышев-Никифоров, Плюсую. Мало того, что без разрешения, так еще на С, и совершенно ненужный. все перечисленные методы есть в классе вектор
|
|
| |
falcoware | Дата: Среда, 01 Октября 2014, 09:46 | Сообщение # 7 |
старожил
Сейчас нет на сайте
| Малышев-Никифоров, этому коду уже 20 лет как. Вы тогда пошли в первый класс.
|
|
| |
|