#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 кажется, что это может привести к неожиданным результатам.