Трансформации объектов: позиция, ориентация, размер
Позиция: Где находится объект? 🎯
Представь, что твой игровой объект — это точка в пространстве. Чтобы точно сказать, где он находится, нам нужна система координат!
В большинстве игровых движков используется трёхмерная система координат с тремя осями:
- X — горизонтальная ось (влево/вправо)
- Y — вертикальная ось (вверх/вниз)
- Z — ось глубины (вперёд/назад)
Позиция объекта записывается как вектор из трёх чисел:
position = (x, y, z)
Например, если объект находится в точке (2, 5, 3), это значит:
- 2 единицы вправо по оси X
- 5 единиц вверх по оси Y
- 3 единицы вперёд по оси Z
Задача: Перемещение персонажа
Персонаж находится в точке (0, 0, 0). Нужно переместить его на 3 единицы вправо и на 2 единицы вверх. Какая будет новая позиция?
Решение:
- Начальная позиция:
(0, 0, 0) - Изменение по X: +3
- Изменение по Y: +2
- Новая позиция:
(0 + 3, 0 + 2, 0) = (3, 2, 0)
Ориентация: Куда смотрит объект? 🧭
Ориентация определяет, как объект повёрнут в пространстве. Для этого чаще всего используются углы Эйлера:
- Pitch — вращение вокруг оси X (наклон вверх/вниз)
- Yaw — вращение вокруг оси Y (поворот left/right)
- Roll — вращение вокруг оси Z (вращение вокруг своей оси)
Совет: Запомни эти углы как движения самолёта 🛩️ — pitch (тангаж), yaw (рыскание), roll (крен).
Ориентация также записывается как вектор трёх углов:
rotation = (pitch, yaw, roll)
Вращение обычно измеряется в градусах, где:
- 0° — начальное положение
- 90° — поворот на четверть
- 180° — поворот на половину
- 360° — полный оборот
Задача: Поворот камеры
Камера смотрит прямо (углы (0, 0, 0)). Нужно повернуть её на 45° вправо и на 30° вверх. Какие будут новые углы?
Решение:
- Поворот вправо — это изменение yaw: +45°
- Поворот вверх — это изменение pitch: +30°
- Новая ориентация:
(0 + 30, 0 + 45, 0) = (30, 45, 0)
Размер: Насколько объект большой? 📏
Размер (масштаб) определяет, насколько объект увеличен или уменьшен относительно своего исходного размера.
Масштаб также представляется вектором трёх чисел:
scale = (scale_x, scale_y, scale_z)
Значения масштаба интерпретируются так:
1.0— исходный размер (100%)2.0— увеличение в 2 раза (200%)0.5— уменьшение в 2 раза (50%)-1.0— зеркальное отражение
Важно: Масштаб можно применять неравномерно по разным осям! Например, можно растянуть объект только по высоте.
Задача: Изменение размера
Куб имеет исходный размер (1, 1, 1). Нужно увеличить его в 2 раза по ширине и уменьшить в 3 раза по высоте. Каким будет новый масштаб?
Решение:
- Исходный масштаб:
(1, 1, 1) - По ширине (X): 1 × 2 = 2
- По высоте (Y): 1 ÷ 3 ≈ 0.333
- Новый масштаб:
(2, 0.333, 1)
Матрица трансформации: Всё вместе! 🔄
В игровых движках все три компонента (позиция, вращение, масштаб) часто объединяются в одну матрицу трансформации.
Матрица 4×4 содержит всю информацию об преобразовании объекта:
| Компонент | Что хранит |
|---|---|
| Вращение + Масштаб | Верхняя левая часть 3×3 |
| Позиция | Последний столбец (первые 3 элемента) |
Преимущество матрицы в том, что можно применять все преобразования одновременно одной операцией!
На практике тебе редко придётся работать с матрицами вручную — движок сделает это за тебя. Но понимать принцип очень важно!
Практическое применение в Unity/Unreal
В популярных движках эти концепции реализованы через компоненты:
- Unity: Transform component с полями Position, Rotation, Scale
- Unreal: Actor Transform с теми же полями
Пример кода в Unity (C#) для перемещения объекта:
// Перемещение на 5 единиц вправо transform.position += new Vector3(5, 0, 0); // Поворот на 90 градусов вокруг оси Y transform.Rotate(0, 90, 0); // Увеличение в 2 раза transform.localScale *= 2;
Итоговый практикум 🎮
Создай ментальную модель простого игрового объекта:
- Начальное состояние: позиция
(0, 0, 0), вращение(0, 0, 0), масштаб(1, 1, 1) - Перемести объект на
(5, 2, 3) - Поверни на
(0, 45, 0)(на 45° вправо) - Увеличь в 1.5 раза по всем осям
- Перемести ещё на
(-2, 0, 1)