Three.js入门-相机控制器
概念介绍
在开始前,我们先看一下效果,我在场景中创建了一个立方体,当我们点击鼠标左键并拖动时,可以旋转相机视角,滚动鼠标滚轮可以缩放相机视角。

相信看了动图效果,大家对相机控件有了一个直观的认识。它是 Three.js 中用于控制相机的工具,可以帮助用户在 3D 场景中自由旋转、缩放和*移相机,提供更加友好的交互体验。
在 Three.js 中,相机(Camera)是决定如何渲染场景的关键元素。它是用户从哪个角度看到 3D 场景的“窗口”。相机控制器(Camera Controls)则是允许开发者在场景中动态调整相机视角、位置和缩放的工具。对于大多数 3D 应用程序,尤其是需要交互的应用程序,控制相机的行为是非常重要的一部分。
常见的相机类型:
透视相机(PerspectiveCamera)
这是最常见的相机类型,它模仿了人眼的视觉效果。通过设定视野角度、*剪裁*面和远剪裁*面来决定观察的范围。
正交相机(OrthographicCamera)
不同于透视相机,正交相机的视图没有透视失真,适合需要*行视角的场景,比如 2D 游戏、CAD 或者是某些类型的数据可视化。
常见的相机控件
Three.js 提供了一些非常强大的相机控制器,用于增强用户与 3D 场景的交互。这些控件一般会利用鼠标、触控板等输入设备,允许用户旋转、缩放、*移相机。
2.1 OrbitControls
OrbitControls 是 Three.js 中最常用的相机控件之一。它允许用户绕着一个目标点进行旋转、缩放和拖动,适用于大多数需要相机交互的场景。
用法
- 先在场景中创建一个立方体,作为 OrbitControls 的目标点。
import * as THREE from "three";
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
camera.position.set(0, 0, 5);
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
function render() {
renderer.render(scene, camera);
}
render();

- 接着,我们引入一个坐标系辅助,用于等会操作时更好地观察变化
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);

- 最后,引入相机控制器。相机控制器不能直接通过 Three.OrbitControls()的方式引入,如果你是通过 npm 包管理器安装的 three.js,那么你可以在 node_modules/three/examples/jsm/controls 中找到 OrbitControls.js 文件,然后通过 import 的方式引入。

所以你可以通过以下方式引入 OrbitControls:
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
最后,完整的引入代码如下:
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
// 创建一个控制器
const controls = new OrbitControls(camera, renderer.domElement);
// 更新控件
controls.update();
// 添加事件监听器,在控件变化时重新渲染
controls.addEventListener("change", render);
可以看到,引入一个控制器非常简单,只需要传入相机和渲染器的 dom 元素即可。然后通过 update() 方法更新控件,添加事件监听器,当控件变化时重新渲染。
完整的代码如下:
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
const controls = new OrbitControls(camera, renderer.domElement);
camera.position.set(0, 0, 5);
controls.update();
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);
function render() {
renderer.render(scene, camera);
}
controls.addEventListener("change", render); // add this line to re-render on control changes
render(); // initial render
Three.js学习:https://www.threejs3d.com/
Three.js入门-相机控制器的更多相关文章
- Ember.js入门教程、博文汇总
第一章 对象模型 Ember.js 入门指南——类的定义.初始化.继承 Ember.js 入门指南——类的扩展(reopen) Ember.js 入门指南——计算属性(compute properti ...
- Angular JS入门 (一)事件监听(二)多控制器思想与模块化编程(三)路由router
Angular JS入门 ️将流式结构--->模块化 一.事件监听 1.事件监听 前言 NG框架中通过对元素标签添加[ng-事件名] 指令,来对元素添加事件监听 而事件监听的回调函数需要在con ...
- 《Three.js 入门指南》3.1.2 - 一份整齐的代码结构以及使用ORBIT CONTROLS插件(轨道控制)实现模型控制
3.1.2 正式代码结构 & ORBIT CONTROLS插件(轨道控制) 说明 本节内容属于插入节,<Three.js入门指南>这本书中,只是简单的介绍了一些概念,是一本基础的入 ...
- Three.js入门篇(一)创建一个场景
上一面讲述了向场景中添加物体对象.这一篇准备把每个功能点细细的讲述一遍,一方面是为了加深自己的理解.另一方面希望能够 帮助到有需要的人. 一.在学习WEBGL的时候,你应该先了解要创建一个WebGL程 ...
- 《Three.js 入门指南》3.0 - 代码构建的最基本结构。
3.0 代码构建的最基本结构 说明: 我们必需首先知道,Three.js 的一些入门级概念: 我们需要知道,OpenGL 是一套三维实现的标准,为什么说是标准,因为它是跨平台,跨语言的.甚至CAD以及 ...
- 1. web前端开发分享-css,js入门篇
关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人与人的教育背景与成长环境心理活动都有差别,但就别人的心得再结合自己的特点,然后探索适合自己的学 ...
- React.js入门笔记
# React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...
- JS入门之ActiveXObject对象(转载)
JS入门之ActiveXObject对象 此对象提供自动化对象的接口. function ActiveXObject(ProgID : String [, location : String] ...
- Node.js 入门手册:那些最流行的 Web 开发框架
这篇文章与大家分享最流行的 Node.js Web 开发框架.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编 ...
- 【特别推荐】Node.js 入门教程和学习资源汇总
这篇文章与大家分享一批很有用的 Node.js 入门教程和学习资源.Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...
随机推荐
- MybatisPlus——DML编程控制——增删改
DML编程控制 id生成策略控制 不同的表应用不同的id生成策略 日志:自增(1,2,3,4,......) 购物订单:特殊规则(FQ23948AK3843) 外卖单:关联地区日期等信息(10 04 ...
- 基于DPAPI+RDP技术实现本地打开远程程序,并映射到本地机器桌面上
本教程使用工具所使用的环境说明: 启动器开发工具:VS2022 启动器所用客户端技术:.NET 8 + WPF 启动器其他技术:DPAPI 启动器发布的可执行程序,系统要求:Windows 7以及以上 ...
- 开源的键鼠共享工具「GitHub 热点速览」
十一长假回来,我的手放在落灰的键盘上都有些陌生了,红轴竟敲出了青轴般的响声,仿佛在诉说对假期结束的不甘. 假期回归的首更,让我们看看又有什么好玩的开源项目冲上了开源热榜.一套键盘和鼠标控制多台电脑的工 ...
- [摘录] WebView2 与 JS 交互
https://docs.microsoft.com/zh-cn/microsoft-edge/webview2/gettingstarted/win32 步骤 5-脚本 托管应用还可以将 JavaS ...
- spring上 -基于Xml配置bean笔记
4,Spring 内容 7,快速入门 需求:通过 Spring 的方式[配置文件], 获取 JavaBean: Monster 的对象, 并给该的对象属性赋值, 输出该对象信息. 代码结构: lib ...
- USB协议详解第1讲(核心概念通俗理解)
0.概括 USB协议学习中最重要几个概念如下,没有提及的就是对USB协议学习中不重要的或者编程不需要用到的.大家也不用着急,概念必须要学会,否则都不知道下面这些东西是什么还学什么通用串行总线协议,大家 ...
- Vue的nextTick的原理
知识储备:事件循环有宏任务和微任务,宏任务所处的队列就是宏任务队列,队列可以有多个,第一个队列只有一个任务就是执行主线程的js代码,剩余队列任务有setTimeout setInterval微任务所处 ...
- element设置table某个列的样式
<el-table style="width: 100%;" height="250" :data="tableData" borde ...
- ASP.NET实现网站发布及跨域访问
1.软件下载及安装 visual studio 2012 or 2013 启用电脑IIS配置 2.网页编写及排版 在visual studio中创建web项目添加aspx页面(个人网页:和html差不 ...
- Kubernetes 持久化存储之 NFS 终极实战指南
作者:运维有术星主 在 Kubernetes 生态系统中,持久化存储扮演着至关重要的角色,它是支撑应用稳定运行的基石.对于那些选择自建 Kubernetes 集群的运维架构师而言,选择合适的后端持久化 ...