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

Three.js 阵列模型教程

阵列模型 ·Array Model· ▶ 在线运行案例

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

你将学到什么

  • 用循环批量创建 Mesh 的基本方法
  • 共享 Geometry/Material的内存优化
  • 1000 个独立 Mesh 的性能隐患与InstancedMesh方向

效果说明

10×10×10 =1000 个红色小立方体排列成三维矩阵。OrbitControls 旋转时可感受规模。

核心概念

for (let i = 0; i < 10; i++)

for (let j = 0; j < 10; j++) for (let k = 0; k < 10; k++) { const mesh = new THREE.Mesh(geometry, material); mesh.position.set(i20, k20, j * 20); scene.add(mesh); }

| 做法 | draw call | 适用 | |------|-----------|------| | 1000 个 Mesh | ~1000 | 入门演示、数量少 | |InstancedMesh| 1 | 大量相同物体(树、草、城市) | | 合并 Geometry | 1 | 静态场景、不再单独控制 |

本案例共享同一个geometrymaterial实例,节省 GPU 内存,但draw call 仍是 1000 次——这是性能瓶颈所在。

实现步骤

  • 创建一个BoxGeometry(5,5,5)MeshBasicMaterial
  • 三重循环创建 Mesh,间距 20
  • OrbitControls + change 事件渲染
  • 代码要点

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

    // 场景 const scene = new THREE.Scene();// 创建场景 const geometry = new THREE.BoxGeometry(5, 5, 5); const material = new THREE.MeshBasicMaterial({ color: 0xff0000 }); //材质 for (let i = 0; i < 10; i++) { for (let j = 0; j < 10; j++) { for (let k = 0; k < 10; k++) { const mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh mesh.position.set(i20, k20, j * 20); scene.add(mesh); //网格模型添加到场景中 } } }

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

    // 相机 const camera = new THREE.PerspectiveCamera(); //相机 camera.position.set(500, 500, 500); //相机位置 camera.lookAt(0, 50, 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.gsyq.cn/news/1629338.html

相关文章:

  • 如何快速掌握DevToysMac:开发者的终极效率提升指南
  • MuleSoft+LLM企业级AI编排实战:打通大模型与核心系统
  • 智能驾驶与自动驾驶的本质区别:责任边界、失效应对与量产可靠性
  • AD5593R与PIC24F16KA102硬件协同设计与优化实践
  • 【仅限首批内测者开放】AI原生开发流程SOP v3.2(含Git提交规范/AI生成代码审计checklist/责任追溯机制)——来自20年技术委员会的强制落地建议
  • 鸿蒙原生 ArkTS 布局深度解析:Swiper 无限循环 —— 首尾无缝衔接的实现与原理
  • 【AI工具组合黄金法则】:20年实战验证的7步工作流重构法,效率提升300%的私密框架
  • ACS CMxa2C00TN8DBNNNNNN0NN交流相驱动电源模块
  • 通往AGI的具身之路——TVA自适应协同进化系统(5)
  • 十堰网红火锅实测测评|科学避坑就餐选型指南
  • 如何免费解锁IDM完整版:简单实用的激活脚本使用教程
  • MuleSoft企业级AI编排:让大语言模型合规、可审计、可运维
  • PX4多旋翼无人机集群协同控制:深入解析分布式算法与通信机制
  • 飞书文档转Markdown终极指南:三步告别文档迁移烦恼
  • 计算机Java毕设实战-基于 SpringBoot 的智慧田园农事服务管理系统的设计与实现 农村田园用地分配与运维管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 3步解锁专业文档排版:Liberation Fonts完全指南 [特殊字符]
  • WebcamJS:HTML5摄像头图像捕捉库的现代化实现方案
  • Path of Building:流放之路角色构建的离线计算解决方案
  • PHP商业项目安全授权与代码保护实战:从机制设计到逆向防护
  • Navicat无限试用终极指南:3种方法彻底解决macOS数据库工具试用期限制
  • Visual Syslog Server:Windows平台最直观的Syslog日志监控终极指南
  • Windows 11终极优化指南:用Win11Debloat让系统更快更干净
  • STM32与TI降压转换器的嵌入式电源系统设计
  • Kimi-K2.5深度集成Qoder:本地化AI编程的可信推理实践
  • FDE是什么?为什么企业级AI 应用落地越来越需要FDE的参与?
  • Boss-Key:Windows窗口管理自动化解决方案与隐私保护实践
  • M24256E与PIC18LF46K40在嵌入式系统中的可靠数据存储设计
  • 基于Si4731与TM4C129EKCPDT的智能收音机系统设计
  • 实用指南:5个关键步骤让老旧Mac电脑免费升级到最新macOS系统
  • 如何快速提升Markdown阅读效率:5个终极技巧与markdownReader工具指南