three中的BufferGeoery

该系类文章主要用于记录学习three.js的过程,包括做的一些demo,笔记,以及个人思考;主要学习的课程是 神光的小册《three.js通关秘籍》,感兴趣的可以购买学习,质量还是可以的

本节主要学习BufferGerery,它是所有几何体的父类

1. BufferGeometry类

我们在之前的文章中已经通过代码和gif图片体验过了几何体,比如立方体、圆柱体等

而这些几何体的父类就是BufferGerery

文档地址:threejs.org/docs/index....

2. 几何体的本质核心

所有的几何体都是由一堆顶点数据,由顶点数据构成三角形,三角形再构成任何几何体

首先是一个个点,每三个点组成一个三角形,多个三角形组成面,面可以组成几何体,

即使是球体,放大无数倍也是一样的,是有很多细小的三角形组成,可以看下面的图

3. 具体的操作

  • 通过gemotry.attributes.position 设置顶点数据(数组中重复的数据会删除)
  • 通过geometry.index直接用postion种的索引, 来设置三角形数据

核心代码如下

javascript 复制代码
import * as THREE from 'three';

const geometry = new THREE.BufferGeometry();
// 这是一个个点
const vertices = new Float32Array([
    0, 0, 0,
    100, 0, 0,
    0, 100, 0,

    0, 100, 0,
    100, 0, 0,
    100, 100, 0
]);
// 3个点一个面,所以这是两个三角形,组成的几何体
const attribute = new THREE.BufferAttribute(vertices, 3);
geometry.attributes.position = attribute;
// 设置材质
const material = new THREE.MeshBasicMaterial({
    color: new THREE.Color('orange'),
    wireframe: true, // 线框模式
});

const mesh = new THREE.Mesh(geometry, material);

export default mesh;

运行如下

我们发现其中有些点的坐标是重叠的,试想一下如果是一个球体,那么会有成千上万的三角形,很多点都是位置都是一样的,是不是就会爆炸了

所以再优化一下把所有的点的坐标放到vertices中,重叠的部分就只写一个即可,再后面用的地方我们只需要引用vertices的对用的索引即可

优化如下:

ini 复制代码
// 将重复的点去除
const vertices = new Float32Array([
    0, 0, 0,
    100, 0, 0,
    0, 100, 0,
//     0, 100, 0,
//     100, 0, 0,
    100, 100, 0
]);

const attribute = new THREE.BufferAttribute(vertices, 3);
geometry.attributes.position = attribute;

// 如果要去除重复的点,那么就需要设置一下,将坐标索引设置进去,因为很点是重复的
const indexes = new Uint16Array([
    0, 1, 2, 2, 1, 3
]);
geometry.index = new THREE.BufferAttribute(indexes, 1);

4. 总结

  1. `BufferGerery``这个类是所有的几何体的父类
  2. 几何体本质上有无数的三角形组成,三角形由无数的点组成
  3. 掌握BufferGerery的基本用法
相关推荐
竹林81820 分钟前
Solana前端开发:我在一个NFT铸造页面上被@solana/web3.js的Connection和Transaction签名坑了两天
前端
冬奇Lab39 分钟前
每日一个开源项目(第144篇):ai-website-cloner-template - 一条命令、多 Agent 并行,把任意网站逆向成 Next.js 代码
前端·人工智能·开源
玄玄子1 小时前
webpack publicPath作用原理
前端·webpack·程序员
HduSy1 小时前
帮 Claude Code 做了个菜单栏 Token 看板,聊聊里面的一些实现逻辑
前端
用户059540174461 小时前
用了6个月LangChain,才发现AI Agent的记忆存储一直有坑——写了23个Pytest用例才彻底修好
前端·css
奶油mm1 小时前
我偷偷把公司的祖传 jQuery 项目改成了 Vue3,CTO 没发现,但全组都来抄我的代码了
前端
用户2136610035721 小时前
Vue2非父子通信与动态组件
前端·vue.js
PedroQue991 小时前
Vite插件体系1.0.0:API稳定,生产就绪
前端·vite
用户059540174461 小时前
把LLM记忆测试从手工脚本换成Pytest参数化,回归时间从2小时降到10分钟
前端·css
donecoding1 小时前
3 条命令搞定闭环 Monorepo:Lerna 版本管理 + 拓扑构建 + 自定义分发
前端·前端框架·node.js