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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始学习在VUE3中使用canvas(五):globalCompositeOperation(图形混合)

一、简介 通过设置混合模式来改变图像重叠区域的显示方式。 const ctx canvas.getContext("2d");ctx.globalCompositeOperation "source-over"; 二、属性介绍 source-over 这是默认的复合操作。将源图像绘制到目标图像上&#xff0c;保留目标图像的不透…

IPV6协议之DHCPV6

目录 背景&#xff1a; 一、DHCPV6概述 DHCPv6 Client&#xff1a; DHCPv6 Relay&#xff1a; DHCPv6 Server&#xff1a; 二、DHCPV6工作原理 DHCPV6无状态自动分配 三、DHCP基础配置 服务端 四、DHCPV6地址更新时间&#xff08;DHCPV4租期&#xff09; 五、DHCPV6…

idea 开发serlvet篮球秩序册管理系统idea开发mysql数据库web结构计算机java编程layUI框架开发

一、源码特点 idea开发 java servlet 篮球秩序册管理系统是一套完善的web设计系统mysql数据库 系统采用serlvetdaobean mvc 模式开发&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 servlet 篮…

☆【前后缀】【双指针】Leetcode 42. 接雨水

【前后缀】【双指针】Leetcode 42. 接雨水 解法1 前后缀分解解法2 双指针 ---------------&#x1f388;&#x1f388;42. 接雨水 题目链接&#x1f388;&#x1f388;------------------- 解法1 前后缀分解 维护一个前缀&#xff08;左侧最高&#xff09;后缀&#xff08;右侧…

【Linux系统编程(进程编程)】进程的退出:父进程等待子进程的退出之僵尸进程与孤儿进程

文章目录 一、进程退出1.1、进程正常退出方式1.2、异常退出 二、父进程等待子进程退出&#xff08;一&#xff09;2.1、为什么要等待子进程退出2.2、&#xff08;1&#xff09;父进程等待子进程退出并收集子进程的退出状态如何等待wstatus空wstatus非空 2.3、&#xff08;2&…

LeetCode---389周赛

题目列表 3083. 字符串及其反转中是否存在同一子字符串 3084. 统计以给定字符开头和结尾的子字符串总数 3085. 成为 K 特殊字符串需要删除的最少字符数 3086. 拾起 K 个 1 需要的最少行动次数 一、字符串及其反转中是否存在同一子字符串 直接暴力枚举即可&#xff0c;代码…

【PHP + 代码审计】数组函数

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

力扣面试150 x 的平方根 二分 换底法 牛顿迭代法 一题多解

Problem: 69. x 的平方根 思路 &#x1f468;‍&#x1f3eb; 参考题解 &#x1f496; 袖珍计算器算法 class Solution {public int mySqrt(int x){if (x 0)return 0; // Math.exp(3)&#xff1a;e的三次方int ans (int) Math.exp(0.5 * Math.log(x));return (long) (an…

配置环境安装包遇到的问题

1. error: could not install packages due to an oserror: [errno 28] no space left on device 说是磁盘占用过多&#xff0c;查看磁盘占用情况。 df -h 果然占比100% 清理了众多缓存.cache都不行&#xff0c;而且其他利用率很低&#xff0c;可能是pip install的过程中使…

qt 实现 轮播图效果,且还有 手动 上一页和下一页 已解决

QT中有 轮播图的需求&#xff0c;按照正常html版本 。只需要配置数组就能搞定&#xff0c;但是c qt版本 应该用什么了。 第一想到的是采用定时器。 // 定时器初始化{m_pTime new QTimer(this);m_pTime->start(4 * 1000);//启动定时器并设置播放时间间隔m_pAutoFlag true;/…

【python】python turtle绘制坤坤打球

一、效果图&#xff1a; 二、准备工作 &#xff08;1)、导入必要的模块&#xff1a; 代码首先导入了需要使用的模块&#xff1a;requests、lxml和csv。 import requests from lxml import etree import csv 如果出现模块报错 进入控制台输入&#xff1a;建议使用国内镜像源 p…

智慧公厕:跨界融合,打造智慧城市新名片

随着城市化进程的不断加快&#xff0c;公共厕所建设成为一个亟待解决的问题。传统的公厕存在着管理繁琐、卫生差、服务不到位等一系列问题&#xff0c;与城市发展的节奏不协调。为此&#xff0c;推进新型智慧公厕建设成为了一个重要的解决方案。智慧公厕的建设需要推进技术融合…

【论文精读】VIT:vision transformer论文

相关文章 【论文精读】Transformer&#xff1a;Attention Is All You Need 文章目录 相关文章一、文章概览&#xff08;一&#xff09;研究背景&#xff08;二&#xff09;核心思路&#xff08;三&#xff09;相关工作&#xff08;三&#xff09;文章结论 二、模型细节&#x…

【MySQL系列】优化数据库时区设置,确保数据一致性与准确性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

图论基础|深度优先dfs、广度优先bfs

dfs 与 bfs 区别 提到深度优先搜索&#xff08;dfs&#xff09;&#xff0c;就不得不说和广度优先搜索&#xff08;bfs&#xff09;有什么区别 先来了解dfs的过程&#xff0c;很多录友可能对dfs&#xff08;深度优先搜索&#xff09;&#xff0c;bfs&#xff08;广度优先搜索…

鸿蒙Harmony应用开发—ArkTS-@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

上文所述的装饰器仅能观察到第一层的变化&#xff0c;但是在实际应用开发中&#xff0c;应用会根据开发需要&#xff0c;封装自己的数据模型。对于多层嵌套的情况&#xff0c;比如二维数组&#xff0c;或者数组项class&#xff0c;或者class的属性是class&#xff0c;他们的第二…

MySQL--select count(*)、count(1)、count(列名) 的区别你知道吗?

MySQL select count(*)、count(1)、count(列名) 的区别&#xff1f; 这里我们先给出正确结论&#xff1a; count(*)&#xff0c;包含了所有的列&#xff0c;会计算所有的行数&#xff0c;在统计结果时候&#xff0c;不会忽略列值为空的情况。count(1)&#xff0c;忽略所有的列…

AtCoder Beginner Contest 346

A. Adjacent Product(循环) 题意 给出 N N N个数字 A 1 , A 2 , … , A N A_1, A_2, \ldots, A_N A1​,A2​,…,AN​。定义 B i A i A i 1 ( 1 ≤ i ≤ N − 1 ) B_i A_i \times A_{i 1}(1 \le i \le N - 1) Bi​Ai​Ai1​(1≤i≤N−1)。 请你打印 B 1 , B 2 , … , B …

javase day09笔记

第九天课堂笔记 构造方法★★★★ 完成对属性赋值构造方法的名字必须与类名一致没有返回值类型public 类名&#xff08;【参数】&#xff09;{ }构造方法在创建对象时同步执行没写无参构造&#xff0c;系统默认提供写了构造方法&#xff0c;系统不再提供构造方法:重载 引用数…

牛客NC108 最大正方形【中等 动态规划 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/0058c4092cec44c2975e38223f10470e 思路 动态规划: 先初始化第一行和第一列。然后其他单元格依赖自己的上边&#xff0c;左边和左上角参考答案Java import java.util.*;public class Solution {/*** 代码中的类…