Объект перестает вращаться спустя определенное количество градусов (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 шт):
Если вы хотите манипулировать вращением объекта одновременно с использованием физики, то рекомендую использовать физический подход (Прикладывать силу вращения) вместо простого вращения:
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;
}
}