@richard
В three.js можно ограничить вращение объекта, используя свойство Object3D.rotation
и метод Object3D.rotateOnAxis
.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
// Создание объекта и добавление его на сцену var cube = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), new THREE.MeshNormalMaterial()); scene.add(cube); // Ограничение вращения по оси Y var maxYRotation = Math.PI / 2; // Максимальный угол вращения по оси Y var minYRotation = -Math.PI / 2; // Минимальный угол вращения по оси Y var axisY = new THREE.Vector3(0, 1, 0); // Ось вращения по оси Y // Обработчик событий вращения мыши function onMouseMove(event) { // Получение изменения координат мыши var deltaX = event.movementX || event.mozMovementX || event.webkitMovementX || 0; var deltaY = event.movementY || event.mozMovementY || event.webkitMovementY || 0; // Вычисление углов вращения var angleY = deltaX * 0.01; var angleX = deltaY * 0.01; // Поворот объекта по осям Y и X cube.rotateOnAxis(axisY, angleY); cube.rotation.x += angleX; // Ограничение вращения по оси Y var currentRotationY = cube.rotation.y; if (currentRotationY > maxYRotation) { cube.rotation.set(cube.rotation.x, maxYRotation, cube.rotation.z); } else if (currentRotationY < minYRotation) { cube.rotation.set(cube.rotation.x, minYRotation, cube.rotation.z); } } // Добавление обработчика событий на элемент canvas var canvas = document.getElementsByTagName('canvas')[0]; canvas.addEventListener('mousemove', onMouseMove, false); |
В этом примере мы создаем куб и добавляем его на сцену. Затем мы создаем ось вращения по оси Y и устанавливаем максимальный и минимальный углы вращения. В обработчике событий мыши мы используем метод rotateOnAxis
для вращения объекта по оси Y и свойство Object3D.rotation.x
для вращения объекта по оси X. После вращения объекта мы проверяем его текущий угол вращения по оси Y и, если он превышает максимальный или минимальный угол, устанавливаем его на максимальный или минимальный угол, соответственно.
@richard
Идея с ограничением вращения по оси Y в данном примере применима и для других ограничений вращения объекта в three.js. Вы можете создать свои собственные ограничения, установив соответствующие максимальные и минимальные углы вращения для каждой оси и проверяя их после каждого поворота объекта.
Помимо этого, также можно использовать констрейнты с помощью Three.js библиотеки Ammo.js. Например, для того чтобы ограничить углы rotation по осям X, Y, Z, можно использовать constraint:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Создание объекта и добавление его на сцену var cube = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), new THREE.MeshNormalMaterial()); scene.add(cube); // Создание constraint var rotationConstraint = new Ammo.btGeneric6DofConstraint(cube.body, new Ammo.btTransform(), true); // Установка ограничений rotationConstraint.setLinearLowerLimit(new Ammo.btVector3(0, 0, 0)); rotationConstraint.setLinearUpperLimit(new Ammo.btVector3(0, 0, 0)); rotationConstraint.setAngularLowerLimit(new Ammo.btVector3(-Math.PI / 4, -Math.PI / 4, -Math.PI / 4)); rotationConstraint.setAngularUpperLimit(new Ammo.btVector3(Math.PI / 4, Math.PI / 4, Math.PI / 4)); // Добавление constraint на мир физики physicsWorld.addConstraint(rotationConstraint); |
Этот пример демонстрирует использование constraint для ограничения вращения объекта по осям X, Y, Z в three.js с помощью Ammo.js библиотеки для физических вычислений.