Three.js 快速入门教程【六】相机控件 OrbitControls

·
请添加图片描述

系列文章目录

Three.js 快速入门教程【一】开启你的 3D Web 开发之旅
Three.js 快速入门教程【二】透视投影相机
Three.js 快速入门教程【三】渲染器
Three.js 快速入门教程【四】三维坐标系
Three.js 快速入门教程【五】动画渲染循环
Three.js 快速入门教程【六】相机控件 OrbitControls
Three.js 快速入门教程【七】常见几何体类型


文章目录

  • 系列文章目录
  • 一、前言
  • 二、OrbitControls控件作用
  • 三、工作原理
    • 操作指南:
  • 三、项目中添加 OrbitControls 控件
    • 1、新建控件实例
    • 2、更新控件状态
  • 四、OrbitControls 属性
    • 1、基础行为控制
    • 2、 视角限制
    • 3、 自定义按键配置
    • 4、 禁用某个按钮的操作
  • 五、OrbitControls 方法
  • 六、OrbitControls 事件监听
  • 五、总结


一、前言

      在3D可视化开发中,用户交互体验直接影响项目的成败。OrbitControls 是 Three.js 库中一个非常实用的相机控制辅助工具,它能极大地增强用户与 3D 场景的交互性,让用户可以像在现实世界中观察物体一样对场景进行操作,从而更好地观察 3D 场景。


二、OrbitControls控件作用

OrbitControls作为官方推荐的交互解决方案,能够实现:

  • 鼠标拖拽旋转视图

  • 滚轮缩放场景

  • 平移观察视角

  • 移动端触摸支持

请添加图片描述


三、工作原理

OrbitControls 会监听鼠标事件(如鼠标移动、鼠标滚轮滚动、鼠标按键点击等),根据用户的操作实时计算相机应该移动到的新位置和角度,然后更新相机的相关属性,从而改变相机在 3D 场景中的视角。例如,当用户按下鼠标左键并拖动时,OrbitControls 会计算鼠标移动的距离和方向,进而旋转相机;当用户滚动鼠标滚轮时,它会根据滚轮的滚动量来缩放相机。

操作指南:

  • 旋转功能:用户按下鼠标左键并拖动,可以围绕一个目标点旋转相机,就像在现实中围绕一个物体走动观察一样。这样可以从不同的角度查看场景中的物体,全面了解其外观和结构。
  • 平移功能:按下鼠标右键并拖动,能够在水平和垂直方向上平移相机。这在需要查看场景中特定区域或者调整观察范围时非常有用。
  • 缩放功能:滚动鼠标滚轮可以实现相机的缩放操作,拉近或拉远与场景中物体的距离,以便更清晰地观察细节或者查看整个场景的全貌。

三、项目中添加 OrbitControls 控件

1、新建控件实例

const controls=new OrbitControls(camera, domElement);

构造函数接受两个参数:
camera:要控制的相机对象。
domElement:用于监听鼠标事件的 DOM 元素,通常是渲染器的 DOM 元素。

2、更新控件状态

controls.update()

该方法用于更新控件的状态,通常在每一帧渲染时调用。如果启用了阻尼效果,必须在每一帧调用此方法,以确保阻尼效果正常工作。

示例:

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

// 设置阻尼(惯性),让控件的操作更平滑
controls.enableDamping = true;
controls.dampingFactor = 0.05;

// 更新控件
function animate() {
  requestAnimationFrame(animate);
  // 必须每帧更新!
  controls.update();
  renderer.render(scene, camera);
}
animate();

在上述代码中,我们创建了 OrbitControls 实例,然后启用了阻尼效果,并设置了阻尼因子,这样在操作相机时会有惯性的感觉,让交互更加自然。同时,在 animate 函数中,我们调用 controls.update() 方法来更新控件的状态,确保相机能够根据用户的操作实时更新。


四、OrbitControls 属性

常用属性大全:

