Three.js学习4:添加轨道控制器

一、轨道控制器

拍摄画面的时候,为了保持镜头的稳定,并且能从多方位拍摄画面,往往会用到轨道(Orbit)

轨道控制器(Orbit controls)可以使得相机围绕目标进行轨道运动。

在 Three.js 里,轨道控制器可以通过鼠标左右键、鼠标滚动控制画面的上下左右旋转、移动、缩放,可以从多个角度观测目标物体。其效果类似 Three.js 提供的官方编辑器一样。

官方编辑器允许用鼠标左右键控制画面的旋转和移动。

http://localhost:9000/editor/

二、导入轨道控制器组件

轨道控制器(Orbit controls) 是一个附加组件,必须显式导入。

1. 拷贝附加组件文件

Three.js附加组件,包括轨道控制器、模型加载器等,都是放在 example/jsm 文件夹下的。因此,首先要把 jsm 文件夹的东西都拷贝到项目文件夹中。

我这里是拷贝到 js 目录下。

吐槽下:害的我找了好久,半天不知道怎么导入。

2. 页面添加 importmap 代码

<script type="importmap">{"imports": {"three" : "./js/three.module.min.js","three/addons/": "./js/jsm/"}}
</script>

 来自 MDN:

导入映射(import map)是一个 JSON 对象,其允许开发者在导入 JavaScript 模块时,控制浏览器如何解析模块标识符。它提供了在 import 语句或 import() 运算符 (en-US)中用作模块标识符的文本,其会在解析标识符时与要替换的文本之间建立映射。JSON 对象必须符合导入映射 JSON 表示格式

一般我们在项目中导入模块,会调用require方法,或者使用import语句。导入的模块通常使用 npm 之类的包管理器进行管理。

但是,如果不用 npm 怎么管理模块?

import map就提供了一种支持,让我们可以直接在页面上管理模块,不需要通过 npm 之类的工具。

在我们的 JS 文件里添加轨道控制器附加组件导入代码。

import  * as THREE  from "three";
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

 注意映射的对应关系:

三、轨道控制器对象

const controls = new OrbitControls( camera, renderer.domElement );

两个参数:

  • 相机对象:(必须)将要被控制的相机。该相机不允许是其他任何对象的子级,除非该对象是场景自身。

  • domElement: 用于事件监听的HTML元素。一般用渲染器DOM对象,也就是 canvas 标签。

更多的内容翻看官方文档,这里只罗列感觉常用的。

1. 常用属性

controls.enableDamping = true;  // 启用阻尼效果。必须应用动画。
controls.dampingFactor = 0.01;  // 设置阻尼值
controls.autoRotate = true;     // 自动旋转。必须应用动画。
controls.autoRotateSpeed = 1;   // 自动旋转速度controls.minDistance = 5;   // 相机移动位置。用于透视相机 PerspectiveCamera
controls.maxDistance = 20;controls.minZoom = 0.5;    // 最小、放大缩放比例。用于正交相机 OrthographicCamera
controls.maxZoom = 2;   

2. 启用键盘控制

// 增加了键盘控制
// 当使用键盘按键的时候,相机平移的速度有多快。默认值为每次按下按键时平移7像素。
controls.keyPanSpeed = 7
// 这一对象包含了用于控制相机平移的按键代码的引用。默认值为4个箭头(方向)键。
controls.keys = {LEFT: 'ArrowLeft', //left arrowUP: 'ArrowUp', // up arrowRIGHT: 'ArrowRight', // right arrowBOTTOM: 'ArrowDown' // down arrow
}// 添加键盘事件监听。只有添加了键盘事件监听,上下左右键才能控制轨道
controls.listenToKeyEvents( window );controls.stopListenToKeyEvents();  // 取消键盘事件监听

3. 动画更新

