Three.js 中的 OrbitControls 是一个用于控制相机围绕目标旋转以及缩放、平移等操作的控制器。

本文主要是介绍Three.js 中的 OrbitControls 是一个用于控制相机围绕目标旋转以及缩放、平移等操作的控制器。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

demo案例
Three.js 中的 OrbitControls 是一个用于控制相机围绕目标旋转以及缩放、平移等操作的控制器。下面是它的详细讲解:
在这里插入图片描述

构造函数:

OrbitControls(object: Camera, domElement?: HTMLElement)
  • object:THREE.Camera 实例,控制器将围绕此对象进行操作,例如相机。
  • domElement (可选):用于监听鼠标事件的 HTML 元素。如果未提供,则默认为 document

属性:

  1. enabled: boolean

    • 控制器是否启用。
  2. target: Vector3

    • 控制相机围绕其旋转的目标点。
  3. minDistance: number

    • 缩放的最小距离。
  4. maxDistance: number

    • 缩放的最大距离。
  5. minPolarAngle: number

    • 极角的最小值。
  6. maxPolarAngle: number

    • 极角的最大值。
  7. minAzimuthAngle: number

    • 方位角的最小值。
  8. maxAzimuthAngle: number

    • 方位角的最大值。
  9. enableDamping: boolean

    • 是否启用阻尼以实现平滑移动。
  10. dampingFactor: number

    • 阻尼系数,控制平滑移动的速度。
  11. enableZoom: boolean

    • 是否启用缩放功能。
  12. zoomSpeed: number

    • 缩放速度。
  13. enableRotate: boolean

    • 是否启用旋转功能。
  14. rotateSpeed: number

    • 旋转速度。
  15. enablePan: boolean

    • 是否启用平移功能。
  16. panSpeed: number

    • 平移速度。
  17. screenSpacePanning: boolean

    • 是否启用屏幕空间平移。
  18. keyPanSpeed: number

    • 按键平移速度。
  19. autoRotate: boolean

    • 是否启用自动旋转。
  20. autoRotateSpeed: number

    • 自动旋转速度。

方法:

  1. update(): void

    • 更新控制器状态。
  2. listenToKeyEvents(domElement: HTMLElement): void

    • 监听键盘事件。
  3. saveState(): void

    • 保存当前控制器状态。
  4. reset(): void

    • 重置控制器状态为初始状态。
  5. dispose(): void

    • 清理控制器所占用的资源,释放内存。

示例:

import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';// 创建相机
const camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 0, 5);// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);// 创建 OrbitControls 实例
const controls = new OrbitControls(camera, renderer.domElement);// 设置控制器属性
controls.enableDamping = true;
controls.dampingFactor = 0.25;
controls.rotateSpeed = 0.5;// 动画循环
function animate() {requestAnimationFrame(animate);controls.update(); // 更新控制器状态renderer.render(scene, camera);
}animate();

// 创建场景


function init() {// 创建场景scene = new THREE.Scene();// 设置背景颜色scene.background = new THREE.Color(0xcccccc);// 添加雾效scene.fog = new THREE.FogExp2(0xcccccc, 0.002);// 创建渲染器renderer = new THREE.WebGLRenderer({ antialias: true });// 设置像素比率renderer.setPixelRatio(window.devicePixelRatio);// 设置渲染器大小renderer.setSize(window.innerWidth, window.innerHeight);// 将渲染器的 DOM 元素添加到文档中document.body.appendChild(renderer.domElement);// 创建相机camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);// 设置相机位置camera.position.set(400, 200, 0);// 控制器controls = new OrbitControls(camera, renderer.domElement);controls.listenToKeyEvents(window); // 可选,监听键盘事件//controls.addEventListener( 'change', render ); // 仅在静态场景中调用此行 (即如果没有动画循环)// 启用阻尼以实现平滑移动controls.enableDamping = true;// 设置阻尼系数controls.dampingFactor = 0.05;// 禁用屏幕空间平移controls.screenSpacePanning = false;// 设置缩放的最小距离controls.minDistance = 100;// 设置缩放的最大距离controls.maxDistance = 500;// 设置极角最大值controls.maxPolarAngle = Math.PI / 2;// 创建几何体和材质const geometry = new THREE.ConeGeometry(10, 30, 4, 1);const material = new THREE.MeshPhongMaterial({ color: 0xffffff, flatShading: true });// 创建网格并随机添加到场景中for (let i = 0; i < 500; i++) {const mesh = new THREE.Mesh(geometry, material);mesh.position.x = Math.random() * 1600 - 800;mesh.position.y = 0;mesh.position.z = Math.random() * 1600 - 800;mesh.updateMatrix();mesh.matrixAutoUpdate = false;scene.add(mesh);}// 创建灯光并添加到场景中const dirLight1 = new THREE.DirectionalLight(0xffffff, 3);dirLight1.position.set(1, 1, 1);scene.add(dirLight1);const dirLight2 = new THREE.DirectionalLight(0x002288, 3);dirLight2.position.set(-1, -1, -1);scene.add(dirLight2);const ambientLight = new THREE.AmbientLight(0x555555);scene.add(ambientLight);// 窗口大小调整时更新渲染器和相机window.addEventListener('resize', onWindowResize);
}

// 窗口大小调整时更新渲染器和相机


function onWindowResize() {// 更新相机的长宽比camera.aspect = window.innerWidth / window.innerHeight;// 更新相机的投影矩阵camera.updateProjectionMatrix();// 更新渲染器的大小renderer.setSize(window.innerWidth, window.innerHeight);
}

// 渲染场景


function animate() {// 请求下一帧动画requestAnimationFrame(animate);// 更新控制器状态,仅在启用阻尼或自动旋转时才需要controls.update();// 渲染场景render();
}function render() {// 使用渲染器将场景渲染到相机视角renderer.render(scene, camera);
}

本内容来源于小豆包,想要更多内容请跳转小豆包 》

这篇关于Three.js 中的 OrbitControls 是一个用于控制相机围绕目标旋转以及缩放、平移等操作的控制器。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/842489

相关文章

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.