当前位置: 首页 > news >正文

Three.js 相机控件教程

相机控件 ·OrbitControls· ▶ 在线运行案例

  • 案例合集:三维可视化功能案例(threehub.cn)
  • 开源仓库github地址:https://github.com/z2586300277/three-cesium-examples
  • 400个案例代码:网盘链接

你将学到什么

  • OrbitControls的基本用法与事件监听
  • 手动渲染模式vs动画循环渲染
  • 阻尼enableDamping的配置要点

效果说明

鼠标左键旋转、滚轮缩放、右键平移,围绕场景中心轨道式观察立方体。本案例在change事件里按需渲染,而非持续 rAF。

核心概念

import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';

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

| 操作 | 默认按键 | |------|---------| | 旋转 | 左键拖拽 | | 缩放 | 滚轮 | | 平移 | 右键拖拽 |

两种渲染策略

1. 按需渲染(本案例)
controls.addEventListener('change', () => {

renderer.render(scene, camera); }); // 静止时不消耗 GPU

2. 动画循环(推荐配合阻尼)
controls.enableDamping = true;

function animate() { requestAnimationFrame(animate); controls.update(); // 阻尼必须每帧 update renderer.render(scene, camera); }

实现步骤

  • 创建受光场景(Lambert + DirectionalLight + Helper)
  • 初始化 OrbitControls
  • 监听changerender
  • 代码要点

    import * as THREE from 'three'; import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'

    // 场景 const scene = new THREE.Scene();// 创建场景 const geometry = new THREE.BoxGeometry(10, 60, 100); //几何体 const material = new THREE.MeshLambertMaterial(); //材质 const mesh = new THREE.Mesh(geometry, material); //网格模型 mesh.position.set(0, 10, 0); //网格模型位置 scene.add(mesh); //场景添加网格模型

    // AxesHelper const axesHelper = new THREE.AxesHelper(150); scene.add(axesHelper);

    // 光源 const pointLight = new THREE.DirectionalLight(0xff00ff, 1.0); //颜色、强度 pointLight.position.set(200, 300, 400); //位置 scene.add(pointLight); //点光源添加到场景中

    // 光源参考线 const dirLightHelper = new THREE.DirectionalLightHelper(pointLight, 5, 0xff0000); scene.add(dirLightHelper);

    // 相机 const camera = new THREE.PerspectiveCamera(); //相机 camera.position.set(200, 200, 200); //相机位置 camera.lookAt(0, 10, 0); //相机观察位置

    // 渲染器 const renderer = new THREE.WebGLRenderer(); // 创建渲染器 const box = document.getElementById('box'); renderer.setSize(box.clientWidth, box.clientHeight); //渲染区域 renderer.render(scene, camera); //执行渲染 box.appendChild(renderer.domElement);

    // 设置相机控件轨道控制器OrbitControls const controls = new OrbitControls(camera, renderer.domElement); // 如果OrbitControls改变了相机参数,重新调用渲染器渲染三维场景 controls.addEventListener('change', function () { renderer.render(scene, camera); //执行渲染操作 console.log(camera.position) });//监听鼠标、键盘事件

    完整源码:GitHub

    小结

    • 本文提供相机控件完整 Three.js 源码与在线 Demo,建议先运行案例再改 uniform/参数做二次实验
    • 更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库
http://www.jsqmd.com/news/1116630/

相关文章:

  • 【安全工具】Web漏洞扫描十大工具(非常详细),零基础入门到精通,看这一篇就够了
  • 大模型API Keys中DeepSeek技巧升级
  • # Java Web开发入门指南:IDEA+Tomcat环境搭建与项目部署
  • 2026年AI求职工具选型指南:简历优化×JD匹配×面试提词,一套全链路打法拆解
  • 留学生与新移民求职场景细分,yeeyi招聘板块提供岗位信息参考
  • 5分钟搞定:告别输入法切换烦恼的终极解决方案
  • KAB三甲平台:产品理解成本与工具可用性如何影响体验,给出一套视角
  • LikeShop 商用项目稳定性保障体系:全维度运维策略与故障兜底实践
  • kill-doc:打破文档下载壁垒,让你的学习资料触手可及
  • 【小白也能轻松玩转龙虾】虾壳云一键部署单机模式,不依靠服务器部署 OpenClaw v2.7.9(附最新安装包)
  • 很多人失业后恐惧社交的庖丁解牛
  • 终极可变刷新率测试指南:如何用VRRTest解锁显示器隐藏性能
  • Claude Desktop 安装指南(macOS / Windows / ChromeOS)
  • linux文件目录命令
  • 电脑桌面文件太多太乱如何彻底整理不反弹?分类、迁移固定目录、保存规则三步流程
  • 项目总览与架构地图
  • AI辅助专利撰写:30分钟构建可授权级技术方案的工程化流程
  • 【实用工具】Linux好用的截图工具
  • TwitchNoSub:5分钟快速解锁Twitch订阅限制的终极指南
  • 多维测评:迷你主机和Macmini怎么选看完就懂
  • Java毕设选题推荐:乡村农耕用地信息化管理系统的设计与实现 智慧乡村田园资源综合管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 洛雪音乐音源:打破平台壁垒的全网音乐聚合解决方案
  • Python从入门到实战(二):数据类型与运算符
  • 每天一课:算法系统学习路线
  • 【AI大模型】学习路线:从零基础到落地的完整成长路径
  • MP8859与PIC18F4585构建可编程DC-DC降压电源系统
  • 终极免费原神辅助工具Akebi-GC完整使用指南:如何安全提升游戏体验
  • BarTender支持的数据库类型有哪些?
  • Java毕业设计-基于 SpringBoot 的乐享田园用地管理系统的设计与实现 乡村田园地块租赁管理系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 电商订单追踪应用遭滥用引发回拨钓鱼攻击研究