当前位置: 首页 > news >正文

Three.js中BufferGeometry 和 BoxGeometry

1. BufferGeometry

定义

BufferGeometry 是 Three.js 中所有几何体的基类。它是一个高度灵活的几何体类型,允许开发者通过自定义顶点数据、法线、UV 坐标等来创建复杂的几何形状。

特点

  • 灵活性高:可以手动定义顶点、面、法线、UV 坐标等数据。
  • 性能优化:使用 BufferAttribute 存储数据,适合处理大量顶点和复杂几何体。
  • 底层控制:适合需要精细控制几何体数据的场景。

使用场景

  • 自定义几何体(如不规则形状、复杂模型)。
  • 从外部加载的 3D 模型(如 GLTF、OBJ 文件)。
  • 需要高性能优化的场景。
import * as THREE from 'three';

// 创建一个简单的三角形
const geometry = new THREE.BufferGeometry();

// 定义顶点数据
const vertices = new Float32Array([
  0, 0, 0, // 顶点 1
  1, 0, 0, // 顶点 2
  0, 1, 0, // 顶点 3
]);

// 将顶点数据添加到几何体中
geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3));

// 定义面(索引)
const indices = new Uint16Array([0, 1, 2]);
geometry.setIndex(new THREE.BufferAttribute(indices, 1));

// 创建材质
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });

// 创建网格
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

2. BoxGeometry

定义

BoxGeometry 是 Three.js 提供的一个内置几何体类型,用于创建立方体(长方体)。它是 BufferGeometry 的子类,专门用于简化立方体的创建。

特点

  • 简单易用:通过参数直接定义立方体的宽度、高度、深度。
  • 内置属性:自动生成顶点、法线、UV 坐标等数据。
  • 适合常见形状:专门用于创建立方体,无需手动定义顶点。

使用场景

  • 创建立方体或长方体。
  • 快速原型开发。
  • 不需要自定义顶点数据的场景。
import * as THREE from 'three';

// 创建立方体几何体
const geometry = new THREE.BoxGeometry(1, 1, 1); // 宽度、高度、深度

// 创建材质
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });

// 创建网格
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
特性BufferGeometryBoxGeometry
类型基类,高度灵活内置几何体,专门用于创建立方体
使用难度较高,需要手动定义顶点数据较低,直接通过参数创建立方体
性能高性能,适合复杂几何体性能较好,适合简单几何体
适用场景自定义几何体、复杂模型、高性能优化场景创建立方体、快速原型开发
数据存储使用 BufferAttribute 存储顶点数据自动生成顶点、法线、UV 坐标等数据
扩展性可以扩展为任意复杂几何体仅限于立方体

ps:BoxGeometry 实际上是 BufferGeometry 的一个封装。Three.js 在内部使用 BufferGeometry 的 API 来生成立方体的顶点、法线和 UV 坐标。

http://www.dtcms.com/a/64596.html

相关文章:

  • 网络变压器的主要电性参数与测试方法(4)
  • Jetpack Navigation 实战:Fragment 和 Activity 的交互与导航
  • Android Glide 缓存模块源码深度解析
  • SpringBoot缓存抽象:@Cacheable与缓存管理器配置
  • Vite项目中vite.config.js中为什么只能使用process.env,无法使用import.meta.env?
  • SpringCloud Alibaba——入门简介
  • 利用ArcGIS Pro进行爆炸波及建筑分析:详细步骤与技巧
  • 鸿蒙模拟器运行NDK项目失败 9568347
  • 【ai塔罗牌-生命之树】【azure openai】【python】交互塔罗牌demo
  • 【大模型系列】llama.cpp本地运行大模型
  • [排序算法]直接插入排序
  • 数据采集技术之python网络爬虫(中国天气网的爬取)
  • 动态规划(1. 第 N 个泰波那契数)
  • 【prompt实战】知乎问题解答专家
  • Mac java全栈开发环境配置
  • 【Linux】在VMWare中安装Ubuntu操作系统(2025最新_Ubuntu 24.04.2)#VMware安装Ubuntu实战分享#
  • SSL 配置
  • Token登录授权、续期和主动终止的方案(Redis+Token(非jwtToken))
  • 用小程序制作好看的手机壁纸或者海报:Canva可画
  • 【面试题集合】
  • 【3-12 toupper(ch) tolower(ch) 和ASCII码 和全排列】
  • Android Retrofit 框架适配器模块深入源码分析(五)
  • Vmware Ubuntu 22.04 连接移动硬盘
  • 成为超人 21:超人怎么学?技能的学习,如编程
  • 【从零开始学习计算机科学】编译原理(五)语法制导翻译
  • grunt构建工具:scss转css
  • JavaWeb-servlet6中request和response的使用
  • 第J2周:ResNet50V2算法实现01(Tensorflow硬编码版)
  • ubuntu2404 安装 过程中 手动设置网络
  • 《深度剖析:鸿蒙系统下智能NPC与游戏剧情的深度融合》