当前位置: 首页 > 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.jsqmd.com/news/1117353/

相关文章:

  • 实战指南:如何用OpenCore Legacy Patcher让老旧Mac焕发新生,升级到最新macOS系统
  • 智能驾驶与自动驾驶的本质区别:责任边界、失效应对与量产可靠性
  • 显卡驱动装不上一直失败怎么处理?分步排查方法
  • AD5593R与PIC24F16KA102硬件协同设计与优化实践
  • LENA-R8与STM32F427ZI构建全球连接与高精度定位系统
  • 74HC32与PIC18F26K20实现高效键盘管理系统
  • 构建自动化SRC漏洞挖掘平台:Xray与Burp Suite的工程化整合实践
  • 基于Qwen3-32B与OpenClaw的AI驱动接口自动化测试实践
  • DeepChem分子指纹终极指南:ECFP与FCFP如何选择?新手必看!
  • Barrier终极指南:一套键盘鼠标控制多台电脑的完整教程
  • Three.js 顶点颜色教程
  • 【仅限首批内测者开放】AI原生开发流程SOP v3.2(含Git提交规范/AI生成代码审计checklist/责任追溯机制)——来自20年技术委员会的强制落地建议
  • 鸿蒙原生 ArkTS 布局深度解析:Swiper 无限循环 —— 首尾无缝衔接的实现与原理
  • 【AI工具组合黄金法则】:20年实战验证的7步工作流重构法,效率提升300%的私密框架
  • 小红书内容采集神器:XHS-Downloader批量下载工具完全指南
  • 十堰网红火锅实测测评|科学避坑就餐选型指南
  • 通往AGI的具身之路——TVA自适应协同进化系统(5)
  • ACS CMxa2C00TN8DBNNNNNN0NN交流相驱动电源模块
  • Tomcat漏洞复现实战:从原理到加固的完整指南
  • 我用 Rust 写了个 AI 媒体管家:Gliding Horse 赋能 media_agent,目标是让 ComfyUI 工作流彻底自动化
  • 国产编程大模型实测:Kimi、MiniMax、Qwen、GLM五大场景硬核对比
  • 高效D类音频放大系统设计与实现
  • AD74412R与PIC18F26K20在工业自动化中的硬件设计与优化
  • Bullet Constraints Builder:终极Blender建筑坍塌模拟插件完全指南
  • 如何免费解锁IDM完整版:简单实用的激活脚本使用教程
  • PIC18F87K22与DS28EC20的1-Wire EEPROM存储方案
  • 工业4-20mA电流环系统设计与DAC161S997应用解析
  • DBeaver驱动包架构深度解析:构建企业级数据库连接管理解决方案
  • IndexTTS2 WebUI防御CC攻击实战:360网站卫士配置与防护策略详解
  • ChatGPT赋能自媒体创作全链路(含Prompt工程+合规审核+数据归因)——2024唯一经工信部备案验证的合规流程