属性名称类型说明默认值
enableDampingBoolean用于启用或禁用阻尼(惯性)效果,启用后,相机的运动会更平滑,就像有惯性一样false
dampingFactorNumber用于控制阻尼(惯性)效果强度的属性,通常取值范围在 0 到 1 之间0.05
autoRotateBoolean相机是否围绕着目标点自动旋转false
autoRotateSpeedNumber自动旋转的速度1.0
enableRotateBoolean用于控制是否启用鼠标旋转相机true
enablePanBoolean用于控制是否启用鼠标平移相机true
enablePanBoolean用于控制是否启用鼠标滚轮缩放相机true
maxDistanceNumber设置相机到目标点的最大距离,限制缩放范围Infinity
minDistanceNumber设置相机到目标点的最小距离,限制缩放范围0
minPolarAngleNumber相机垂直方向的最小角度(弧度制)0
maxPolarAngleNumber相机垂直方向的最大角度(弧度制)Math.PI
minAzimuthAngleNumber相机水平方向的最小角度(弧度制)-Infinity
maxAzimuthAngleNumber相机水平方向的最大角度(弧度制)Infinity
targetTHREE.Vector3对象相机观察目标点new THREE.Vector3(0, 0, 0)
screenSpacePanningBoolean相机的平移操作是否基于屏幕空间true
mouseButtonsObject配置鼠标按钮与相机控制操作之间的映射关系。通过修改这个属性,你可以自定义鼠标不同按键对应的操作,默认鼠标左键旋转(THREE.MOUSE.ROTATE),滚轮缩放(THREE.MOUSE.DOLLY),右键平移(THREE.MOUSE.PAN){ LEFT: THREE.MOUSE.ROTATE,MIDDLE: THREE.MOUSE.DOLLY, RIGHT: THREE.MOUSE.PAN }

1、基础行为控制

controls.enableDamping = true;   // 启用阻尼惯性
controls.dampingFactor = 0.05;  // 惯性系数(0-1)
controls.autoRotate = true;      // 启用自动旋转
controls.autoRotateSpeed = 2.0; // 旋转速度(默认1.0)

controls.enableZoom = false;    // 禁用缩放
controls.enablePan = false;     // 禁用平移

2、 视角限制

controls.minDistance = 3;      // 最小缩放距离
controls.maxDistance = 50;     // 最大缩放距离

controls.minPolarAngle = Math.PI/4;  // 垂直视角下限(弧度)
controls.maxPolarAngle = Math.PI/2;  // 垂直视角上限

controls.minAzimuthAngle = -Math.PI/2; // 水平旋转下限
controls.maxAzimuthAngle = Math.PI/2;  // 水平旋转上限

3、 自定义按键配置

修改左键平移,右键旋转

controls.mouseButtons = {
    LEFT:THREE.MOUSE.PAN,//平移
    MIDDLE: THREE.MOUSE.DOLLY,
    RIGHT:  THREE.MOUSE.ROTATE//旋转
};

4、 禁用某个按钮的操作

把对应按键配置设置为null

// 禁用鼠标滚轮的操作
controls.mouseButtons.MIDDLE = null;

五、OrbitControls 方法

方法名称说明
update该方法用于更新控件的状态,通常在每一帧渲染时调用。如果启用了阻尼效果,必须在每一帧调用此方法,以确保阻尼效果正常工作
reset将相机的位置和角度重置为初始状态
saveState保存当前相机的位置、角度和目标点等状态
restoreState恢复之前保存的相机状态

六、OrbitControls 事件监听

事件名称说明使用场景
change当相机的位置、角度或者目标点发生变化时,就会触发 change 事件可用于实时更新与相机状态相关的 UI 元素,或者在相机视角改变时执行一些特定操作。
start当用户开始与控件进行交互(如按下鼠标按钮开始旋转、平移或缩放)时,会触发 start 事件。可以在用户开始操作相机时,播放一些提示音或者显示操作提示信息。
end当用户结束与控件的交互(如松开鼠标按钮)时,会触发 end 事件。可用于在用户操作结束后,进行一些资源清理或者数据保存的操作
// 变化事件监听
controls.addEventListener('change', () => {
    console.log('Camera position:', camera.position);
    console.log('Camera rotation:', camera.rotation);
});

// 特定事件处理
controls.addEventListener('start', () => {
    console.log('交互开始');
});

controls.addEventListener('end', () => {
    console.log('交互结束');
});

五、总结

       OrbitControls 作为 Three.js 生态中的重要控件,极大地简化了开发者在处理 3D 场景交互时的复杂度。它就像是一把钥匙,为用户打开了自由探索 3D 世界的大门,让用户能够以直观的方式与场景进行互动,从不同的角度、距离去观察和体验 3D 模型和场景。无论是在产品展示、建筑可视化还是游戏开发等领域,OrbitControls 都能发挥出巨大的作用,为项目增添独特的魅力。

更多three.js入门知识点请关注该系列教程后续的更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/975029.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抗辐照加固CAN FD芯片的商业航天与车规级应用解析

在工业自动化、智能汽车、航空航天及国防装备等关键领域,数据传输的安全性、可靠性与极端环境适应能力是技术升级的核心挑战。国科安芯推出全新一代CANFD(Controller Area Network Flexible Data Rate)芯片,以高安全、高可靠、断电…

经验分享—WEB渗透测试中遇到加密内容的数据包该如何测试!

经验分享—WEB渗透测试中遇到加密内容的数据包该如何测试! 01 加解密的意义 现阶段的渗透测试让我发现越来越多的系统不只是在漏洞修补方面做了功夫,还对一些参数进行加密,干扰爬虫或者渗透测试的进行。 在我小白阶段看到下图这种加密方式…

在群晖上使用Docker安装思源笔记

​​ 最近一段时间,docker的镜像地址都失效了,在群晖系统中,无论是早期版本的docker,还是最新版本中的Container Manager,注册表中都无法链接到docker的镜像,于是,就花了点时间查找资料&#x…

网络安全营运周报

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 第三章网络安全基础 一、网络安全概述 1、网络安全现状及安全挑战 网络安全范畴极其广泛,可以说是涉及多方面。 因为计算机病毒层出不穷以及黑客的…

Linux 进程通信——管道

目录 一、什么是进程通信 二、为什么要进行进程通信 三、如何进行通信 四、管道 1、什么是管道 2、管道的原理 3、接口 4、编码实现 5、管道的特征 6、管道的4种情况 一、什么是进程通信 进程通信是两个或多个进程实现数据层面的交互。 因为进程具有独立性&#xff0…

Linux中DataX使用第四期

简介 紧接着上期关于定义如何一个简单的插件,本期了解下关系型数据库的数据读取和数据写入。 环境 Windows10 (linux中命令相似,为了方面调试就用windows的)JDK(1.8以上,推荐1.8)Python(2或3都可以)Apache Maven (推荐3.x版本)IntelliJ IDEA…

Java计算机毕业设计基于SSM宠物美容信息管理系统数据库源代码+LW文档+开题报告+答辩稿+部署教程+代码讲解

源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

核货宝助力连锁门店订货数字化转型升级

在竞争激烈的连锁零售行业,传统订货模式弊端日益凸显,严重制约着企业的发展。核货宝订货系统以其卓越的数字化解决方案,为连锁门店订货带来了全方位的变革,助力企业实现数字化转型升级,在市场中抢占先机。 一、增强总部…

