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);
}

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

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

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

相关文章

Kafka快速入门及使用

入门 官网 简介 Kafka是一个分布式的流媒体平台应用&#xff1a; 消息系统日志收集用户行为追踪流式处理 特点 高吞吐量消息持久化高可靠性高扩展性 常用术语 Broker&#xff1a;集群中的服务器Zookeeper&#xff1a;服务管理Topic&#xff1a;主题&#xff0c;Kafka发…

Attention Is All You Need若如爱因斯坦的相对论,Transformer模型则堪称E=MC^2之等量公式

Transformer模型已经成为当前所有自然语言处理NLP的标配&#xff0c;如GPT&#xff0c;Bert&#xff0c;Sora&#xff0c;LLama&#xff0c;Grok等。假如《Attention Is All You Need》类比为爱因斯坦的侠义相对论&#xff0c;Transformer模型则堪称EMC^2之等量公式。 看过论文…

IDEA Android新建项目基础

title: IDEA Android基础开发 search: 2024-03-16 tags: “#JavaAndroid开发” 一、构建基本项目 在使用 IDEA 进行基础的Android 开发时&#xff0c;我们可以通过IDEA自带的新建项目功能进行Android应用开发基础架构的搭建&#xff0c;可以直接找到 File --> New --> …

数据库管理开发工具Navicat for MySQL Mac版下载

Navicat for MySQL&#xff08;Mac版&#xff09;是一款强大的数据库管理开发工具&#xff0c;专为MySQL设计。它提供直观的用户界面&#xff0c;支持数据建模、查询构建、数据传输等功能&#xff0c;帮助用户轻松管理数据库。其特点包括高效的数据处理能力、安全的数据传输机制…

【算法与数据结构】 C语言实现单链表队列详解

文章目录 &#x1f4dd;队列&#x1f320; 数据结构设计&#x1f309;初始化队列函数 &#x1f320;销毁队列函数&#x1f309;入队函数 &#x1f320;出队函数&#x1f309;获取队首元素函数 &#x1f320;获取队尾元素函数&#x1f309; 判断队列是否为空函数&#x1f309;获…

HTTPS:原理、使用方法及安全威胁

文章目录 一、HTTPS技术原理1.1 主要技术原理1.2 HTTPS的工作过程1.2.1 握手阶段1.2.2 数据传输阶段 1.3 HTTPS的安全性 二、HTTPS使用方法三、HTTPS安全威胁四、总结 HTTPS&#xff08;全称&#xff1a;Hyper Text Transfer Protocol over Secure Socket Layer&#xff09;&am…

ARM:按键中断

key_inc.c #include"key_inc.h"void key1_it_config(){//使能GPIOF外设时钟RCC->MP_AHB4ENSETR | (0x1<<5);//将PF9设置为输入模式GPIOF->MODER & (~(0x3<<18));//设置由PF9管脚产生EXTI9事件EXTI->EXTICR3 & (~(0XFF<<8));EXTI…

【HarmonyOS】ArkUI - 页面路由

一、概念 页面路由是指在应用程序中实现不同页面之间的跳转和数据传递。 案例&#xff1a;第一次使用某个购物应用&#xff0c;打开时肯定会是一个登录页&#xff0c;在登录成功以后&#xff0c;会跳转到首页&#xff0c;然后可能会去搜索&#xff0c;就会进入到搜索列表页&am…

掌握Python中re模块的正则表达式应用与技巧【第155篇—正则表达式】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 掌握Python中re模块的正则表达式应用与技巧 Python 中的 re 模块是用于处理正则表达式的强…

[SAP MM] 名词专业术语解释

采购凭证 采购凭证通常是一种证明文件&#xff0c;用于记录和跟踪特定时间点的采购活动 采购凭证是指企业在采购物品或服务时所开立的一种凭证&#xff0c;用于记录采购的信息和流程 采购凭证通常包括采购申请、采购订单、采购合同等&#xff0c;其中采购订单是最常用的采购…

