Наклоните ось Z камеры первого лица при повороте - PullRequest
0 голосов
/ 28 января 2020

Я работаю над элементами управления для двуногого танка, который имеет функцию повышения / da sh. Когда режим boost / da sh активируется нажатием кнопки, танк переходит от традиционного обстрела WASD к чему-то вроде реактивного истребителя, но на земле. Теперь, когда проигрыватель пытается повернуться во время усиления, камера должна наклониться в направлении поворота, чтобы сделать его более плавным.

Вот видео, показывающее мою проблему

Это сценарий, добавленный к основной камере

public class PlayerCameraTilt : MonoBehaviour
{
    private Camera viewCam;
    private CharacterController characterController;

    public float tiltAmount = 10f;

    private void Start()
    {
        viewCam = GetComponent<Camera>();
        characterController = GetComponentInParent<CharacterController>();
    }

    private void Update()
    {
        if (characterController.GetComponent<PlayerController>().movementState == MovementModes.boost)
        {
            float inputValue = Input.GetAxis("MoveHorizontal") * tiltAmount;
            Vector3 euler = transform.localEulerAngles;
            euler.z = Mathf.Lerp(euler.z, -inputValue, 5f * Time.deltaTime);
            transform.localEulerAngles = euler;

        }
        else
        {
            Vector3 euler = transform.localEulerAngles;
            euler.z = Mathf.Lerp(euler.z, 0f, 5f * Time.deltaTime);
            transform.localEulerAngles = euler;
        }

    }
}

Он вроде работает, НО только в одном направлении вращения, а именно в положительном направлении. Если я поверну в другую сторону, угол станет отрицательным и будет вращаться на 360 градусов, пока не достигнет 0 градусов.

Я пробовал использовать встроенные методы Quaternion, такие как Quaternion.Rotate () или Quaternion.AngleAxis. (), но они не сработали, потому что Quaternion.Rotate () не наклоняет камеру, а полностью вращает ее. Quaternion.AngleAxis () работает со всем пределом угла наклона, но также делает что-то с другой осью, которую я не хочу изменять.

Есть ли способ предотвратить полный поворот камеры на 360 ° когда вход оси становится отрицательным и просто наклоняется под небольшим углом?

1 Ответ

0 голосов
/ 28 января 2020

Проблемы с переносом в сторону, компонент z «применяется» первым среди компонентов euler, поэтому я бы не стал изменять его напрямую в этом приложении.

Вместо этого я бы преобразовал входные данные в угол чтобы наклониться, поверните местное направление вверх до того, как localRotation будет применен (Quaternion.Inverse(transform.localRotation) * transform.up) на этот угол, затем используйте Quaternion.LookRotation, чтобы найти вращение с током вперед и вверх, затем используйте Quaternion.Slerp, чтобы пройти к этому вращению :

private void Update()
{
    if (characterController.GetComponent<PlayerController>().movementState == MovementModes.boost)
    {
        float inputValue = Input.GetAxis("MoveHorizontal") * tiltAmount;

        Vector3 upOfParent = Quaternion.Inverse(transform.localRotation) * transform.up;

        Vector3 upDir = Quaternion.AngleAxis(-inputValue, transform.forward) * upOfParent;

        Quaternion goalRot = Quaternion.LookRotation(transform.forward, upDir);

        transform.rotation = Quaternion.Slerp(transform.rotation, goalRot, 5f * Time.deltaTime);
    }
    else
    {
        float inputValue = Input.GetAxis("MoveHorizontal") * tiltAmount;

        Vector3 upOfParent = Quaternion.Inverse(transform.localRotation) * transform.up;

        Quaternion goalRot = Quaternion.LookRotation(transform.forward, upOfParent);

        transform.rotation = Quaternion.Slerp(transform.rotation, goalRot, 5f * Time.deltaTime);
    }

}

Просто имейте в виду, что использование t = 5f * Time.deltaTime для операций lerp / slerp не всегда гарантирует, что результат будет когда-либо равен параметру to.

...