2016-12-12 10 views
0

Я столкнулся с проблемой при ослаблении вращения с помощью кватернионов. Легкость, кажется, работает нормально до тех пор, пока один из вращений не решил вращаться на 360 градусов, чтобы добраться от начальной точки до ее конечной точки. Я предполагаю, что это потому, что значение идет от x до -x. Как я могу объяснить или предотвратить эту проблему?Кватернион вращается на 360 градусов при ускорении

Вот мой код

GameObject head; 
float speed; 

void Start() { 
    head = GameObject.Find("Camera (eye)"); 
    speed = 1f; 
} 

void Update() { 
    transform.rotation = new Quaternion(EaseOutBack(transform.rotation.x, head.transform.rotation.x, Time.deltaTime * speed), EaseOutBack(transform.rotation.y, head.transform.rotation.y, Time.deltaTime * speed), EaseOutBack(transform.rotation.z, head.transform.rotation.z, Time.deltaTime * speed), EaseOutBack(transform.rotation.w, head.transform.rotation.w, Time.deltaTime * speed)); 
} 

public static float EaseOutBack(float start, float end, float value) 
{ 
    float s = 1.70158f; 
    end -= start; 
    value = (value) - 1; 
    return end * ((value) * value * ((s + 1) * value + s) + 1) + start; 
} 

ответ

2

Я хотел бы попробовать slerping между двумя кватернионами и применить функцию ослабления для параметра т Quaternion.Slerp.

Что-то вроде:

transform.rotation = Quaternion.Slerp(transform.rotation, head.transform.rotation, EaseOutBack(0, 1, Time.deltaTime * speed)); 
Смежные вопросы