新闻详情

新闻详情

首页 / 资讯中心 / 详情

【three.js教程】自定义缓冲几何体(Custom BufferGeometry):从零拼出你自己的模型

发布时间:2026/9/1 7:30:11来源:尧图网络
【three.js教程】自定义缓冲几何体(Custom BufferGeometry):从零拼出你自己的模型
Three.js 自定义缓冲几何体Custom BufferGeometry从零拼出你自己的模型原文出处Three.js Manual – Custom BufferGeometry本文基于官方手册 Custom BufferGeometry 章节整理带你理解 three.js 里所有模型的底层——BufferGeometry到底是怎么存数据的。写在前面前面我们用过BoxGeometry、SphereGeometry这些图元直接拿来就能画。但你有没有想过这些形状底层到底是什么答案就是BufferGeometry。可以这么说——three.js 里所有几何体本质上都是BufferGeometry。BufferGeometry说白了就是一组带名字的BufferAttribute缓冲属性的集合。每个BufferAttribute装一种数据position位置、normal法线、color颜色、uv贴图坐标……它们是一组平行数组——第 N 个属性里的第 N 份数据属于同一个顶点。理解这一点你就能自己造任何形状了。一、一个顶点 它所有零件的合集先记住一句关键的话一个顶点是它全部数据的组合。只要某一块数据不一样它就必须是另一个顶点。举个最经典的例子——立方体的一个角。视觉上 3 个面共用同一个角点但实际上不行这个角在 3 个面上每个面朝向不同所以法线normal必须不一样每个面贴的纹理位置不同所以UV 坐标也必须不一样。既然法线和 UV 都不同那这三个角就是三个不同的顶点不能共享。这也是为什么一个看似 8 个角的立方体真正需要36 个顶点——每个面 2 个三角形 × 3 个顶点 × 6 个面 36。二、第一步把顶点数据列出来我们手动把立方体的 36 个顶点全写出来每个含pos、norm、uvconstvertices[// front{pos:[-1,-1,1],norm:[0,0,1],uv:[0,0],},{pos:[1,-1,1],norm:[0,0,1],uv:[1,0],},{pos:[-1,1,1],norm:[0,0,1],uv:[0,1],},{pos:[-1,1,1],norm:[0,0,1],uv:[0,1],},{pos:[1,-1,1],norm:[0,0,1],uv:[1,0],},{pos:[1,1,1],norm:[0,0,1],uv:[1,1],},// right省略其余面结构一样...];三、第二步拆成平行数组把上面这份对象数组拆成 three.js 要的纯数字平行数组constpositions[];constnormals[];constuvs[];for(constvertexofvertices){positions.push(...vertex.pos);normals.push(...vertex.norm);uvs.push(...vertex.uv);}四、第三步塞进 BufferGeometry创建几何体把每个数组包成BufferAttribute加进去constgeometrynewTHREE.BufferGeometry();constpositionNumComponents3;// 每个顶点 3 个分量x, y, zconstnormalNumComponents3;constuvNumComponents2;// uv 只有 2 个u, vgeometry.setAttribute(position,newTHREE.BufferAttribute(newFloat32Array(positions),positionNumComponents));geometry.setAttribute(normal,newTHREE.BufferAttribute(newFloat32Array(normals),normalNumComponents));geometry.setAttribute(uv,newTHREE.BufferAttribute(newFloat32Array(uvs),uvNumComponents));⚠️两个坑名字不能乱起。position、normal、uv是 three.js 约定好的名字想要顶点色就用color。除非你自己写着色器否则名字必须对应。BufferAttribute只认 TypedArray不认原生数组。所以这里用new Float32Array(...)包了一层。它还要求你告诉它每个顶点几个分量——位置/法线是 3UV 是 2。五、进阶用索引省顶点上面 36 个顶点里有不少是重复的——每个面的 2 个三角形共 6 个顶点其中有 2 个完全相同位置、法线、UV 一模一样。把这些重复的提出来立方体其实只需24 个不重复顶点。做法是保留 24 个顶点再用一个索引数组告诉 GPU “三角形该按什么顺序画这 24 个顶点”geometry.setIndex([0,1,2,2,1,3,// front4,5,6,6,5,7,// right8,9,10,10,9,11,// back12,13,14,14,13,15,// left16,17,18,18,17,19,// top20,21,22,22,21,23,// bottom]);索引就是顶点的身份证号GPU 按这个顺序拼三角形。24 个顶点 36 个索引照样画出 12 个三角形但数据量小了不少。六、一个隐藏的坑computeVertexNormals 会留缝如果你懒得写法线可以用geometry.computeVertexNormals()让 three.js 自动算。但前面说了只要顶点有任何一块不一样就不能共享。球体、圆柱这种首尾相接的形状接缝处的两个顶点因为 UV 不同而无法共享自动算法就不知道它们该平滑过渡——于是圆柱上会多出一条明显的接缝seam。解决办法自己提供法线别偷这个懒。七、直接用 TypedArray 起步 动态更新原生数组方便push但如果你想频繁改顶点最好一开始就上Float32ArrayTypedArray 没有push得自己记账constnumVerticesvertices.length;constpositionsnewFloat32Array(numVertices*3);letposNdx0;for(constvertexofvertices){positions.set(vertex.pos,posNdx);posNdx3;}动态更新的精髓是这两行constpositionAttributenewTHREE.BufferAttribute(positions,3);positionAttribute.setUsage(THREE.DynamicDrawUsage);// 告诉 three.js这属性我会常改// ...渲染循环里改完 positions 后positionAttribute.needsUpdatetrue;// 必须标记否则改了也白改官方还用这个思路做了个例子生成一个球每帧让每个小方格沿法线方向进进出出地呼吸也就是靠needsUpdate true把新位置实时喂给 GPU。总结概念一句话说明BufferGeometry一组带名字的 BufferAttribute平行数组一个顶点位置法线UV颜色 的全组合任一处不同 不同顶点立方体顶点数36不共享或 24 索引共享setAttribute名字要对position/normal/uv值要 TypedArraysetIndex用索引复用顶点省数据动态更新setUsage(DynamicDrawUsage)needsUpdate true什么时候自己写 BufferGeometry当现成图元满足不了你自定义地形、动态网格、粒子、程序化生成的形状时它就是你的底层武器。延伸阅读BufferGeometry APIBufferAttribute APIPrimitives现成图元
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

gh-aw身份认证指南:PAT、GitHub App、OIDC三种方式怎么选 2026/9/1 9:00:43

gh-aw身份认证指南:PAT、GitHub App、OIDC三种方式怎么选

gh-aw身份认证指南:PAT、GitHub App、OIDC三种方式怎么选 【免费下载链接】gh-aw GitHub Agentic Workflows 项目地址: https://gitcode.com/GitHub_Trending/gha/gh-aw gh-aw(GitHub Agentic Workflows)身份认证是新手最容易卡住的一…

阅读更多 →
合成孔径雷达仿真入门:从回波生成到成像算法实践 2026/9/1 9:00:43

合成孔径雷达仿真入门:从回波生成到成像算法实践

简介:合成孔径雷达(SAR)仿真学习包围绕SAR成像原理与仿真实现展开,面向遥感、雷达信号处理方向的初学者和研究人员,帮助理解SAR高分辨率成像机制及参数影响。资源共10个文件,包含RAR压缩包、PPT课件、TXT说…

阅读更多 →
AI生成节点大样写实化:从提示词设计到批量出图全流程拆解 2026/9/1 9:00:43

AI生成节点大样写实化:从提示词设计到批量出图全流程拆解

做建筑设计、结构设计、幕墙深化或者室内深化的人,基本都画过节点大样。节点大样是施工图里最“见功夫”的部分:一个复杂的连接位置,要用剖面、详图、标注和材料说明把构造关系讲清楚。以前这套工作流离不开CAD、SketchUp、Revit这些工具&…

阅读更多 →
Openship生产环境最佳实践:自托管上线前必查清单 2026/9/1 9:00:43

Openship生产环境最佳实践:自托管上线前必查清单

Openship生产环境最佳实践:自托管上线前必查清单 【免费下载链接】openship Self-hosted deployment platform 项目地址: https://gitcode.com/GitHub_Trending/ope/openship Openship 是一个开源的自托管部署平台(Self-hosted deployment platfo…

阅读更多 →
用有限状态机消除代码里的布尔标志位地狱 2026/9/1 9:00:43

用有限状态机消除代码里的布尔标志位地狱

“有的时候感觉手雷的人全是二极管”——第一次看到这句话,我第一反应是打字漏了个“踩”字。仔细想想,“踩雷的人”在别人眼里确实容易有“二极管”既视感:一个问题爆发后,有人直接说产品需求是垃圾,有人直接说程序员…

阅读更多 →
LLM、RAG、MCP、Agent:AI应用开发四层架构与实战落地 2026/9/1 8:57:42

LLM、RAG、MCP、Agent:AI应用开发四层架构与实战落地

简介:围绕LLM、MCP、RAG与Agent四者关系解析的项目代码包,是一份适合AI初学者、技术编辑及软件开发者使用的轻量可视化资料,用于厘清大模型应用系统中的组件边界与协作方式,直观理解各层能力的定位。压缩包共3个文件,以…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