96SEO 2026-02-19 11:42 4
href="https://www.cnblogs.com/ljbguanli/p/19623452"

aria-level="2">实用指南:学习Three.js--缓冲类型几何体(BufferGeometry)
xmlns="http://www.w3.org/2000/svg"> style="-webkit-tap-highlight-color: 0)">d="M5,0
rgba(0,
id="_2">前置核心说明
BufferGeometry
中所有几何体的底层核心(BoxGeometry/SphereGeometry
等预设几何体均基于它构建),也是官方唯一推荐使用的几何体类型(旧版
BufferGeometry)
| 类型 | 核心特点 | 性能 | 官方态度 |
|---|---|---|---|
| BufferGeometry(缓冲几何体) | 顶点数据存储在「类型化数组」(Float32Array等)中,直接对接直接读取,无数据转换) | 主推,唯一维护 | |
| Geometry(旧版几何体) | 顶点数据存储在普通数组中,需转换后才能给GPU使用 | 较低(多一层数据转换) | 废弃,不再维护 |
id="_12">核心逻辑
BufferGeometry
本身是「空容器」,没有任何预设形状,你需要通过定义顶点数据(坐标、颜色、纹理坐标等)来「自定义任意几何形状」,核心是:类型化数组(顶点数据)→
渲染对象(Mesh/Line/Points)
核心术语解释
三个坐标值组成,是构成几何体的最基本单元;
Float32Array(32位浮点数组),专门用于存储顶点数据,比普通数组更节省内存、GPU
读取更快;
「数组中的数据如何分组解析」(比如每3个值为一组表示一个顶点坐标);
position(顶点坐标)、color(顶点颜色)、uv(纹理坐标)、normal(法线)等,一个几何体可绑定多个属性。
基础使用流程
以下是从「创建空几何体」到「渲染自定义形状」的完整流程
id="1_BufferGeometry__28">步骤1:创建空的
punctuation">.BufferGeometry punctuation">;class="token
id="2_34">
步骤2:定义顶点数据(类型化数组)顶点数据必须用
类型化数组(不能用普通数组),常用:
Float32Array:存储浮点型数据(坐标、颜色、UV等,最常用);
Uint16Array:存储无符号16位整数(索引数据)。顶点坐标数据:每3个值为一组(X,Y,Z),表示一个顶点的3D坐标
class-name">Float32Array
class="token
punctuation">;
id="3_BufferAttribute_52">
步骤3:创建punctuation">.BufferAttribute punctuation">( punctuation">;class="token
class="token
| BufferAttribute 参数 | 类型 | 默认值 | 核心说明 |
|---|---|---|---|
array | TypedArray | — | 必传,存储顶点数据的类型化数组 |
itemSize | Number | — | 必传,每组的元素数量(坐标=3,颜色=3/4,UV=2) |
normalized | Boolean | false | 是否归一化数据(颜色数据常用,将0-255转为0-1) |
usage | Number | THREE.StaticDrawUsage | 数据使用方式(静态/动态,默认静态即可) |
id="4_65">
步骤4:将属性绑定到几何体"position"(坐标)、"color"(颜色)、"uv"(纹理)
geometry
function">setAttribute
class="token
punctuation">;
id="5_72">
步骤5:创建材质和渲染对象punctuation">.MeshBasicMaterial
class="token
property">wireframe
class="token
是否显示线框(true=线框,false=实体)
punctuation">.
DoubleSide
punctuation">.
Meshclass="token
punctuation">(
geometryclass="token
punctuation">;
punctuation">.BufferGeometry punctuation">;class="token
核心属性
| 属性名 | 类型 | 说明 | 示例 |
|---|---|---|---|
attributes | Object | 存储所有绑定的属性(position/color/uv 等) | geometry.attributes.position获取坐标属性 |
index | BufferAttribute | 索引缓冲区(优化顶点重复,下文详解) | geometry.setIndex(索引数组) |
boundingBox | Box3 | 几何体的包围盒(自动计算,用于碰撞检测/裁剪) | geometry.computeBoundingBox()计算包围盒 |
boundingSphere | Sphere | 几何体的包围球 | geometry.computeBoundingSphere() |
drawRange | Object | 渲染范围(只渲染部分顶点) | geometry.drawRange |
核心方法
| 方法名 | 说明 | 示例 |
|---|---|---|
setAttribute(name, | 绑定属性到几何体 | geometry.setAttribute('position', |
getAttribute(name) | 获取已绑定的属性 | geometry.getAttribute('position') |
removeAttribute(name) | 移除属性 | geometry.removeAttribute('color') |
setIndex(array) | 设置索引缓冲区 | geometry.setIndex(new |
computeBoundingBox() | 计算几何体包围盒 | geometry.computeBoundingBox() |
computeBoundingSphere() | 计算几何体包围球 | geometry.computeBoundingSphere() |
computeVertexNormals() | 计算顶点法线(让光照生效) | geometry.computeVertexNormals() |
dispose() | 销毁几何体(释放内存) | geometry.dispose() |
索引缓冲区(Index):减少顶点重复
绘制一个矩形(由两个三角面组成),直接定义顶点需要6个(重复2个):(0,0,0)、(1,0,0)、(0,1,0)、(1,0,0)、(1,1,0)、(0,1,0)
id="_128">索引解决方案
6个索引(指定三角面的顶点顺序),节省内存:
punctuation">.BufferGeometry
class="token
class-name">Float32Array
class="token
punctuation">.
BufferAttributeclass="token
punctuation">(
verticesclass="token
function">setAttribute
class="token
步骤3:定义索引(每3个值为一组,指定三角面的顶点索引)
第一个三角面:顶点0→1→2;第二个三角面:顶点1→3→2
class-name">Uint16Array
class="token
punctuation">.
BufferAttributeclass="token
punctuation">(
indicesclass="token
punctuation">.
MeshBasicMaterialclass="token
punctuation">.
DoubleSide
punctuation">.
Meshclass="token
punctuation">(
geometryclass="token
punctuation">;
Attribute):每个顶点自定义颜色
id="_163">
核心逻辑给几何体绑定
colortrue,即可让每个顶点显示自定义颜色,三角面内自动渐变。
punctuation">.BufferGeometry
class="token
class-name">Float32Array
class="token
function">setAttribute
class="token
punctuation">.
BufferAttributeclass="token
punctuation">(
verticesclass="token
步骤2:定义顶点颜色(每3个值为一组,RGB,0-1范围)
class-name">Float32Array
class="token
function">setAttribute
class="token
punctuation">.
BufferAttributeclass="token
punctuation">(
colorsclass="token
punctuation">.
MeshBasicMaterialclass="token
property">vertexColors
class="token
punctuation">.
DoubleSide
punctuation">.
Meshclass="token
punctuation">(
geometryclass="token
punctuation">;
三角面会从红色顶点渐变到绿色,再渐变到蓝色,实现多彩渐变效果。
法线属性(Normal):让光照生效
MeshStandardMaterial
等受光照影响的材质,需要「法线数据」才能计算光影,可手动定义或自动计算:
function">computeVertexNormals
class="token
class-name">Float32Array
class="token
function">setAttribute
class="token
punctuation">.
BufferAttributeclass="token
punctuation">(
normalsclass="token
punctuation">;
坐标(0-1范围)用于将2D图片贴到3D几何体上,每2个值为一组(U=横向,V=纵向):
class-name">Float32Array
class="token
function">setAttribute
class="token
punctuation">.
BufferAttributeclass="token
punctuation">.
TextureLoaderclass="token
string">'texture.jpg'
class="token
punctuation">.
MeshBasicMaterialclass="token
punctuation">;
id="_230">
四、完整实战示例(自定义三角面+索引+顶点颜色)punctuation">>
class="token
punctuation"><
html
punctuation">"
zh-CNclass="token
punctuation">"
class="token
punctuation">>
class="token
punctuation"><
headclass="token
punctuation">>
class="token
punctuation"><
meta
punctuation">"
UTF-8class="token
punctuation">"
class="token
punctuation">>
class="token
punctuation"><
titleclass="token
punctuation">>
BufferGeometry完整示例
punctuation"></
titleclass="token
punctuation">>
class="token
punctuation"><
styleclass="token
punctuation">>
class="token
punctuation">}
class="token
punctuation"></
styleclass="token
punctuation">>
class="token
punctuation"></
headclass="token
punctuation">>
class="token
punctuation"><
bodyclass="token
punctuation">>
class="token
punctuation"><
script
punctuation">"
moduleclass="token
punctuation">"
class="token
punctuation">>
class="token
string">'https://threejsfundamentals.org/threejs/resources/threejs/r132/build/three.module.js'
class="token
string">"https://threejsfundamentals.org/threejs/resources/threejs/r132/examples/jsm/controls/OrbitControls.js"
class="token
punctuation">.
Sceneclass="token
punctuation">.
PerspectiveCameraclass="token
punctuation">.
innerWidthclass="token
punctuation">.
innerHeightclass="token
punctuation">.
WebGLRendererclass="token
property">antialias
class="token
punctuation">;
rendererclass="token
punctuation">(
windowclass="token
punctuation">.
innerWidthclass="token
punctuation">.
innerHeightclass="token
punctuation">;
documentclass="token
function">appendChild
class="token
punctuation">(
rendererclass="token
punctuation">.
domElementclass="token
punctuation">;
cameraclass="token
punctuation">.
positionclass="token
BufferGeometry(带索引+顶点颜色)
class="token
punctuation">.
BufferGeometryclass="token
class-name">Float32Array
class="token
punctuation">;
geometryclass="token
function">setAttribute
class="token
punctuation">.
BufferAttributeclass="token
punctuation">(
verticesclass="token
class-name">Float32Array
class="token
punctuation">;
geometryclass="token
function">setAttribute
class="token
punctuation">.
BufferAttributeclass="token
punctuation">(
colorsclass="token
class-name">Uint16Array
class="token
punctuation">;
geometryclass="token
punctuation">.
BufferAttributeclass="token
punctuation">(
indicesclass="token
计算法线(可选,若用受光照材质则需要)
geometryclass="token
function">computeVertexNormals
class="token
punctuation">.
MeshBasicMaterialclass="token
property">vertexColors
class="token
punctuation">.
DoubleSideclass="token
property">wireframe
class="token
punctuation">.
Meshclass="token
punctuation">(
geometryclass="token
punctuation">;
sceneclass="token
punctuation">.
OrbitControlsclass="token
punctuation">(
cameraclass="token
punctuation">.
domElementclass="token
punctuation">;
controlsclass="token
punctuation">.
enableDamping
punctuation">;
controlsclass="token
punctuation">.
dampingFactor
function">requestAnimationFrame
class="token
punctuation">(
animateclass="token
punctuation">.
rotationclass="token
punctuation">.
rotationclass="token
punctuation">;
controlsclass="token
punctuation">;
rendererclass="token
punctuation">(
sceneclass="token
function">addEventListener
class="token
punctuation">{
cameraclass="token
punctuation">.
innerWidth
punctuation">.
innerHeightclass="token
punctuation">;
cameraclass="token
function">updateProjectionMatrix
class="token
punctuation">;
rendererclass="token
punctuation">(
windowclass="token
punctuation">.
innerWidthclass="token
punctuation">.
innerHeightclass="token
punctuation">;
class="token
punctuation"></
scriptclass="token
punctuation">>
class="token
punctuation"></
bodyclass="token
punctuation">>
class="token
punctuation"></
htmlclass="token
punctuation">>
src="https://i-blog.csdnimg.cn/direct/9a2f2d8a71fe48b595316052e4d8662c.png">
id="_327">五、注意事项与性能优化
关键注意点
Uint16Array/Uint32Array,不能混用;
必须匹配
:坐标=3,颜色=3/4,UV=2,索引=1,错误会导致几何体显示异常;side:避免背面不可见;
geometry.dispose()
性能优化技巧
局部渲染
:只渲染需要显示的顶点范围,减少计算。id="_342">
核心总结所有几何体的底层核心,官方唯一推荐使用;
position(坐标)、color(颜色)、uv(纹理)、normal(法线)是最常用的属性;class="post-meta-container">
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback