首页 > 其他分享 >ThreeJS入门(185):THREE.OrbitControls 知识详解,示例代码

ThreeJS入门(185):THREE.OrbitControls 知识详解,示例代码

时间:2024-12-08 11:58:33浏览次数:7  
标签:控件 ThreeJS OrbitControls 示例 THREE 默认 相机 orbitControls

作者: 还是大剑师兰特 ,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,webgl,ThreeJS,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。

在这里插入图片描述

查看本专栏目录 - 本文是第 185篇入门文章

文章目录

THREE.OrbitControls 是 Three.js 中一个非常常用的交互控件,它允许用户通过鼠标或触摸设备来控制相机的旋转、缩放和平移。这个控件非常适合用于浏览三维场景,提供了类似于地球仪的交互体验,用户可以轻松地旋转、缩放和平移视图。

构造函数

构造函数 new THREE.OrbitControls(camera, domElement) 创建一个新的 OrbitControls 实例。

  • camera:要控制的相机对象。
  • domElement:可选参数,指定与控件交互的 DOM 元素,默认为渲染器的 domElement

属性

enabled

一个布尔值,表示控件是否可用,默认为 true。当设为 false 时,控件不会响应用户的输入。

target

一个 THREE.Vector3 对象,表示相机的目标点。这是相机试图对准的场景中的点,默认为 (0, 0, 0)

autoRotate

一个布尔值,表示是否自动旋转,默认为 false。如果设为 true,则相机将自动绕目标点旋转。

autoRotateSpeed

一个数值,表示自动旋转的速度,默认为 2。较高的值会使自动旋转更快。

enableDamping

一个布尔值,表示是否启用阻尼效果,默认为 false。如果设为 true,则旋转和平移会有平滑过渡的效果。

dampingFactor

一个数值,表示阻尼因子,默认为 0.05。较高的值会使阻尼效果更强。

`enableZoom**

一个布尔值,表示是否允许缩放,默认为 true

`zoomSpeed**

一个数值,表示缩放速度,默认为 1.0。较高的值会使缩放更快。

`enablePan**

一个布尔值,表示是否允许平移,默认为 true

`panSpeed**

一个数值,表示平移速度,默认为 0.3。较高的值会使平移更快。

`enableRotate**

一个布尔值,表示是否允许旋转,默认为 true

`rotateSpeed**

一个数值,表示旋转速度,默认为 1.0。较高的值会使旋转更快。

`minDistance**

一个数值,表示相机到目标点的最小距离,默认为 0

`maxDistance**

一个数值,表示相机到目标点的最大距离,默认为 Infinity

`minPolarAngle**

一个数值,表示极角的最小值,默认为 0。这是相机在垂直方向上的下限。

`maxPolarAngle**

一个数值,表示极角的最大值,默认为 Math.PI。这是相机在垂直方向上的上限。

方法

update()

更新控件的状态。这个方法通常在渲染循环中被调用,以确保控件的状态得到及时更新。

dispose()

释放控件使用的资源。当不再需要控件时可以调用此方法来释放相关资源。

使用示例

下面是一个简单的示例,展示如何使用 THREE.OrbitControls 来创建一个基本的交互场景:

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

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

// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 10, 20); // 设置相机初始位置

// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 创建一个立方体
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

// 创建 OrbitControls
const orbitControls = new THREE.OrbitControls(camera, renderer.domElement);

// 设置属性
orbitControls.target.set(0, 0, 0); // 设置目标点
orbitControls.zoomSpeed = 1.0; // 缩放速度
orbitControls.panSpeed = 0.3; // 平移速度
orbitControls.rotateSpeed = 1.0; // 旋转速度
orbitControls.minDistance = 5; // 最小距离
orbitControls.maxDistance = 50; // 最大距离
orbitControls.minPolarAngle = 0; // 最小极角
orbitControls.maxPolarAngle = Math.PI / 2; // 最大极角

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

    // 更新 OrbitControls
    orbitControls.update();

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

事件监听

为了使 OrbitControls 能够响应用户的输入,需要监听鼠标和触摸事件。OrbitControls 会在内部处理这些事件,但你需要确保 DOM 元素是可交互的,并且适当地设置事件监听器来响应用户的输入。

注意事项

  1. 鼠标和触摸事件:确保在支持 Pointer Events API 的浏览器上使用 OrbitControls,因为 OrbitControls 依赖于 Pointer Events 来处理鼠标和触摸事件。
  2. 相机定位:通过设置 target 属性来确定相机对准的中心点。这有助于用户更好地理解场景的布局。
  3. 速度调整:通过设置 zoomSpeedpanSpeedrotateSpeed 来调整交互的速度。较高的值会使交互更快。
  4. 距离和角度限制:通过设置 minDistancemaxDistanceminPolarAnglemaxPolarAngle 来限制相机的移动范围和旋转角度。这有助于保持用户在合理的范围内查看场景。
  5. 阻尼效果:通过设置 enableDampingdampingFactor 来启用阻尼效果,这可以使交互更加平滑。
  6. 自动旋转:通过设置 autoRotateautoRotateSpeed 可以使相机自动绕目标点旋转,这对于演示或动画场景非常有用。

总结

THREE.OrbitControls 是 Three.js 中用于实现三维场景浏览的交互控件。通过使用 OrbitControls,你可以让用户通过鼠标或触摸设备来控制相机的旋转、缩放和平移。在使用时,确保正确设置相机和渲染器,并监听必要的事件来处理用户的输入。如果你需要更复杂的交互功能,如锁定特定的视角或实现特定的动画效果,可以进一步扩展 OrbitControls 或结合其他控件来实现。

标签:控件,ThreeJS,OrbitControls,示例,THREE,默认,相机,orbitControls
From: https://blog.csdn.net/cuclife/article/details/142257149

相关文章

  • ThreeJS入门(182):THREE.FirstPersonControls 知识详解,示例代码
    作者:还是大剑师兰特,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,webgl,ThreeJS,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。查看本专栏目录-本文是第182篇入门文章......
  • 学习threejs,实现配合使用WebWorker
    ......
  • 介绍一下 WebApplicationContext 思维导图 代码示例(java 架构)
    WebApplicationContext是Spring框架中的一个接口,它是ApplicationContext的扩展,专门用于Web应用程序。它提供了对Web特定功能的支持,例如解析主题(themes)、管理国际化资源、以及与Servlet容器集成等。下面是一个关于WebApplicationContext的思维导图大纲和一些代码示例。WebAp......
  • 提升数据提取质量的秘诀:如何有效使用参考示例
    提升数据提取质量的秘诀:如何有效使用参考示例在当今信息爆炸的时代,如何从大量非结构化数据中提取出有用的信息变得尤为重要。数据提取通常试图生成文本和其他半结构化格式的信息的结构化表示。这篇文章将为您展示如何通过参考示例的使用,提高大型语言模型(LLM)中的数据提取质......
  • 零基础学习Air724UG低功耗模组软件的FTP示例 | 演示篇
    一文讲清Air724UG低功耗模组软件的FTP示例,分步演示,就算零基础也一眼懂!一、简介FTP(FileTransferProtocol,文件传输协议)是TCP/IP协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过......
  • Ansible常用模块及使用示例
    Ansible常用模块        每个Ansible模块都是一个独立的小程序或脚本,设计用来完成特定的任务。它们通常以Python编写,但也可以用其他语言。模块被设计为幂等的(idempotent),这意味着无论执行多少次,结果都是一样的,并且不会对系统造成不必要的改变。Ansible拥有大量的内置模......
  • 前端高级组件(树组与自动填充)封使用示例,看看封装表的青现理解思想就好,商业源码,不能泄
     第一先看树组件          以下是自动提示的封装,以下是效果 以下点击是肯它需要后端反回数据,参数是上面输的值,后端的接口应该如下:importcom.jfinal.core.ActionKey;importcom.jfinal.core.Controller;importcom.jfinal.core.paragetter.Para;......
  • QT - QOverload说明及示例
    在QT中,通常我们建立信号槽时信号和槽传递的参数是对应的,允许槽的函数比信号的函数少,但是排列顺序不能变。当信号的参数被重载或者信号参数与槽函数的参数不一致时,需要指定本次connect时信号使用的参数或者将信号使用的参数强转,这就用到了信号重载。比如常用的QComboBox类中的&QC......
  • 【RAS非对称加密算法】DEMO原理与示例
    fromCrypto.PublicKeyimportRSAfromCrypto.CipherimportPKCS1_OAEP#生成RSA密钥对defgenerate_rsa_keys():"""公钥是通过特定算法从私钥导出的,可以安全地公开。公钥用于加密数据或验证签名。私钥用于解密数据或生成签名。""......
  • Python如何将Excel数据导入到MySQL数据库?详细教程与实战示例
    在数据处理和分析的过程中,我们常常需要将Excel数据导入到MySQL数据库中,以便进行更高效的查询和管理。那么,如何利用Python实现这一过程呢?本文将深入探讨Python将Excel数据导入到MySQL数据库的方法,并提供详细的教程和实战示例。无论您是初学者还是有经验的开发者,都可以通过本文掌......