// 更新控制器。必须在摄像机的变换发生任何手动改变后调用
// 或如果.autoRotate或.enableDamping被设置时,在update循环里调用。
controls.update();function animateFun(){controls.update();   // 现在动画里更新控制器// 渲染renderer.render( scene, camera);requestAnimationFrame(animateFun);
}
animateFun()

4. 事件

  • change:当摄像机被组件改变时触发。

  • start:初始化交互时触发。

  • end:当交互结束时触发。

// 添加 change 事件
controls.addEventListener("change",function(){console.info("change");
});

四、完整代码

在本人博文 Three.js学习3:第一个Three.js页面-CSDN博客 的基础上,修改代码。

HTML:

<!-- importmap 必须有 -->
<script type="importmap">{"imports": {"three" : "./js/three.module.min.js","three/addons/": "./js/jsm/"}}
</script>
<script src="js/myjs.js" type="module"></script>

JS:

import  * as THREE  from "three";
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
// 场景
const scene = new THREE.Scene();
scene.background = new THREE.Color( 0xEEEEEE);  // 设置场景背景色// 物体:包含几何形 geometry 和 材质(皮肤) meterial 两部分
const geometry = new THREE.BoxGeometry(1,1,1);  // 立方体
const meterial = new THREE.MeshBasicMaterial({  color: "#ff0000"
});
const mesh = new THREE.Mesh( geometry, meterial);
scene.add( mesh );              // 添加物体到场景中// 相机
const camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 100);
camera.position.set(0,0,10);    // 修改相机位置
camera.lookAt( mesh.position ); // 相机镜头盯着物体
scene.add( camera );            // 添加相机到场景中// 添加网格线
const grid = new THREE.GridHelper( 10, 10 );
scene.add( grid );// 渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );   // 设置渲染器(canvas标签)大小
document.body.appendChild( renderer.domElement );            // 添加渲染器(canvas标签)到页面中// 轨道控制器
const controls = new OrbitControls( camera, renderer.domElement );
controls.enableDamping = true;  // 启用阻尼效果。必须应用动画。
controls.dampingFactor = 0.01;  // 设置阻尼值
controls.autoRotate = true;     // 自动旋转。必须应用动画。
controls.autoRotateSpeed = 1;   // 自动旋转速度controls.minDistance = 5;   // 最小,最大缩放比例。用于透视相机 PerspectiveCamera
controls.maxDistance = 20;// 添加键盘事件监听。键盘按下的速度和按键,采用默认值。只有添加了键盘事件监听,上下左右键才能控制轨道
controls.listenToKeyEvents( window );// 更新控制器
controls.update();function animateFun(){mesh.rotation.x += 0.01;mesh.rotation.y += 0.01;controls.update();   // 现在动画里更新控制器// 渲染renderer.render( scene, camera);requestAnimationFrame(animateFun);
}
animateFun();

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

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

相关文章

python_蓝桥杯刷题记录_笔记_全AC代码_入门2

前言 现在正式进入蓝桥杯的刷题啦&#xff0c;用python来做算法题&#xff0c;因为我之前其实都是用C来做题的&#xff0c;但是今年的话我打算换python来试试&#xff0c;很明显因为也才这学期接触python 加上之前C做题也比较菜&#xff0c;所以我打算用python重新来做题&#…

[Vulnhub靶机] DriftingBlues: 1

[Vulnhub靶机] DriftingBlues: 1靶机渗透思路及方法&#xff08;个人分享&#xff09; 靶机下载地址&#xff1a; https://download.vulnhub.com/driftingblues/driftingblues.ova 靶机地址&#xff1a;192.168.67.20 攻击机地址&#xff1a;192.168.67.3 一、信息收集 1.使…

【2024年美国大学生数学建模竞赛E题】O奖得主完整解析(可直接用)!

【2024美赛E题】O奖大佬解题思路分析&#xff01; 目前已经更新E题的完整解题&#xff0c;包括数据、代码、结果与论文 加群可以获得完整解析&#xff0c;或者搜索B站&#xff1a;云顶数模。 联络组织企鹅&#xff1a;2024年美赛交流 以下是E题老师的参考论文。 1、问题重述…

