three.js
是一个基于 WebGL 的 JavaScript 3D 库,用于在网页上创建和显示三维图形。模型拖动是指在三维场景中通过鼠标操作来移动模型的位置。
import * as THREE from 'three';
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
camera.position.z = 5;
let isDragging = false;
let previousMousePosition = { x: 0, y: 0 };
function onMouseDown(event) {
isDragging = true;
}
function onMouseUp(event) {
isDragging = false;
}
function onMouseMove(event) {
if (isDragging) {
const deltaMove = {
x: event.offsetX - previousMousePosition.x,
y: event.offsetY - previousMousePosition.y
};
const deltaRotationQuaternion = new THREE.Quaternion()
.setFromEuler(new THREE.Euler(
toRadians(deltaMove.y * 1),
toRadians(deltaMove.x * 1),
0,
'XYZ'
));
cube.quaternion.multiplyQuaternions(deltaRotationQuaternion, cube.quaternion);
}
previousMousePosition = {
x: event.offsetX,
y: event.offsetY
};
}
function toRadians(angle) {
return angle * (Math.PI / 180);
}
renderer.domElement.addEventListener('mousedown', onMouseDown, false);
renderer.domElement.addEventListener('mouseup', onMouseUp, false);
renderer.domElement.addEventListener('mousemove', onMouseMove, false);
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
animate();
原因:可能是由于渲染循环的性能问题或者事件处理不够高效。
解决方法:
requestAnimationFrame
来优化渲染循环。原因:可能是由于鼠标移动事件的处理逻辑有误。
解决方法:
通过以上步骤和代码示例,你应该能够在 three.js
中实现基本的模型拖动功能。如果遇到更复杂的问题,建议进一步调试和优化代码逻辑。
领取专属 10元无门槛券
手把手带您无忧上云