Object3D: базовый класс и его свойства

В библиотеке Three.js центральным строительным блоком для всех объектов сцены является класс Object3D. Он служит базой для таких сущностей, как Mesh, Camera, Light, Group и других. Любой объект, который нужно разместить в 3D-пространстве, наследует свойства и методы Object3D, обеспечивая гибкость и единообразие работы со сценой.

Object3D не рендерится напрямую — он управляет положением, ориентацией, масштабом и иерархией объектов. Основное назначение — объединение объектов в иерархии и предоставление средств трансформации.

Основные свойства

position

Свойство position представляет собой объект Vector3, отвечающий за позицию объекта в мировой системе координат.

Примеры операций с position:

object.position.set(10, 5, -3);
object.position.x += 2;

rotation

Свойство rotation хранит ориентацию объекта в виде Euler (углы вращения по осям X, Y, Z). Вращение задаётся в радианах.

object.rotation.y = Math.PI / 2; // Поворот на 90 градусов вокруг оси Y

quaternion

Свойство quaternion используется для управления ориентацией объекта через кватернионы, что позволяет избегать проблемы “Gimbal Lock”. Кватернионы и Euler синхронизированы, поэтому изменение одного автоматически обновляет другое.

object.quaternion.setFromEuler(new THREE.Euler(Math.PI / 2, 0, 0));

scale

Свойство scale определяет масштаб объекта по осям X, Y, Z с помощью Vector3.

object.scale.set(2, 1, 0.5);

visible

Булевое свойство visible контролирует видимость объекта при рендеринге.

object.visible = false; // Объект скрыт

parent и children

Свойство parent указывает на родительский объект в иерархии, а children — массив дочерних объектов. Иерархия позволяет создавать сложные структуры, где трансформации родителя автоматически применяются к детям.

parentObject.add(childObject);
childObject.position.set(1, 0, 0);

up

Свойство up задаёт направление “вверх” для объекта, используемое при вычислении вращений и некоторых вспомогательных функций, например, lookAt(). По умолчанию направлено вдоль оси Y: (0, 1, 0).

object.up.set(0, 0, 1); // Изменение вверх на ось Z

matrix и matrixWorld

matrix — локальная матрица трансформации, объединяющая позицию, вращение и масштаб. matrixWorld — глобальная матрица, учитывающая иерархию родителей.

object.updateMatrix(); // Обновление локальной матрицы
object.updateMatrixWorld(); // Обновление глобальной матрицы

modelViewMatrix и normalMatrix

modelViewMatrix используется рендерером для преобразования объекта в пространство камеры. normalMatrix — 3x3 матрица для корректного преобразования нормалей при освещении.

Методы трансформации

translateX/Y/Z

Перемещают объект вдоль его локальных осей.

object.translateX(5);

rotateX/Y/Z

Вращение объекта вокруг локальных осей.

object.rotateY(Math.PI / 4);

lookAt

Направляет объект на указанную точку в мировой системе координат.

object.lookAt(new THREE.Vector3(0, 0, 0));

add и remove

Позволяют добавлять или удалять дочерние объекты, формируя иерархию.

group.add(mesh1, mesh2);
group.remove(mesh1);

traverse

Рекурсивно проходит по объекту и всем его детям, позволяя выполнять операции над всей иерархией.

scene.traverse(obj => {
    obj.visible = true;
});

Иерархия и наследование

Object3D поддерживает систему родитель-дочерний объект.

  • Трансформации родителя автоматически применяются к детям.
  • Можно создавать группы объектов, которые перемещаются и вращаются как единое целое.
  • Любой дочерний объект можно перемещать независимо, сохраняя привязку к родителю.
const group = new THREE.Group();
group.add(mesh);
group.position.set(10, 0, 0);

Дополнительные возможности

  • castShadow / receiveShadow — свойства для контроля теней у объектов, наследуются от Object3D.
  • frustumCulled — включение/отключение автоматического отсечения за пределами камеры.
  • layers — управление слоями рендеринга, позволяющее включать/исключать объекты из определённых камер или эффектов.

Применение в сложных сценах

Объекты Object3D формируют основу сцен любой сложности:

  • Создание каркасов анимаций, где кости скелета наследуют трансформации.
  • Построение игровых сцен с группами врагов или объектов.
  • Организация сцен с несколькими камерами и слоями визуализации.

Использование Object3D обеспечивает гибкость и единообразие работы с любыми элементами 3D-сцены, делая архитектуру кода предсказуемой и удобной для расширения.