news 2026/6/22 9:07:21

Threejs的InstancedMesh

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Threejs的InstancedMesh

InstancedMesh是 Three.js 中用于高效渲染大量相同几何体和材质的对象的核心类。它通过单次绘制调用(Draw Call)完成所有实例的渲染,大幅提升性能。

一、核心概念与创建

const mesh = new THREE.InstancedMesh(geometry, material, count);
  • geometry:共享的几何体(BufferGeometry类型)。
  • material:共享的材质(Material类型)。
  • count:实例的最大数量(创建后不可修改)。

二、设置实例属性

1.位置与旋转(通过矩阵控制)

const matrix = new THREE.Matrix4(); // 创建一个4x4变换矩阵 const position = new THREE.Vector3(1, 0, 0); // 实例的位置 const quaternion = new THREE.Quaternion(); // 旋转四元数 const scale = new THREE.Vector3(1, 1, 1); // 缩放 matrix.compose(position, quaternion, scale); // 组合变换 mesh.setMatrixAt(index, matrix); // 应用到第 index 个实例 mesh.instanceMatrix.needsUpdate = true; // 必须更新标记!
2.设置颜色
const color = new THREE.Color(0xff0000); // 红色 mesh.setColorAt(index, color); // 设置第 index 个实例颜色 mesh.instanceColor.needsUpdate = true; // 必须更新标记!
  • 需启用顶点着色器中的颜色插值(材质属性vertexColors: true)。

三、完整示例代码

// 1. 创建几何体与材质 const geometry = new THREE.IcosahedronGeometry(0.5, 5); // 二十面体 const material = new THREE.MeshPhongMaterial({ color: 0xffffff, vertexColors: true // 允许实例化颜色 }); // 2. 创建1000个实例 const count = 1000; const instancedMesh = new THREE.InstancedMesh(geometry, material, count); // 3. 为每个实例设置位置和颜色 const matrix = new THREE.Matrix4(); const color = new THREE.Color(); for (let i = 0; i < count; i++) { // 位置随机偏移 matrix.setPosition( Math.random() * 10 - 5, Math.random() * 10 - 5, Math.random() * 10 - 5 ); instancedMesh.setMatrixAt(i, matrix); // 颜色随机 color.setHex(Math.random() * 0xffffff); instancedMesh.setColorAt(i, color); } // 4. 标记属性更新 instancedMesh.instanceMatrix.needsUpdate = true; instancedMesh.instanceColor.needsUpdate = true; // 5. 添加到场景 scene.add(instancedMesh);

四、关键注意事项

  1. 性能优化

    • 避免在动画循环中频繁更新矩阵或颜色,仅在初始化或变化时更新。
    • 超过千级数量时性能优势显著,少量对象无需使用。
  2. 限制

    • 所有实例共享同一几何体和材质,无法单独修改。
    • 创建后count不可更改(需重新创建实例化网格)。
  3. 常见错误

    • 忘记设置needsUpdate = true(矩阵/颜色不会生效)。
    • 未启用材质的vertexColors导致颜色失效。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/21 22:55:16

ORACLE学习笔记总结(数据库常见错误及应对措施)

一、语句失败&#xff08;Statement Failure&#xff09;定义SQL语句因语法错误、权限不足或资源限制而无法正常执行&#xff0c;是最轻微的故障类型。常见场景语法错误&#xff1a;SELEC * FROM emp;&#xff08;拼写错误&#xff09;权限不足&#xff1a;普通用户执行DROP TA…

作者头像 李华
网站建设 2026/6/22 15:16:19

ThinkPad双风扇终极静音指南:TPFanCtrl2完整配置与优化

ThinkPad双风扇终极静音指南&#xff1a;TPFanCtrl2完整配置与优化 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 还在为ThinkPad笔记本的持续风扇噪音而烦恼吗&#…

作者头像 李华
网站建设 2026/6/22 9:33:44

VS Code远程连接树莓派超详细教程(图文)

目录 一、前置准备&#xff1a;两端环境配置 1.1 树莓派端配置&#xff08;关键步骤&#xff09; ① 确保树莓派联网 ② 开启SSH服务&#xff08;必须&#xff09; ③ 获取树莓派IP地址 ④ 确认用户名/密码 1.2 电脑端配置 ① 安装VS Code ② 安装Remote - SSH插件和p…

作者头像 李华
网站建设 2026/6/22 14:57:42

合理使用useEffect,避免不必要的副作用

在 React 中&#xff0c;useEffect 是一个常用的钩子&#xff0c;用于处理副作用&#xff08;例如数据获取、订阅等&#xff09;。但是&#xff0c;如果 依赖数组 配置不当&#xff0c;会导致以下问题&#xff1a;副作用重复执行&#xff1a;依赖数组过大或配置错误时&#xff…

作者头像 李华
网站建设 2026/6/22 15:08:05

mysql - 1

构建MySQL服务器步骤一//安装提供服务和命令软件[rootmysql50 ~]# yum -y install mysql-server mysql软件已安装[rootmysql50 ~]# rpm -q mysql-server mysqlmysql-server-8.0.26-1.moduleel8.4.06526de068a7.x86_64mysql-8.0.26-1.moduleel8.4.06526de068a7.x86_64[rootmysql…

作者头像 李华