threejs中的OrbitControls

阅读数:94 评论数:0

跳转到新版页面

分类

html/css/js

正文

一、概述

OrbitControlsthree.js 中的一个控制器,用于实现对 3D 场景的相机控制,允许用户通过鼠标或触摸操作来旋转、缩放和平移视图。

即轨道控制器,可以使相机围绕目标旋转。

OrbitControls(object:Camera,domElement:HTMLDOMElement)

object:(必需)要控制的摄像机。相机不得是其他对象的子对象,除非该对象是场景本身。

domElement:用于事件侦听器的HTML元素

对应的操作:

  • 鼠标滑轮用于缩放。
  • 鼠标左键用于旋转。
  • 鼠标右键用于平移。

二、基本使用

1、安装three.js

npm install three

2、引入OrbitControls

three.js r128 及之后版本中,OrbitControls 被从 three.js 的核心库中分离出来,需要单独导入:

import * as THREE from 'three';
import { OrbitControls } from 'three/examples/js/controls/OrbitControls';

3、创建场景和相机

以下是一个简单的 three.js 场景,包含了 OrbitControls 控制:

import * as THREE from 'three';
import { OrbitControls } from 'three/examples/js/controls/OrbitControls';

// 创建场景
const scene = new THREE.Scene();

// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;

// 创建渲染器
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);

// 创建 OrbitControls 控件
const controls = new OrbitControls(camera, renderer.domElement);

// 动画渲染循环
function animate() {
  requestAnimationFrame(animate);

  // 更新 OrbitControls
  controls.update(); // 只有在开启了阻尼(damping)时才需要调用 update()

  // 渲染场景
  renderer.render(scene, camera);
}

animate();

4、响应式调整大小

为了使场景适应窗口大小的变化,你可以在窗口大小变化时调整相机的宽高比和渲染器的大小:

window.addEventListener('resize', () => {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix(); // 更新相机的投影矩阵
  renderer.setSize(window.innerWidth, window.innerHeight);
});

三、配置OrbitControls的选项

OrbitControls 提供了一些配置项来调整控件的行为,常用的属性包括:

1、enableDamping: 启用阻尼效果(类似物理上的惯性)。

controls.enableDamping = true;
controls.dampingFactor = 0.25; // 阻尼的强度

2、enableZoom: 是否允许缩放(默认为 true)。

controls.enableZoom = true;

3、minDistancemaxDistance: 限制相机与目标的最小和最大距离。

controls.minDistance = 2; // 最小距离
controls.maxDistance = 10; // 最大距离

4、maxPolarAngle: 限制相机的垂直旋转角度(在极轴上)。

controls.maxPolarAngle = Math.PI / 2; // 禁止向下旋转(0 到 pi)

5、rotateSpeed: 旋转速度。

controls.enableRotate = false;  // 禁止旋转

四、OrbitControls.target

targetOrbitControls 中的一个属性,用于设置相机的“目标”位置,即用户交互时相机围绕哪个点旋转。这个点通常是相机的聚焦点或目标位置。通过修改 target,你可以控制相机围绕哪个点进行旋转。

  • 默认值target 默认是一个 THREE.Vector3(0, 0, 0),即默认情况下,OrbitControls 会围绕世界坐标原点旋转。
  • 作用:改变 target 会改变相机的旋转中心。每次用户交互时,相机都会围绕 target 点进行旋转、缩放和平移。

五、OrbitControls.update()

updateOrbitControls 的一个方法,用于更新控制器的状态。通常在动画循环中调用该方法,以确保控制器正确响应用户输入(例如鼠标、触摸事件)并更新相机的位置。

  • 作用update 会检查控制器的状态(如鼠标的拖动、缩放等),并根据当前的控制状态更新相机的位置和视角。
  • 调用时机update 通常在每一帧的动画循环中调用,以确保相机的位置和目标随用户交互实时更新。
function animate() {
  requestAnimationFrame(animate);

  // 更新 OrbitControls 控制器状态
  controls.update();  // 这个方法需要在每帧调用

  renderer.render(scene, camera);
}

animate();



相关推荐

环境光会均匀的照亮场景中的所有物体,它不能用来投射阴影,因为它没有方向。 一、构造函数 Amb

聚光灯是从一个方向上的一个点发出,沿着一个圆锥体,它离光越远,它的尺寸就越大。 一、构造器 SpotL

一、概述 THREE.Object3D 是 Three.js 的基础类,用于表示 3D 空间中的一个对象。几乎所有的 3D 对象(如 Mesh、Group、Camera、Light 等)都继承自 TH

一、动画片段 animation clips     每个animationClip通常保存3D动画对象某个活动的数据。举个例子,假如mesh是一个角色,可能有一个AnimationClip实现步行循

一、概述 CSS2DRenderer 是 three.js 中的一个渲染器,用于将 HTML/CSS 元素(如标签、文本、图片等)渲染到 3D 场景中的指定位置。这种渲染器与 WebGLRendere

一、概述 WebGLRenderer 是 three.js 中的核心渲染器,用于将 3D 场景渲染到网页的 <canvas> 元素上。它使用 WebGL 技术,通过 GPU(图形处理单元)进行硬件加速

一、归一化设备坐标 在屏幕像素坐标系统中: X 轴的正方向是从左到右,和归一化设备坐标系统一致。 Y 轴的正方向是从上到下,这与归一化设备坐标系统 相反。 在归一化设备坐标 (NDC) 系统中:

一、material.emissive 在 Three.js 中,material.emissive 是一个材质属性,用来控制物体的 自发光 效果。这个属性的值通常是一个 颜色,表示物体自发光的颜色,

场景允许你在什么地方、摆放什么东西来交给three.js来渲染,是旋转物体、灯光和相机的地方。 一、构造器 <pre class="language-javascript"

一、概述 THREE.Clock 是 Three.js 中的一个类,用于管理和获取时间的流逝,特别是用于控制动画或其他基于时间的更新。它通常用于在每帧渲染时获取经过的时间,帮助计算帧率或实现平滑的动画