Завинчивание вращения Unity при умножении угла на десятичную дробь

#c# #unity3d #rotation

#c# #unity3d #вращение

Вопрос:

Я создаю игру FPS и пытаюсь создать вложение, которое уменьшает отдачу на weopons. Шаблон отдачи основан на массиве преобразований, при этом их вращение определяет, насколько изменится вращение игроков. Проблема в том, что когда я умножаю повороты шаблонов отдачи на значение модификатора, вращение игрока будет перемещаться под крайними углами. Это происходит только тогда, когда значение модификатора имеет десятичную дробь, а не когда это целое число.

 void Recoil()
{
    StopCoroutine(SprayPatternTimer(0));
    Quaternion lastRot = Quaternion.Euler(user.playerLook.eyes.localEulerAngles.x, user.playerLook.playerBody.localEulerAngles.y, 0);
    float sprayX = sprayPattern[sprayIndex].localEulerAngles.x * recoilModX; //multiplying the x and y rotation by the rotation modifiers
    float sprayY = sprayPattern[sprayIndex].localEulerAngles.y * recoilModY;

    user.playerLook.eyes.rotation = Quaternion.Euler(
        sprayX   user.playerLook.eyes.rotation.eulerAngles.x, //here I am changing the players x rotation by the modified transforms rotation
        user.playerLook.eyes.localEulerAngles.y,
        user.playerLook.eyes.localEulerAngles.z);

    user.playerLook.playerBody.rotation = Quaternion.Euler(
        user.playerLook.playerBody.rotation.eulerAngles.x,
        sprayY   user.playerLook.playerBody.localEulerAngles.y, //here I am changing the players y rotation by the modified transforms rotation
        user.playerLook.playerBody.localEulerAngles.z);
   
    Quaternion nowRot = Quaternion.Euler(user.playerLook.eyes.localEulerAngles.x, user.playerLook.playerBody.localEulerAngles.y, 0);

    sprayIndex  ;
    StartCoroutine(SprayPatternTimer(0.5f));
    if(sprayIndex >= sprayPattern.Length)
    {
        sprayIndex = 0;
    }
}
 

Проблема в строках 5-16

Комментарии:

1. Преобразование Эйлера в кватернион в Эйлер не гарантирует возврата одинаковых значений. Быстрое решение — просто спрятать ваши эйлеры в локальной переменной. Лучшее решение — использовать исключительно кватернионы.

2. Эта страница документации проливает некоторый свет на общую проблему с преобразованием между quat и euler: docs.unity3d.com/Manual/QuaternionAndEulerRotationsInUnity.html

3. Назначение локальных эйлеров y и z мировым эйлерам y и z кажется, что это может привести к неожиданным результатам.