精确控制相机视角:OrbitControls的限制功能
OrbitControls的限制功能
OrbitControls
允许用户通过鼠标和键盘控制相机的视角,但有时我们希望限制这些控制,以便更好地展示特定的场景或模型。
禁止平移
通过设置.enablePan
属性为false
,可以禁止用户通过右键拖动来平移相机。
javascript
controls.enablePan = false; // 禁止右键拖拽
禁止缩放和旋转
.enableZoom
属性控制是否允许鼠标中键缩放场景,默认值为true
。.enableRotate
属性控制是否允许鼠标左键旋转场景,默认值也为true
。
javascript
controls.enableZoom = false; // 禁止缩放
controls.enableRotate = false; // 禁止旋转
设置观察目标
OrbitControls
的.target
属性对应于相机的.lookAt()
观察目标。通过改变.target
,可以控制相机的焦点。
javascript
controls.target.set(x, y, z); // 设置观察目标
controls.update(); // 更新相机视角
透视投影相机的缩放范围
通过.minDistance
和.maxDistance
属性,可以限制相机与观察目标之间的距离,从而控制缩放范围。
javascript
controls.minDistance = 200; // 最小距离
controls.maxDistance = 500; // 最大距离
正投影相机的缩放范围
对于OrthographicCamera
,可以使用.minZoom
和.maxZoom
属性来设置缩放范围。
javascript
controls.minZoom = 0.5; // 最小缩放值
controls.maxZoom = 2; // 最大缩放值
获取相机与观察目标的距离
.getDistance()
方法可以计算相机位置与观察目标之间的距离,这有助于设置合适的缩放范围。
javascript
const distance = controls.getDistance();
console.log('Camera distance:', distance);
设置旋转范围
通过.minPolarAngle
和.maxPolarAngle
属性,可以控制相机的上下旋转范围。通过.minAzimuthAngle
和.maxAzimuthAngle
属性,可以控制左右的旋转范围。
javascript
controls.minPolarAngle = 0; // 最小上下旋转角度
controls.maxPolarAngle = Math.PI; // 最大上下旋转角度
controls.minAzimuthAngle = -Math.PI / 2; // 最小左右旋转角度
controls.maxAzimuthAngle = Math.PI / 2; // 最大左右旋转角度
完整示例代码
以下是一个完整的示例,展示如何使用OrbitControls
来限制相机的旋转和缩放。
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Three.js OrbitControls Restrictions</title>
<style>
body { margin: 0; }
canvas { display: block; }
</style>
</head>
<body>
<script type="importmap">
{
"imports": {
"three": "https://threejs.org/build/three.module.js",
"three/addons/": "https://threejs.org/examples/jsm/"
}
}
</script>
<script type="module">
import * as THREE from 'three';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
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 controls = new OrbitControls(camera, renderer.domElement);
controls.target.set(0, 0, 0);
const geometry = new THREE.BoxGeometry(100, 100, 100);
const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
camera.position.set(0, 0, 5);
// 限制旋转和缩放
controls.enablePan = false; // 禁止平移
controls.enableZoom = false; // 禁止缩放
controls.enableRotate = true; // 允许旋转
// 设置旋转范围
controls.minPolarAngle = 0;
controls.maxPolarAngle = Math.PI;
controls.minAzimuthAngle = -Math.PI / 2;
controls.maxAzimuthAngle = Math.PI / 2;
// 设置缩放范围
controls.minDistance = 200;
controls.maxDistance = 500;
function render() {
requestAnimationFrame(render);
controls.update(); // 更新控制器
renderer.render(scene, camera);
}
render();
</script>
</body>
</html>