Объект перестает вращаться спустя определенное количество градусов (Quaternion.Lerp Unity)

Вращаю объект с помощью лерп. Горизонтально вращается без проблем. Вертикально вращается c останавками(после поворота на определенный градус перестает вращаться, на видео это видно). Функция отвечающая за вращение горизонтально и вертикально - одинаковая.В чем может быть проблема?

Класс Item(функции отвечающие за инициализацию targetRotation и вывожу targetRotation в консоль):

    public void RotateVertical(float delta)
    {
        targetRotation = Quaternion.Euler(transform.localEulerAngles.x - delta * m_rotateVerticalSpeed, 0, 0);
        print(targetRotation.eulerAngles);
    }
    public void RotateHorizontal(float delta)
    {
        targetRotation = Quaternion.Euler(0, transform.localEulerAngles.y + delta * m_rotateHorizontalSpeed, 0);
    }

Класс Item(в FixedUpdate применяю Lerp):

    private void FixedUpdate()
    {
        if (m_picked)
        {
            FollowTarget();
        }
        if (targetRotation.x != 0 || targetRotation.y != 0)
        {
            m_rigidbody.rotation = Quaternion.Lerp(m_rigidbody.rotation, targetRotation, Time.deltaTime * m_rotateHorizontalLerpRate);
        }
    }

Управляющий класс ItemPicker(в FixedUpdate поворачиваю объект горизонтально, если нажата кнопка):

    private void FixedUpdate()
    {
        if (m_currentItem == null)
        {
            return;
        }
        if (m_EPressed)
        {
            m_currentItem.RotateHorizontal(-1);
        }
        if (m_QPressed)
        {
            m_currentItem.RotateHorizontal(1);
        }
    }

Управляющий класс ItemPicker(поворачиваю объект вертикально по событию, если зарегестрирован инпут с колеса мыши):

    private void HandlePerformedScroll(InputAction.CallbackContext ctx)
    {
        if (m_currentItem != null)
        {
            if (m_currentItem.RotatingToCamera)
            {
                print("already rotating");
                return;
            }
            Vector2 delta = ctx.ReadValue<Vector2>();
            delta.Normalize();
            m_currentItem.RotateVertical(delta.y);
        }
    }

На следующем фото видно, что в определенный момент targetRotation будто замирает и delta перестает добавляться:

введите сюда описание изображения

Видеодемонстрация: введите сюда описание изображения


Ответы (1 шт):

Автор решения: gord1402

Если вы хотите манипулировать вращением объекта одновременно с использованием физики, то рекомендую использовать физический подход (Прикладывать силу вращения) вместо простого вращения:

using UnityEngine;

public class CubeRotator : MonoBehaviour
{
    public float rotationSpeed = 10f;
    public float drag = 0.05f;

    public float stabilizationStrength = 5f;

    private Rigidbody rb;
    private float wheel_force;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update(){
        wheel_force += Input.GetAxis("Mouse ScrollWheel");
    }

    void FixedUpdate()
    {
        rb.AddTorque(transform.right * wheel_force * rotationSpeed, ForceMode.VelocityChange);

        Vector3 euler = transform.rotation.eulerAngles;

        Quaternion target = Quaternion.Euler(euler.x, 0f, 0f);

        Quaternion error = target * Quaternion.Inverse(transform.rotation);

        error.ToAngleAxis(out float angle, out Vector3 axis);
        axis.x = 0;

        if (angle > 180f) angle -= 360f;
        Vector3 torque = axis * (angle * Mathf.Deg2Rad) * stabilizationStrength;
        Debug.DrawLine(transform.position, transform.position + torque, Color.red); // Debug
        rb.AddTorque(torque, ForceMode.Acceleration);

        
        rb.angularVelocity *= 1 - drag;
        wheel_force = 0f;
    }

}

→ Ссылка