@PowerFull

Как задать для объекта новую систему отсчета поворота?

Доброго дня. Игра на unity, имеется куб, который вращается при нажатии стрелок, код нагло скопипастила:
Код

private bool isRotating = false;
	 IEnumerator Rotate( Vector3 axis, float angle, float duration = 0.3f)
   {
     Quaternion from = transform.rotation;
     Quaternion to = transform.rotation;
     to *= Quaternion.Euler( axis * angle );
    
     float elapsed = 0.0f;
     while( elapsed < duration )
     {
       transform.rotation = Quaternion.Slerp(from, to, elapsed / duration );
       elapsed += Time.deltaTime;
       yield return null;
     }
     transform.rotation = Quaternion.Euler(0,0,0);
     isRotating = false;
   }



 void Update()
    {
		
        if(Input.GetKeyDown(KeyCode.UpArrow) && !isRotating)
		{
			isRotating = true;
			StartCoroutine(Rotate(Vector3.right, 90));
			
		}
		
		if(Input.GetKeyDown(KeyCode.DownArrow) && !isRotating)
		{
			isRotating = true;
			StartCoroutine(Rotate(Vector3.right, -90));
			
		}
		
		if(Input.GetKeyDown(KeyCode.LeftArrow) && !isRotating)
		{
			isRotating = true;
			StartCoroutine(Rotate(Vector3.forward, 90));
			
		}
		
		if(Input.GetKeyDown(KeyCode.RightArrow) && !isRotating)
		{
			isRotating = true;
			StartCoroutine(Rotate(Vector3.forward, -90));
			
		}
    }



Проблема была в том, что при одном повороте куба также изменяются и направления векторов, соответственно при многократном нажатии на одну стрелку, куб поворачивался постоянно в разные стороны. Я тогда не думала и просто после поворота обнуляла ротацию(мне нужна была только анимация) строчкой
transform.rotation = Quaternion.Euler(0,0,0);

Сейчас это не подходит и нужно видеть ту сторону, на которую перевернулся куб.

Вопрос: Вот я перевернула куб, к примеру на 90 градусов, как я могу програмно задать, что данное положение теперь (0,0,0)? Или может быть есть какие либо другие пути решения?
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
MrMureno
@MrMureno Куратор тега Unity
VR for all
вам придется разобраться с Quaternion, вместо копипасты((
https://docs.unity3d.com/ScriptReference/Quaternio...

тогда появится понимание как "добавить 90 градусов вокруг оси N к текущему повороту"

дело в этих двух строчках
Quaternion to = transform.rotation;
to *= Quaternion.Euler( axis * angle );

не помню как делал для себя такой же один в один куб)) попробуйте умножение в другом порядке (кватернионам важно, что на что умножать))
to = Quaternion.Euler( axis * angle ) * to;

проверил. вам точно нужен именно глобальный вектор поворота, другой порядок умножения)) в школе врали что не влияет))

плюс в конце цикла анимации сделайте
transform.rotation = to;
чтоб не было углов по 88,9 и так далее, а то лерп не докручивает каждый раз по чуть чуть и накапливается))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы