Класс Mesh в Babylon.js представляет собой один из важнейших объектов в 3D-сценах. Он используется для отображения геометрических объектов и работы с их пространственным расположением, ориентацией и размером. В этой статье рассматриваются базовые операции с Mesh в контексте его позиции, вращения и масштабирования.
Позиция объекта в трехмерном пространстве задается через вектор, который определяет его местоположение относительно координатной системы сцены. В Babylon.js позиция объекта хранится в свойстве position класса Mesh, которое является экземпляром класса Vector3.
mesh.position = new BABYLON.Vector3(x, y, z);
Здесь x, y, z — это координаты
объекта в пространстве. Изменяя эти значения, можно перемещать объект в
сцене.
Кроме того, можно получить текущую позицию объекта с помощью:
console.log(mesh.position);
Позиция объекта в сцене влияет на его расположение относительно всех других объектов. Это свойство можно использовать для создания анимаций движения, перемещения объектов между различными точками и взаимодействия с другими частями сцены.
Вращение объекта в 3D-пространстве осуществляется с помощью углов, которые определяют ориентацию объекта относительно осей X, Y и Z. В Babylon.js вращение задается через свойство rotation (или rotationQuaternion для работы с кватернионами).
Поворот в градусах происходит с использованием свойств rotation.x, rotation.y и rotation.z:
mesh.rotation = new BABYLON.Vector3(rotateX, rotateY, rotateZ);
Здесь rotateX, rotateY и rotateZ — это углы поворота объекта по осям X, Y и Z соответственно. Углы задаются в радианах, и вращение происходит в порядке X → Y → Z.
Можно изменить вращение объекта по каждой из осей отдельно:
mesh.rotation.x = Math.PI / 2; // Поворот на 90 градусов по оси X
mesh.rotation.y = Math.PI / 4; // Поворот на 45 градусов по оси Y
Для более сложных вращений, например, интерполяции вращений или комбинирования различных типов поворота, рекомендуется использовать кватернионы, которые представляют собой более эффективный способ работы с вращением и избегают артефактов, связанных с угловыми единицами (например, «гимбальная блокировка»).
Для использования кватернионов задается свойство rotationQuaternion:
mesh.rotationQuaternion = BABYLON.Quaternion.RotationYawPitchRoll(yaw, pitch, roll);
Здесь yaw, pitch, roll — это углы вращения по осям Y, X и Z соответственно, выраженные в радианах.
Масштабирование объекта в Babylon.js контролируется через свойство scaling, которое является экземпляром класса Vector3. Это свойство задает коэффициенты масштабирования по осям X, Y и Z.
mesh.scaling = new BABYLON.Vector3(scaleX, scaleY, scaleZ);
Значения scaleX, scaleY, scaleZ определяют, во сколько раз объект будет увеличен или уменьшен вдоль соответствующих осей. Если все коэффициенты масштабирования равны 1, объект не изменяется. Установка значения больше 1 увеличивает размер объекта, а значение меньше 1 — уменьшает.
Пример установки масштаба:
mesh.scaling = new BABYLON.Vector3(2, 1, 1); // Увеличение объекта в 2 раза по оси X
mesh.scaling = new BABYLON.Vector3(1, 2, 1); // Увеличение объекта в 2 раза по оси Y
mesh.scaling = new BABYLON.Vector3(1, 1, 0.5); // Уменьшение объекта в 2 раза по оси Z
Масштабирование также может быть анимировано, что позволяет создавать эффекты изменения размера объекта, например, для анимации роста или сжатия объектов.
Позиция, вращение и масштабирование объекта в Babylon.js применяются через матрицы трансформаций. Все изменения, связанные с этими параметрами, влияют на итоговую матрицу модели (world matrix), которая используется для рендеринга объекта на экране.
Babylon.js автоматически вычисляет итоговую матрицу для каждого объекта на основе его позиции, вращения и масштаба. Однако в некоторых случаях может понадобиться вручную пересчитать матрицу, например, после изменения свойств трансформации:
mesh.computeWorldMatrix(true);
Этот метод пересчитывает мировую матрицу объекта с учетом его текущих изменений. Это может быть полезно, если объект был перемещен или изменен в другом контексте, и нужно синхронизировать его с мировой системой координат.
Можно комбинировать трансформации для группы объектов, задавая общие параметры для всех элементов. Например, можно создать родительский объект (пустую сетку) и привязать к нему несколько дочерних объектов:
var parent = new BABYLON.Mesh("parent", scene);
var child = new BABYLON.Mesh("child", scene);
child.parent = parent;
child.position = new BABYLON.Vector3(2, 0, 0);
В этом примере дочерний объект будет двигаться вместе с родительским, и его позиция будет определяться относительно родителя. Это удобно для создания иерархий объектов, например, в анимации или в моделях с несколькими частями.
Если сцена использует систему физики, то трансформации объектов будут учитываться при симуляции. В этом случае важно учитывать, что изменение позиции, вращения или масштаба напрямую влияет на поведение объекта в физическом мире, например, на его столкновения или взаимодействия с другими объектами.
Можно также задать физические материалы для объектов, чтобы их трансформации учитывались при расчете силы, трения и других физических параметров.
Все три трансформации — позиция, вращение и масштаб — могут быть анимированы. В Babylon.js для этого используется класс Animation. Анимация может быть привязана к любому из этих свойств и настроена для изменения значений с течением времени.
Пример анимации перемещения объекта:
var animation = new BABYLON.Animation("move", "position.x", 30, BABYLON.Animation.ANIMATIONTYPE_FLOAT, BABYLON.Animation.ANIMATIONLOOPMODE_CYCLE);
var keys = [];
keys.push({ frame: 0, value: 0 });
keys.push({ frame: 100, value: 10 });
animation.setKeys(keys);
mesh.animations.push(animation);
scene.beginAnimation(mesh, 0, 100, true);
В этом примере объект анимируется по оси X от значения 0 до 10 за 100 кадров, с цикличностью. Анимации можно комбинировать, создавая более сложные эффекты.
Работа с позиционированием, вращением и масштабированием объектов является основой для создания 3D-сцен в Babylon.js. Эти базовые трансформации позволяют эффективно управлять расположением объектов, а также использовать их для более сложных задач, таких как анимация и взаимодействие с физикой. Использование матриц трансформаций и кватернионов позволяет создавать более гибкие и точные эффекты, что делает библиотеку мощным инструментом для разработки 3D-приложений и игр.