Понедельник, 11 Ноября 2024, 03:31

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Управление гироскопом в 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 лет как. Вы тогда пошли в первый класс. biggrin
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг