Кажется, что есть некоторые неверные предположения о порядке поворотов, которые применяются при работе с углами Эйлера.Ролл применяется, затем шаг, затем, наконец, рысканиеЭто означает, что поддержание того же рыскания, а затем установка крена и тангажа на ноль (или даже просто смена крена) могут полностью изменить сглаженное направление, с которым вы сталкиваетесь.
Это может помочь вращению на повороте, сгладить впереднаправление (то есть проекция на полностью горизонтальную плоскость). Затем создайте вращение, основанное на том (используя Quaternion.LookRotation
), которое вы затем сможете поворачивать по каждой оси вручную.
if(!controller.isGrounded)
{
//Three degree's
moveDirection = new Vector3(Input.GetAxis("Horizontal"),
Input.GetAxis("Thrust"),
Input.GetAxis("Vertical"));
moveDirection *= speed;
// collect inputs
float yaw = Input.GetAxis("Yaw") * rotationSpeed;
float pitch = Input.GetAxis("Vertical") * tiltAngle;
float roll = -1 * (Input.GetAxis("Horizontal") * tiltAngle);
// Get current forward direction projected to plane normal to up (horizontal plane)
Vector3 forwardCurrent = transform.forward
- Vector3.Dot(transform.forward,Vector3.up) * Vector3.up;
// Debug to view forwardCurrent
Debug.DrawRay(transform.location, forwardCurrent, Color.white, 0f, false);
// create rotation based on forward
Quaternion targetRotation = Quaternion.LookRotation(forwardCurrent);
// rotate based on yaw, then pitch, then roll.
// This order prevents changes to the projected forward direction
targetRotation = targetRotation * Quaternion.AngleAxis(yaw, Vector3.up);
// Debug to see forward after applying yaw
Debug.DrawRay(transform.location, targetRotation * Vector3.forward, Color.red, 0f, false);
targetRotation = targetRotation * Quaternion.AngleAxis(pitch, Vector3.right);
targetRotation = targetRotation * Quaternion.AngleAxis(roll, Vector3.forward);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, smooth);
//debug new forward/up
Debug.DrawRay(transform.location, Transform.forward, Color.blue, 0f, false);
Debug.DrawRay(transform.location, Transform.up, Color.green, 0f, false);
controller.Move(moveDirection * Time.deltaTime);
}
Этоможет считаться частичным ответом, потому что возможность определить «сплющенное вперед» направление и изменить порядок применения ротации компонентов полезна для ответа на ваш вопрос, но может оказаться недостаточной для получения полного эффекта, который вы хотите, в зависимости от деталей.
В качестве идентификатора вы можете рассмотреть возможность использования Quaternion.RotateTowards
вместо Quaternion.Slerp
, если хотите убедиться, что оно действительно достигнет целевого вращения, а не бесконечно приближается к нему.