PCB中常用电子器件封装学习——【一网打尽】

‘ 上图是这个世界上大概所有的封装种类&#xff0c;当然我们日常硬件电路设计肯定用不到这么多&#xff0c;接下来我将介绍几种工程上常用的封装&#xff0c;配以图片方便大家理解学习。在电子器件选型的时候&#xff0c;避免选择到一些非常难以焊接的封装电子器件。

Acrobat Pro DC ----专业PDF编辑与管理

Acrobat Pro DC 2023是一款功能强大的PDF处理软件&#xff0c;它提供了丰富的编辑工具&#xff0c;支持创建、编辑、合并、分割PDF文件&#xff0c;以及高质量的PDF到其他格式的转换功能。同时&#xff0c;该软件集成了最新的OCR技术&#xff0c;可将扫描文档或图片转换成可编辑…

Godot 学习笔记(5):彻底的项目工程化,解决GodotProjectDir is null+工程化范例

文章目录 前言GodotProjectDir is null解决方法解决警告问题根本解决代码问题测试引用其实其它库的输出路径无所谓。 工程化范例环境命名规范Nuget项目结构架构代码ISceneModelIOC服务 测试GD_Extension 通用扩展TestUtils GD_ProgramTestServiceMainSceneModel Godot对应的脚本…

mac 解决随机出现的蓝色框

macbookair为什么打字的时候按空格键会出现蓝色框? - 知乎

t-rex2开放集目标检测

论文链接&#xff1a;http://arxiv.org/abs/2403.14610v1 项目链接&#xff1a;https://github.com/IDEA-Research/T-Rex 这篇文章的工作是基于t-rex1的工作继续做的&#xff0c;核心亮点&#xff1a; 是支持图片/文本两种模态的prompt进行输入&#xff0c;甚至进一步利用两…

配置git公钥

电脑重置重新配置公钥记录一下供自己观看 打开git bash 输入生成ssh公钥命令 ssh-keygen -t rsa -C your-email 一直回车直到出现 输入查看公钥命令 cat ~/.ssh/id_rsa.pub 复制公钥&#xff0c;打开git设置&#xff0c;找到ssh公钥添加(标题随便命名) 配置完后就可以正常使…

【DataWhale学习】灵境Agent开发——Agent介绍

【DataWhale学习】灵境Agent开发——Agent介绍 ​ 这次我参加了 DataWhale 的灵境Agent开发者训练营&#xff0c;第一次开发了一款属于自己的Agent&#xff0c;整体体验下来&#xff0c;操作还是非常方便的。灵境Agent和Coze上面创建的bot差不多&#xff0c;零代码开发可以仅仅…

QT常见布局器使用

布局简介 为什么要布局&#xff1f;通过布局拖动不影响鼠标拖动窗口的效果等优点.QT设计器布局比较固定&#xff0c;不方便后期修改和维护&#xff1b;在Qt里面布局分为四个大类 &#xff1a; 盒子布局&#xff1a;QBoxLayout 网格布局&#xff1a;QGridLayout 表单布局&am…

双指针(滑动窗口)-算法刷题

一.移动零&#xff08;. - 力扣&#xff08;LeetCode&#xff09;&#xff09; 算法思想 &#xff1a; 设置两个指针left,right&#xff0c;将数组分为三块[0,left]为不为0的元素&#xff0c;[left1,right-1]为0元素&#xff0c;[right,num.size()-1]为未扫描的区域&#xff0c…

Notepad++ 如何调整显示字面大小

在 Notepad 上&#xff0c;可以使用 ctrl 加上鼠标的左键来滚动来进行调整。 如何恢复默 可以使用 Ctrl 加数字键盘上的 / 键 来恢复默认设置。 当然也可以通过菜单栏上 view 菜单下的 Zoom 选项。 上面的界面中可以看到我们的在 Notepad 中使用的选项。 Notepad 如何调整显示…