← Назад к вопросам

Как представлено вращение трансформа в Unity?

1.8 Middle🔥 172 комментариев
#Unity Core#Рендеринг и графика#Физика и математика

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Представление вращения Transform в Unity

В Unity вращение Transform представлено несколькими способами, каждый из которых имеет свои преимущества и области применения. Основные представления включают углы Эйлера (Euler Angles), кватернионы (Quaternions) и матрицы преобразований (Transformation Matrices). Вращение хранится в компоненте Transform как кватернион, но в редакторе и API чаще используются углы Эйлера для удобства.

1. Углы Эйлера (Euler Angles)

Это наиболее интуитивное представление, используемое в инспекторе Unity. Вращение задается тремя углами вокруг осей: X (Pitch), Y (Yaw) и Z (Roll). Значения доступны через свойство transform.eulerAngles.

// Установка вращения через углы Эйлера
transform.eulerAngles = new Vector3(45f, 90f, 0f);
// Чтение текущих углов Эйлера
Vector3 currentRotation = transform.eulerAngles;

Преимущества:

  • Простота понимания и редактирования.
  • Прямое отображение в инспекторе Unity.

Недостатки:

  • Gimbal Lock (блокировка карданова подвеса): потеря одной степени свободы при совпадении осей.
  • Проблемы с интерполяцией (резкие скачки при переходе через 360 градусов).

2. Кватернионы (Quaternions)

Внутреннее представление вращения в Unity. Кватернион — это 4-компонентная структура (x, y, z, w), которая избегает проблем блокировки карданова подвеса. Доступ через свойство transform.rotation.

// Создание кватерниона через углы Эйлера
Quaternion rotation = Quaternion.Euler(30f, 60f, 90f);
transform.rotation = rotation;

// Поворот относительно оси (плавное вращение)
transform.rotation *= Quaternion.AngleAxis(10f, Vector3.up);

Преимущества:

  • Отсутствие Gimbal Lock.
  • Эффективная интерполяция (например, Quaternion.Slerp для сферической интерполяции).
  • Стабильные вычисления для цепочек вращений.

Недостатки:

  • Сложность для понимания (неинтуитивные параметры).
  • Невозможность прямого редактирования в инспекторе.

3. Локальное и глобальное вращение

Unity различает вращение в локальных и глобальных координатах:

  • Локальное вращение (transform.localRotation) относительно родительского объекта.
  • Глобальное вращение (transform.rotation) относительно мировых осей.
// Локальное вращение (например, для дверцы автомобиля)
transform.localRotation = Quaternion.Euler(0f, 45f, 0f);

// Глобальное вращение (например, для объекта в мире)
transform.rotation = Quaternion.Euler(0f, 90f, 0f);

4. Матрицы преобразований

На низком уровне вращение представлено в виде матрицы 4x4, объединяющей позицию, вращение и масштаб. Обычно не используется напрямую в коде, но важна для графического конвейера.

Основные операции с вращением

  • Интерполяция: Quaternion.Lerp (линейная) и Quaternion.Slerp (сферическая) для плавных анимаций.
  • Поворот к цели: Quaternion.LookRotation для ориентации объекта в направлении вектора.
  • Сложение вращений: Умножение кватернионов (некоммутативно!).
// Поворот объекта к цели
Vector3 direction = target.position - transform.position;
transform.rotation = Quaternion.LookRotation(direction);

// Плавный поворот к целевому вращению
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * speed);

Рекомендации по использованию

  • Для инспектора: используйте углы Эйлера (eulerAngles) для настройки.
  • Для кода: предпочитайте кватернионы (rotation) для вычислений.
  • Избегайте смешивания: не переключайтесь часто между eulerAngles и rotation, чтобы предотвратить потерю точности.

Понимание этих представлений критично для создания стабильных систем анимации, камеры и физики в Unity.