В Three.js каждый объект сцены
(THREE.Object3D и его наследники, например
THREE.Mesh) обладает свойствами position,
rotation и scale, которые управляют
его положением, ориентацией и размерами в 3D-пространстве. Эти свойства
формируют локальную систему координат объекта,
относительно которой выполняются все последующие преобразования.
position)Свойство position задаётся экземпляром
THREE.Vector3 и определяет координаты объекта вдоль осей X,
Y и Z:
mesh.position.set(1, 2, -5);
Также можно изменять координаты по отдельности:
mesh.position.x += 0.1;
mesh.position.y = 3;
mesh.position.z -= 0.5;
Важно понимать, что position действует в
локальной системе координат родителя. Если объект вложен в
другой объект, его координаты рассчитываются относительно позиции
родителя.
rotation)Свойство rotation задаётся экземпляром
THREE.Euler и определяет поворот объекта вокруг локальных
осей:
mesh.rotation.set(Math.PI / 4, Math.PI / 2, 0);
Повороты в Three.js задаются в радианах, но для удобства часто
используют функцию THREE.MathUtils.degToRad(degrees):
mesh.rotation.y = THREE.MathUtils.degToRad(45);
Для сложных анимаций лучше использовать quaternion, что предотвращает проблему “Гимбал-лок”:
mesh.quaternion.setFromEuler(new THREE.Euler(0, Math.PI / 4, 0));
quaternion хранит поворот в виде кватерниона, что
обеспечивает корректное смешение вращений и анимаций.
scale)Свойство scale также является THREE.Vector3
и управляет размерами объекта по каждой оси:
mesh.scale.set(2, 1, 0.5);
Единица (1) означает оригинальный размер. Значение
меньше 1 уменьшает объект, больше 1 увеличивает. Отрицательный масштаб
инвертирует объект по соответствующей оси:
mesh.scale.x = -1; // отражение по оси X
Трансформации выполняются в следующем порядке: scale → rotation → position. Порядок критически важен, так как изменение последовательности приводит к другим результатам:
mesh.scale.set(2, 2, 2);
mesh.rotation.y = Math.PI / 4;
mesh.position.set(5, 0, 0);
В данном примере объект сначала увеличится, затем повернётся, и только потом будет смещён.
Three.js предоставляет ряд методов, упрощающих работу с
трансформациями:
mesh.translateZ(2); // перемещает объект вперёд по локальной оси Z
mesh.rotateY(Math.PI / 2); // поворот на 90 градусов вокруг Y
mesh.lookAt(new THREE.Vector3(0, 0, 0));
Если объект вложен в другой объект, его трансформации комбинируются с трансформациями родителя. Например:
parent.position.set(5, 0, 0);
child.position.set(1, 0, 0);
scene.add(parent);
parent.add(child);
В этом случае мировой координатой child будет
(6, 0, 0), так как локальная позиция child
складывается с позицией родителя.
position, rotation и scale, чем
пересоздавать объекты.THREE.Clock или
сторонние библиотеки вроде GSAP для плавного изменения
свойств.Эти инструменты создают основу для построения сложных 3D-сцен, где каждый объект может независимо перемещаться, вращаться и масштабироваться, обеспечивая гибкость и точность управления визуальными эффектами.