论文解读 | AAAI'25 Cobra:多模态扩展的大型语言模型,以实现高效推理

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 个人信息 作者:赵晗,浙江大学-西湖大学联合培养博士生 内容简介 近年来,在各个领域应用多模态大语言模型(MLLMs&…

java中的Entry类,map接口

看Redisson源码时候发现有个Entry&#xff0c;眼熟&#xff0c;遂查资料 Map.Enty<KV> 是在Map接口中的一个内部接口Entry 作用&#xff1a;当Map集合一创建那么就会在Map集合中创建一个Enty对象&#xff0c;用来记录键与值&#xff08;键值对对象&#xff0c;键与值的…

HarmonyOS学习第4天: DevEco Studio初体验

初次邂逅&#xff1a;DevEco Studio 在数字化浪潮汹涌澎湃的当下&#xff0c;移动应用开发领域始终是创新与变革的前沿阵地。鸿蒙系统的横空出世&#xff0c;宛如一颗璀璨新星&#xff0c;照亮了这片充满无限可能的天空&#xff0c;为开发者们开启了一扇通往全新世界的大门。而…

ue5地面上出现preview字样

如图&#xff1a; 解决办法 将光源修改为moveable 参考博客&#xff08;UE光影有preview字样、输出也有_ue5阴影preview消除-CSDN博客

Unity 适用于单机游戏的红点系统(前缀树 | 数据结构 | 设计模式 | 算法 | 含源码)

文章目录 功能包括如何使用 功能包括 红点数据本地持久化 如果子节点有红点&#xff0c;父节点也要显示红点&#xff0c;父节点红点数为子节点红点数的和&#xff1b; 当子节点红点更新时&#xff0c;对应的父节点也要更新&#xff1b; 当所有子节点都没有红点时&#xff0c…

个人环境配置--安装记录

根据显卡下载对应的cuda和cudnn 我使用的是docker,首先拉取镜像,我用的是ubuntu20.04 加速&#xff1a;pull hub.1panel.dev/ devel是开发版本 sudo docker pull hub.1panel.dev/nvidia/cuda:11.6.1-devel-ubuntu20.04先测试一下cuda有没有安装好 nvcc -V更新&#xff0c;安装…

代码审计初探

学会了基础的代码审计后&#xff0c;就该提高一下了&#xff0c;学一下一些框架的php代码审计 先从一些小众的、已知存在漏洞的cms入手 phpems php的一款开源考试系统 源码下载 https://down.chinaz.com/soft/34597.htm 环境部署 windows审计&#xff0c;把相关文件放到phps…

记录Qt 虚拟键盘样式修改与使用

文章目录 概述 一、使用虚拟键盘 二、项目文件定义 1.VirtualKeyboard.qml 2.main.qml 3.main.cpp 三、编译运行 1.编译 2.运行 3.运行效果 总结 概述 在 Qt 开发中&#xff0c;虚拟键盘是移动设备和嵌入式设备中常用的输入工具。本文将详细介绍如何通过 QML 修改虚拟键盘样式…

国产开源PDF解析工具MinerU

前言 PDF的数据解析是一件较困难的事情&#xff0c;几乎所有商家都把PDF转WORD功能做成付费产品。 PDF是基于PostScript子集渲染的&#xff0c;PostScript是一门图灵完备的语言。而WORD需要的渲染&#xff0c;本质上是PDF能力的子集。大模型领域&#xff0c;我们的目标文件格…

基于单片机的智能电表设计(论文+源码)

2.1 系统整体方案设计 本课题为基于单片机的电子式单项智能电表&#xff0c;在此设计如图2.1所示的系统总体架构&#xff0c;其采用STM32单片机作为主控制器&#xff0c;搭配外设HLW8032模块实现对电压&#xff0c;电流&#xff0c;功率因数&#xff0c;电能消耗等参数进行检…

Kafka在Windows系统使用delete命令删除Topic时出现的问题

在使用Windows的Kafka时&#xff0c;想要删除某一个主题&#xff0c;发现使用了delete之后会一直报警告。下面是我发现错误之后重新实测的Bug 先创建2个topic kafka-topics.bat --bootstrap-server localhost:9092 --topic test1 --createkafka-topics.bat --bootstrap-serve…

【部署优化篇十三】深度解析《DeepSeek API网关:Kong+Nginx配置指南》——从原理到实战的超详细手册

一、为什么需要API网关?从单体服务到微服务的必然选择 1.1 单体服务的痛点 想象一下早期的淘宝——所有功能(用户中心、商品管理、订单系统)都打包在一个巨型服务里。这样的架构存在三大致命问题: 单点故障:一旦服务崩溃,整个系统瘫痪扩展困难:每次发布都需要全量部署…