解析Three.js中几何体是如何构建的--BufferGeometry(四)

我们在场景中如果创建一个几何体通常都是使用BoxGeometry,而BoxGeometry是四边形的原始几何类,它通常使用构造函数所提供的“width”、“height”、“depth”参数来创建立方体或者不规则四边形。本篇文章中我们主要阐述BufferGeometry这个属性值,以及使用该属性构建一个三角形。在了解本文之前前,请先查看:Three.js+Vue3+Vite创建第一个场景(一),因为以下所述内容都是在此基础上才可完成。

目录

一、BufferGeometry属性概述

二、BufferGeometry应用

1.创建三角形

2.设置定点数

3.设置定点位置属性

4.创建材质 

5.创建立方体

6.绘制四边形

7.使用索引绘制

8.设置索引

9.设置索引属性

三、几何体划分定点组设置不同材质

1.设置两个定点组

2.创建另一个材质

3.设置材质组

4.创建几何体

5.创建六个面材质

6.创建材质组


一、BufferGeometry属性概述

BufferGeometry 是高效表述面片、线或点几何体的数据结构,包含顶点位置、面片索引、法线、颜色、UV 坐标及自定义属性,能显著降低向 GPU 传输数据的开销。言简意赅就是BufferGeometry是面片、线或点几何体的有效表述

二、BufferGeometry应用

下面我们以创建三角形为例,来了解BufferGeometry是如何使用的

1.创建三角形

//创建三角形
const geometry = new THREE.BufferGeometry()

2.设置定点数

定点数是32位浮点数组,定点顺序逆时针为正面,此数据为三角形的顶点数据

//设置定点数据
const vertives = new Float32Array([-1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0])

3.设置定点位置属性

BufferAttribute这个类用于存储与BufferGeometry相关联的 attribute(例如顶点位置向量,面片索引,法向量,颜色值,UV坐标以及任何自定义 attribute )

geometry.setAttribute('position', new THREE.BufferAttribute(vertives, 3))

4.创建材质 

 side:THREE.DoubleSide为双面模式

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

5.创建立方体

//创建立方体
  const cube = new THREE.Mesh(geometry, material)
//添加到场景中
  scene.add(cube)

添加完上述代码后,就可以在界面中看到三角形了

如果是想要绘制四边形,其实我们不难发现四边形是由两个三角形组成的,所以我们只需要在设置定点数据这里,增加定点数即可,其余的依旧不变

6.绘制四边形

//四边形
  const vertives = new Float32Array([
    -1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, -1.0, 1.0, 0.0, -1.0, -1.0, 0.0
  ])

7.使用索引绘制

上述绘制四边形的我们还可以换另一种方式进行绘制,即使用索引值来绘制,索引数组中每三个元素表示一个三角形,索引从0开始

//使用索引绘制
  const vertives = new Float32Array([-1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0, -1.0, 1.0, 0.0])

8.设置索引

添加完上述代码后,还需要再设置索引,0,1,2,2,3,0表示第一个三角形的三个顶点索引为0,1,2,第二个三角形的三个顶点索引为2,3,0

const indices = new Uint32Array([0, 1, 2, 2, 3, 0])

9.设置索引属性

//设置索引属性
  geometry.setIndex(new THREE.BufferAttribute(indices, 1))

三、几何体划分定点组设置不同材质

 一个几何体可能包含多个面,如果想改变每个面的材质这个该如何实现呢,下面我们先从一个面来改变,还是应用上述使用索引绘制的四边形为例来展开,只需要添加以下代码即可

1.设置两个定点组

设置两个定点组来形成两个材质,第一个组中的0,3,0表示第一个材质的起始索引为0,长度为3,材质索引为0,第二个组中的3,3,1表示第二个材质的起始索引为3,长度为3,材质索引为1

geometry.addGroup(0, 3, 0)
geometry.addGroup(3, 3, 1)

2.创建另一个材质

第一个材质看上述代码

//创建另一个材质
  const material1 = new THREE.MeshBasicMaterial({ color: 0xff0000 })

3.设置材质组

前面我们在设置材质时只添加了一个材质,现在需要两个,所以这里需要添加材质组才可以

//设置材质数组
  const cube = new THREE.Mesh(geometry, [material, material1])

4.创建几何体

 以上方法中我们了解到了如何给一个面添加不同材质,那同样如果是几何体也是一样的

// 创建几何体--BoxGeometry是立方体的几何体
  const geometry = new THREE.BoxGeometry(5, 5, 5)

5.创建六个面材质

// 创建材质--六个面,每个面有自己的颜色
  const cubeMaterial1 = new THREE.MeshBasicMaterial({ color: 0x00ff00, wireframe: true })
  const cubeMaterial2 = new THREE.MeshBasicMaterial({ color: 0xff0000 })
  const cubeMaterial3 = new THREE.MeshBasicMaterial({ color: 0x0000ff })
  const cubeMaterial4 = new THREE.MeshBasicMaterial({ color: 0xffff00 })
  const cubeMaterial5 = new THREE.MeshBasicMaterial({ color: 0xff00ff })
  const cubeMaterial6 = new THREE.MeshBasicMaterial({ color: 0x00ffff })

6.创建材质组

// 创建材质数组
  const cube = new THREE.Mesh(geometry, [
    cubeMaterial1,
    cubeMaterial2,
    cubeMaterial3,
    cubeMaterial4,
    cubeMaterial5,
    cubeMaterial6
  ])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值