2015-04-08 3 views
0

Хорошо, я пытаюсь сделать объект под названием «pathblock» вращаться на 90 градусов по часовой стрелке каждый раз, когда игрок нажимает «E». Игрок должен иметь возможность спамить кнопку, при этом блок автоматически поворачивается на 360 градусов.Вращение кватерниона в сопрограмме не работает должным образом?

Я хочу видеть анимацию вращения, поэтому я использую сопрограмму в сочетании с функцией slerp. Вызов coroutine вызывается в обновлении, если E нажат.

//Rotates the selected pathblock by 90 degrees over a specified time. A coroutine is necessary to render each slerp() result per seperate frame 
IEnumerator RotatePathblock() 
{ 
    Debug.Log("Start rotation!"); 
    Quaternion start = Quaternion.Euler(new Vector3(pathblock.transform.rotation.x, pathblock.transform.rotation.y, pathblock.transform.rotation.z)); //Set start variable for Slerp(), the current rotation of the pathblock 
    Quaternion end = Quaternion.Euler(new Vector3(start.x, start.y, start.z-90.0f)); 

    Debug.Log(string.Format("Target Angle: {0}", end.eulerAngles.z)); 


    float normalizationFactor = 1.0f/pathblockRotationTime; //We need to normalize time since slerp() works with values between 0-1; we can convert values by multiplying with this factor 
    float timePassed = 0.0f; //Time passed since the start of the linear interpolation. Starting at 0, it increases until it reaches 1. All values are rendered. 

    while(timePassed < 1.0f) //While the time passes is less than 1 (the maximum of a linear interpolation) 
    { 
     timePassed += Time.deltaTime * normalizationFactor; //Increase the timePassed with the time passed since the last frame; the time is first normalized 
     pathblock.transform.rotation = Quaternion.Slerp(start, end, timePassed); //Set the pathblock rotation to a new value defined by linear interpolation 
     yield return null; //Stop the function, finish Update() and return to this while loop; this will cause all slerp() values to render, resulting in a smooth animation 
    } 
} 

Первая пресса поворачивает пусковой блок на 90 градусов, как и ожидалось. Второе нажатие возвращает путь к исходному вращению и снова поворачивает его на 90 градусов. Это заставляет меня поверить, что переменная «start» никогда не изменяется, хотя при вызове функции она должна перейти в новый pathblock.transform.rotation, получив новое вращение.

Если бы кто-нибудь мог понять, что случилось, я был бы признателен. Любые другие критические замечания о моем коде, комментарии и т. Д. Также будут оценены!

ответ

0
Quaternion start = Quaternion.Euler(new Vector3(pathblock.transform.rotation.x, pathblock.transform.rotation.y, pathblock.transform.rotation.z)); //Set start variable for Slerp(), the current rotation of the pathblock 

Должно быть:

Quaternion start = Quaternion.Euler(new Vector3(pathblock.transform.eulerAngles.x, pathblock.transform.eulerAngles.y, pathblock.transform.eulerAngles.z)); //Set start variable for Slerp(), the current rotation of the pathblock 
Смежные вопросы