Ограничение угла поворота через 0.

Общие вопросы о Unity3D

Ограничение угла поворота через 0.

Сообщение Ksaan 16 янв 2018, 21:40

Рою форум со справкой, но ничего толкового не нашёл. Нужно как-бы инвертировать Mathf.Clamp, чтоб он показывал цифры в диапазоне от например 320 до 14. То есть 320..321....0....1..2.. и так до 14? Диапазон чисел в 360°.
Сейчас ограничиваю условием, но все равно иногда, да бывает проскакивает.
Отловить такое довольно сложно, но все равно грешу на условие.
Аватара пользователя
Ksaan
UNец
 
Сообщения: 34
Зарегистрирован: 13 мар 2017, 15:25

Re: Ограничение угла поворота через 0.

Сообщение Paul Siberdt 16 янв 2018, 21:44

Лучше задачу опишите, а не ваш личный способ ее решения.
Мэппинг значений можно сделать, например, так:

Синтаксис:
Используется csharp
        #region REMAP /////////////////////////////////////////////////////////////////////////////////////////////

        public float RemapFrom01(float value, float toMin, float toMax)
        {
            return Remap(Mathf.Clamp01(value), 0f, 1f, toMin, toMax);
        }

        public float RemapTo01(float value, float fromMin, float fromMax)
        {
            return Mathf.Clamp01((value - fromMin) / (fromMax - fromMin));
        }

        public static float Remap(float value, float fromMin, float fromMax, float toMin, float toMax)
        {
            return toMin + (value - fromMin) * (toMax - toMin) / (fromMax - fromMin);
        }

        #endregion


Если же ваша задача - избавиться от артефакта поворота при переходе через зенит, приводите вращение ко кватерниону, считайте дельту поворота, а не "новый градус".
То бишь, зведите кватернион дельты, например Quaternion.Euler(0, delta * direction * Time.deltaTime, 0), и множьте на него тукущую ротацию. Это вылечит перескок или смену направления при повороте.
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Ограничение угла поворота через 0.

Сообщение Ksaan 16 янв 2018, 22:07

Описываю задачу.
Нужно плавно повернуть объект по какой то оси (пример Х) к другому объекту. Для поворота используем EulerAngles, для того чтобы он повернул плавно используем Mathf.MoveTowardsAngle,
он выдает значения от 0 да 359. И вот тут надо ограничить этот поворот. Для наглядности представим что 0 это Forward, так вот если поворачивать на право, то число будет идти от 359 до 0 (уменьшатся) а если на лево то, от 0 до 359 (увеличиваться). думаю так будет яснее. А вот этот баг происходит когда число приближается к ограничителю.
Аватара пользователя
Ksaan
UNец
 
Сообщения: 34
Зарегистрирован: 13 мар 2017, 15:25

Re: Ограничение угла поворота через 0.

Сообщение Paul Siberdt 16 янв 2018, 22:18

Ниже кода мэппинга я вам все ответил.

Определяете направление вращения (например, через простое преобразование координаты "цели" в систему "турели"... соответственно, берете знак от "икса"... далее создаете кватернион вращения, например, кодом, что я нарисовал выше голубым цветом и вращаете в апдейте "турель", множа её поворот на этот кватернион... периодически сравниваете точность прицеливания (дот-продуктом, например). Вроде все.

Работа с эвлеровыми углами тем и неприятна, что она артефачит в зенитах.
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Ограничение угла поворота через 0.

Сообщение Ksaan 16 янв 2018, 22:32

Paul Siberdt писал(а):Работа с эвлеровыми углами тем и неприятна, что она артефачит в зенитах.

Так вот там нет артефактов если я не пытаюсь их ограничить через условие :-?
Аватара пользователя
Ksaan
UNец
 
Сообщения: 34
Зарегистрирован: 13 мар 2017, 15:25

Re: Ограничение угла поворота через 0.

Сообщение Paul Siberdt 16 янв 2018, 22:43

Создания ограничений через условия, чтобы избежать артефактов, называется "костыль".

То, что я предложил, вам не подходит? :)
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 22