职教云搜题神器找答案?学生党都在用的5款搜题工具来了 #其他#媒体#笔记

可以说是搜题软件里面题库较为齐全的一个了&#xff0c;收录国内高校常见的计算机类、资格类、学历类、外语类、工程类、建筑类等多种类型的题目。它可以拍照解题、拍照答疑、智能解题&#xff0c;并支持每日一练、章节练习、错题重做等特色功能&#xff0c;在帮助大家解答疑惑…

java大学生科研创新项目在线管理系统 springboot+vue

预期成果&#xff1a; &#xff08;1&#xff09;实现一个完整的大学生科创项目在线管理系统的设计与实现&#xff0c;可以运行演示。 &#xff08;2&#xff09;预计本系统的页面完整&#xff0c;页面所有文字和图片无漏字、错字、重叠不显示的现象&#xff0c;页面所有链接和…

嵌入式中VMware 三种网络模式的详解与配置方法

今天梳理下 VMware虚拟机的三种网络工作模式。 相信通过这两篇文章&#xff0c;能够帮助你全面搞懂虚拟机的网络工作模式和配置。 VMware的三种网络工作模式 vmware为我们提供了三种网络工作模式, 它们分别是: Bridged&#xff08;桥接模式&#xff09;、NAT&#xff08;网…

以太网帧格式及ARP协议简介

在以太网中&#xff0c;一个主机和另一个主机进行通信&#xff0c;必须要知道目的主机的MAC地址&#xff08;物理地址&#xff09;&#xff0c;只要知道目的主机的IP地址&#xff0c;就可以通过ARP协议获取目的主机的MAC地址。 1、ARP协议简介 ARP&#xff08;Address Resolut…

Unity项目从built-in升级到URP(包含早期版本和2023版本)

unity不同版本的升级URP的方式不一样&#xff0c;但是大体流程是相似的 首先是加载URP包 Windows -> package manager,在unity registry中找到Universal RP 2023版本&#xff1a; 更早的版本&#xff1a; 创建URP资源和渲染器​​ 有些版本在加载时会自动创建&#…

高级FPGA开发之基础协议PCIe

基础协议之PCIe部分 一、TLP包的包头 在PCIe的系统中&#xff0c;tlp包的包头的结构有许多部分是相似的&#xff0c;通过掌握这些常规的包头&#xff0c;能帮助理解在PCIe总线上各个设备之间如何进行数据的收发。 通用的字段 通用字段作用Fmt决定了包头是3DW还是3DW&#xff…

Python tkinter (14) —— 按键事件

本文主要介绍Python tkinter 几种按键事件及其示例。 目录 按键事件 响应所有按键事件 窗体绑定事件 响应特殊按键事件 指定按键事件 组合按键事件 总结 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— But…

【Python】【完整代码】解析Excel文件内容,按每列首行元素名打印出某个字符串的统计占比(超详细)

目录 1.示例&#xff1a; 1.1 实现代码1&#xff1a;列数为常量 运行结果&#xff1a; 1.2 实现代码2&#xff1a;列数为变量 运行结果&#xff1a; 1.示例&#xff1a; 开发需求&#xff1a;读取Excel文件&#xff0c;统计第3列到第5列中每列的"False"字段占…

Linux第41步_移植ST公司uboot的第2步_修改网络驱动_USB OTG设备树_LCD驱动_以及编译和烧写测试

移植ST公司uboot的第1步&#xff0c;创建配置文件、设备树、修改电源管理和sdmmc节点后&#xff0c;还需要进一部修改&#xff0c;如&#xff1a;网络驱动、USB OTG设备树、LCD驱动&#xff0c;以及编译和烧写测试。 一、在虚拟机中&#xff0c;使用VSCode打开my_uboot工作区 …