从零开始学习three.js(5):Geometry深度解析:从基础到高级应用

329 阅读2分钟

一、Geometry核心概念

Three.js中的Geometry是构建3D物体的基础骨架,它通过顶点坐标、面片数据和UV映射等属性定义物体的几何形态。每个Geometry对象包含以下关键属性:

  • vertices:顶点坐标数组(三维向量集合)
  • faces:面片数据(由顶点索引构成的三角面)
  • faceVertexUvs:UV纹理坐标映射

以立方体创建为例:

const geometry = new THREE.BoxGeometry(5, 5, 5, 32, 32, 32);
// widthSegments参数控制细分程度,影响曲面平滑度

二、常见内置几何体详解

1. 基础几何体类型

几何体类型关键参数应用场景
SphereGeometryradius, segments球体/行星模型
CylinderGeometryradiusTop, radiusBottom圆柱/锥形物体
TorusGeometryradius, tubeRadius圆环/轮胎模型

2. 参数化建模示例

创建高精度球体:

const sphere = new THREE.SphereGeometry(
  5,    // 半径
  64,   // 经度分段数(影响纵向精度)
  64,   // 纬度分段数(影响横向精度)
  Math.PI/4,  // 起始经度角
  Math.PI/2   // 经度跨度
);

三、BufferGeometry性能优化

传统Geometry与BufferGeometry的对比:

特性GeometryBufferGeometry
内存占用较高低30%-50%
渲染性能10k面片60fps100k面片60fps
数据更新直接属性修改需标记needsUpdate
适用场景动态修改几何静态/大场景

创建自定义BufferGeometry:

const geometry = new THREE.BufferGeometry();
const vertices = new Float32Array([
  -1.0, -1.0, 1.0, 
  1.0, -1.0, 1.0,
  1.0, 1.0, 1.0
]);
geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3));

四、高级自定义几何体开发

1. 传统Geometry自定义

构建五角星几何体:

const geometry = new THREE.Geometry();
// 顶点定义
geometry.vertices.push(
  new THREE.Vector3(0, 0, 0),
  new THREE.Vector3(Math.sin(θ)*R, Math.cos(θ)*R, 0)
);
// 面片构建
geometry.faces.push(new THREE.Face3(0, 2, 4));
geometry.computeFaceNormals(); // 自动计算法线

2. 动态几何更新

geometry.vertices[0].set(x, y, z);
geometry.verticesNeedUpdate = true;
geometry.elementsNeedUpdate = true;

五、性能优化实践

  1. 几何体合并
const mergedGeo = new THREE.Geometry();
objs.forEach(obj => {
  obj.updateMatrix();
  mergedGeo.merge(obj.geometry, obj.matrix);
});
  1. LOD技术应用
const lod = new THREE.LOD();
lod.addLevel(highDetailMesh, 0);
lod.addLevel(lowDetailMesh, 50);

六、调试与最佳实践

  1. 法线可视化
const helper = new THREE.FaceNormalsHelper(mesh, 2, 0xff0000);
scene.add(helper);
  1. 性能监控:
import Stats from 'stats.js';
const stats = new Stats();
document.body.appendChild(stats.dom);

更多three.js、cesium.js开源案例,请移至gitee.com/giser2017/t…