Существует объект, который физически перемещается в точку (дочерний объект камеры), сам объект без дочерних объектов. Оказывается, персонаж «несет» объект в его руках. Я пытаюсь заставить его вращаться вертикально и горизонтально, ближайший пример: ношение объекта в Zelda Tok. Но я не понимаю, как правильно рассчитать этот вращение. Т.е. Повернут на оси U на 90 градусов - попробуйте повернуть на оси x - объект вращается не от камеры на глубину, а слева направо < /p>
ItemInArmTransform.localRotation = Quaternion.Lerp(ItemInArmTransform.localRotation, Quaternion.Euler(_currentAngleOffset.x, _currentAngleOffset.y, 0), _rotSpeed * Time.deltaTime);
< /code>
Если вы поворачиваете объект в координатах камеры или точки рук, используя Quaternion.angleaxis, то когда вы поворачиваете камеру, например, на 90 градусов вдоль оси y - объект переворачивается, потому что его оси x изменяется »с осью z. Т.е. Если на оси x было вращение на 45 градусов - будет на оси Z на 45 градусов, фактически, дальнейшее изменение изменений вращения, ожидаемого, но сам объект переворачивается на 90 градусов, что ясно видно, если вы используете LERP или асимметрично любую модель.var vertQuat = Quaternion.AngleAxis(_currentAngleOffset.x, ArmPointTransform.right);
var horQuat = Quaternion.AngleAxis(_currentAngleOffset.y, ArmPointTransform.up);
ItemInArmTransform.rotation = Quaternion.Lerp(ArmPointTransform.rotation, ArmPointTransform.rotation * vertQuat * horQuat, _rotSpeed * Time.deltaTime);
< /code>
Компоненты и вход < /p>
[field: SerializeField] public Transform ArmPointTransform { get; private set; }
public Transform ItemInArmTransform { get; private set; }
// Vector of rotation
private Vector3 _currentAngleOffset;
private void RotateVerticlal()
{
var value = _playerInput.PlayerInput.ArmPlaced.RotationVertical.ReadValue();
if (value == 0) return;
_currentAngleOffset.x += Math.Sign(value) * _angleRotStep;
_currentAngleOffset.x %= 360;
}
private void RotateLeft(InputAction.CallbackContext context)
{
_currentAngleOffset.y += _angleRotStep;
_currentAngleOffset.y %= 360;
}
private void RotateRight(InputAction.CallbackContext context)
{
_currentAngleOffset.y -= _angleRotStep;
_currentAngleOffset.y %= 360;
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... -direction