Родительские объекты и иерархия сцены

В библиотеке Babylon.js сцена представляет собой структуру, которая включает различные объекты, взаимодействующие между собой. Один из ключевых аспектов работы с сценой — это использование родительских объектов и организация иерархии. В Babylon.js все объекты, будь то камеры, свет, или 3D-модели, можно организовать в иерархическую структуру, где каждый объект может быть родителем для других объектов. Такая организация облегчает управление сцены, позволяет создавать более сложные структуры и упростить обработку трансформаций.

Родительский объект в Babylon.js — это объект, который может содержать другие объекты. Это означает, что объект, назначенный родителем, влияет на положение, вращение и масштабирование всех объектов, которые находятся под его контролем. Каждый объект в Babylon.js может иметь только одного родителя, но может быть дочерью нескольких объектов.

Дочерние объекты

Дочерние объекты — это объекты, которые находятся внутри родительского объекта и следуют за его трансформациями. Если родительский объект перемещается, все его дочерние объекты также перемещаются относительно него. Трансформации родителя (положение, вращение, масштаб) всегда пропорциональны дочерним объектам, что позволяет легко управлять групповыми изменениями.

Пример использования иерархии объектов:

// Создание сцены
var scene = new BABYLON.Scene(engine);

// Создание родительского объекта (например, группы)
var parent = new BABYLON.TransformNode("parent", scene);

// Создание дочернего объекта (например, меша)
var sphere = BABYLON.MeshBuilder.CreateSphere("sphere", { diameter: 2 }, scene);

// Установка родителя для объекта
sphere.parent = parent;

В приведенном примере сфера будет перемещаться, вращаться и изменять масштаб в зависимости от родительского объекта parent. Если переместить родительский объект, все дочерние объекты, такие как сфера, будут следовать за ним.

Трансформации и их влияние на дочерние объекты

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

Позиция

Если родительский объект перемещается, все дочерние объекты также будут перемещаться относительно его новой позиции. Важно отметить, что дочерние объекты сохраняют свою локальную позицию относительно родителя.

Вращение

Вращение родительского объекта также влияет на дочерние объекты. Это означает, что если родитель поворачивается, дочерний объект будет вращаться вместе с ним. Важно, что локальные оси вращения дочернего объекта изменяются в зависимости от осей родителя.

Масштаб

Масштаб родительского объекта будет распространяться на все дочерние объекты. Если родительский объект изменяет свой масштаб, дочерние объекты будут масштабироваться в соответствии с этим изменением. Однако локальные размеры дочерних объектов сохраняются.

Локальные и глобальные трансформации

В контексте иерархии сцены важно различать локальные и глобальные трансформации. Локальные трансформации объекта — это его положение, вращение и масштаб относительно его родителя. Глобальные трансформации — это положение, вращение и масштаб относительно глобальной системы координат сцены.

Когда объект перемещается или вращается в своей локальной системе координат, это влияет на его глобальные трансформации, что особенно важно при работе с иерархией объектов. В Babylon.js можно получить как локальные, так и глобальные трансформации объекта.

Пример:

// Получение глобальной позиции объекта
var globalPosition = sphere.getAbsolutePosition();

// Получение локальной позиции объекта
var localPosition = sphere.position;

Группировка объектов

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

// Создание группы объектов
var group = new BABYLON.TransformNode("group", scene);

// Добавление нескольких объектов в группу
sphere.parent = group;
var cube = BABYLON.MeshBuilder.CreateBox("cube", { size: 2 }, scene);
cube.parent = group;

Теперь, перемещая или вращая объект group, все объекты, такие как sphere и cube, будут следовать за ним.

Использование TransformNode

TransformNode — это особый тип объекта в Babylon.js, который не отображается на сцене, но может быть использован для организации иерархий объектов. Он служит для группировки и управления другими объектами, не влияя непосредственно на визуальное представление.

var transformNode = new BABYLON.TransformNode("transformNode", scene);

// Добавление объектов в TransformNode
sphere.parent = transformNode;
cube.parent = transformNode;

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

Подсистема управления анимациями

Родительские объекты также играют важную роль при анимации объектов. Когда объект анимируется, его родитель может оказать влияние на всю анимацию, так как изменения позиции, масштаба и вращения родителя затрагивают все дочерние объекты. Анимации могут быть применены как к родителям, так и к дочерним объектам, что позволяет создавать сложные анимации, включая, например, движение персонажа с оружием или автомобиля с колесами.

// Пример анимации для родительского объекта
var animation = new BABYLON.Animation("anim", "position.x", 30, BABYLON.Animation.ANIMATIONTYPE_FLOAT, BABYLON.Animation.ANIMATIONLOOPMODE_CYCLE);
animation.setKeys([
  { frame: 0, value: 0 },
  { frame: 100, value: 10 }
]);
parent.animations.push(animation);
scene.beginAnimation(parent, 0, 100, true);

При анимации родителя все дочерние объекты будут двигаться вместе с ним.

Вывод

Иерархия объектов в Babylon.js предоставляет мощный инструмент для создания сложных сцен и объектов. Родительские объекты позволяют управлять группами объектов, а дочерние следуют за их трансформациями, что значительно упрощает работу с 3D-сценами. Использование таких объектов, как TransformNode, дает возможность создавать структуры, которые не влияют напрямую на визуальное представление сцены, но управляют другими объектами.