несколько поворотов одного и того же персонажа - PullRequest
0 голосов
/ 20 июня 2020

У меня есть персонаж, который вращается в направлении движения

var rot = (x, y, z); //motion vector
 rot.y = 0f;
 var movementRot = Quaternion.LookRotation(rot);
 transform.rotation = Quaternion.Lerp(transform.rotation, movementRot, Time.deltaTime * speedRot);}

Я хотел бы повернуть его ось вращения Y, даже с осью X мыши

 loat r = Input.GetAxisRaw("Mouse X");
    float Xrot = Input.GetAxisRaw("Mouse X") * speedRotation;
    transform.Rotate(0, Xrot, 0);

методы работают по отдельности, но вместе - нет. Я уже пробовал преобразовать transform.Rotate в кватернион для умножения:

var Xrotation = Quaternion.Euler(0f, Xrot, 0f);
transform.rotation = Xrotation * movementRot;

В результате получается символ, который не вращается сам по себе (он удерживается при попытке). Я попробовал обратное и преобразовал кватернион в градусы, чтобы добавить для преобразования. Повернуть. Но не помогло:

float angle = Quaternion.Angle(transform.rotation, movementRot)//The result is perfect is on its own on transform.Rotate it works

transform.Rotate(0,f angle + Xrot, 0f); //Together, however, the character rotates at times and turns, on itself only to one side

Кто нибудь умеет делать ..? (или если есть возможность сделать хд)

1 Ответ

0 голосов
/ 21 июня 2020

Как я понял, вы хотите иметь два слоя вращения - во-первых, ваш персонаж смотрит в направлении движения. Затем вы можете добавить вращение с помощью мыши. Это правильно?

Если да, то первое, что я могу порекомендовать, - это разделить вашего персонажа на два объекта. Родительское преобразование будет следовать за вашим движением. Затем его дочерний элемент изменит свое локальное вращение в соответствии с вводом мыши.

Для вращения по курсу, IMHO, лучший способ - работать с векторами, а не с кватернионами:

transform.forward = movementVector;

Если вам нужно более плавное следование, вы можете сделать следующее:

float rotationSpeed = 0.5f;
        transform.forward = Vector3.RotateTowards(transform.forward, movementVector, rotationSpeed * Time.deltaTime, 0);

или

float rotationSpeed = 1f;
transform.forward = Vector3.Lerp(transform.forward, movementVector, rotationSpeed * Time.deltaTime);

Затем вы можете применить вращение к дочернему объекту, как и вы (только изменение - применить как местное вращение).

Если этот тип оснастки вам не подходит, вам нужно объединить два вращения. Для этого опять же разберемся с вектором. После применения вращения следования за движением, как описано выше, добавьте что-то вроде этого:

float Xrot = Input.GetAxisRaw("Mouse X") * speedRotation;
transform.forward += transform.right * Xrot * Time.deltaTime;

Обратите внимание на две вещи:

  • В этом случае speedRotation, вероятно, должен быть намного меньше. Вы даже можете умножить его на 0,1f.
  • transform.right и transform.forward могут быть разными для вашего персонажа, возможно, вам нужно использовать transform.up или -transform.forward. Смотрите на ваших локальных осях преобразования.
...