Почему не срабатывает условие Quaternion.Slerp?

Доброго времени суток друзья.
Есть код:
public class Man : MonoBehaviour 
{       
public float Speed, RotateSpeed, RotateGradus;
	void Update () {		
			if (RotateGradus == 90)
            {
                if (transform.eulerAngles.z < RotateGradus)
                {
                    transform.rotation = Quaternion.Slerp(transform.rotation, new Quaternion(transform.rotation.x, transform.rotation.y, RotateGradus, 2), RotateSpeed * Time.deltaTime);
                }                
            }
        
            if (RotateGradus == 270)
            {		
                if (transform.eulerAngles.z < RotateGradus)
                {                    
                    transform.rotation = Quaternion.Slerp(transform.rotation, new Quaternion(transform.rotation.x, transform.rotation.y, RotateGradus, 2), RotateSpeed * Time.deltaTime);
                    Debug.Log("сработало");
                }
            }
   }
}

В итоге когда RotateGradus равен 90, transform.rotation.z объекта равен 0, тогда всё отрабатывает нормально, а во второй части кода, когда RotateGradus равен 270, а transform.rotation.z объекта равен 180 - Quaternion.Slerp никак не отрабатывает, хотя сообщение из дебага "сработало" видно в консоли. В рантайме когда смотрю, угол объекта по Z двигается на 179.151 и замирает. Начинаю менять в ручную (двигать ползунок), возвращается обратно на 179.151. Хотя по итогу, должен превратиться в 270, если бы код отработал.

Объясните пожалуйста, почему так происходит, всё уже пересмотрел. Спасибо заранее.
  • Вопрос задан
  • 306 просмотров
Решения вопроса 1
MrMureno
@MrMureno Куратор тега Unity
VR for all
думал вынести в ответ или нет.
но кватернионы никто так не задает))
в этом и ошибка.
transform.rotation = кватернион тут все хорошо.
а вот требуемый поворот лучше все же задать иначе.
к примеру - добавить к текущему повороту 90 градусов. (надеюсь очевидно что задавать цель поворота надо единожды, а не каждый апдеит)
Quaternion targetRotation = transform.rotation * Quaternion.Euler(0, 90, 0);

или в вашем случае просто через Quaternion.Euler задать требуемый поворот. но учесть что это будет локальный поворот.
вообще про кватернионы бы вам почитать. что там и порядок умножения важен.
и что они умножаются, а не суммируются.
почитайте про них статьи на том же хабре. там была парочка поясняющих про тангаж, рысканье и тп. и аналогии с кватернионами чтоб хоть как то их понять))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы