В 3D-графике управление ориентацией объектов требует точного и предсказуемого представления поворотов. В библиотеке Three.js два основных подхода — использование Euler-углов и кватернионов. Каждый метод имеет свои особенности, ограничения и области применения.
Euler-углы представляют собой три последовательных
вращения вокруг осей координат. В Three.js они описываются объектом
THREE.Euler:
const euler = new THREE.Euler( Math.PI / 2, 0, 0, 'XYZ' );
object.rotation.copy(euler);
Параметры:
x, y, z — углы вращения в
радианах.order — порядок применения вращений (например,
'XYZ', 'YXZ' и другие). Порядок критически
важен, так как меняет итоговую ориентацию.Преимущества:
Недостатки:
Кватернионы (THREE.Quaternion)
представляют собой математическую структуру из четырёх компонентов
(x, y, z, w) и позволяют описывать вращение без явного
упоминания углов.
const quaternion = new THREE.Quaternion();
quaternion.setFromAxisAngle( new THREE.Vector3(0, 1, 0), Math.PI / 2 );
object.quaternion.copy(quaternion);
Преимущества:
Недостатки:
Основные методы:
setFromEuler(euler) — преобразует Euler-углы в
кватернион.setFromAxisAngle(axis, angle) — вращение вокруг
оси.slerp(qb, t) — плавная интерполяция между текущим
кватернионом и qb с параметром t от 0 до
1.| Характеристика | Euler | Quaternion |
|---|---|---|
| Простота понимания | Высокая | Средняя |
| Гимбал-лок | Есть | Нет |
| Интерполяция вращений | Сложная | Плавная (SLERP) |
| Подходит для ручной настройки | Да | Нет |
| Анимации и физика | Ограниченно | Оптимально |
Euler применяют, когда вращения просты и в основном по одной оси, например: вращение колёс, простые анимации UI, регулировка камеры по одной оси.
Quaternion предпочтителен для:
Пример плавного поворота объекта с кватернионами:
const targetQuaternion = new THREE.Quaternion().setFromEuler(new THREE.Euler(0, Math.PI, 0));
object.quaternion.slerp(targetQuaternion, 0.05); // плавное вращение
Конвертация между подходами:
const euler = new THREE.Euler(0, Math.PI / 4, 0);
const quaternion = new THREE.Quaternion().setFromEuler(euler);
Euler и кватернионы в Three.js представляют собой два инструмента с разной степенью контроля и гибкости. Понимание их особенностей критично для создания корректных и плавных 3D-вращений.