【Three.js】知识梳理三:Three.js几何体Geometry

2024-06-11 17:20

本文主要是介绍【Three.js】知识梳理三:Three.js几何体Geometry,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.什么是几何体Geometry?

在 Three.js 中,几何体(Geometry)是一个数据结构,包含了用于描述三维物体的基本信息,如顶点(vertices)、面(faces)和它们的关联属性(例如颜色、法线、纹理坐标等)。将几何体与材质(Material)相结合,我们可以创建出形状丰富、颜色各异的三维物体。

1.1缓冲类型几何体(BufferGeometry)

BufferGeometry 是 Three.js 提供的一种高效几何体表示方法,特别适用于大型场景和高性能要求的应用。与常规几何体(Geometry)相比,BufferGeometry 使用类型化数组(Typed Arrays)存储顶点、面和其他属性,可以显著减少内存占用和渲染时间。

2.几何体的主要属性

在 Three.js 中,几何体(Geometry)是一个数据结构,用于描述三维物体的基本信息。Geometry 的主要属性如下:

  1. vertices: 顶点数组,用于存储几何体的顶点。顶点是由 THREE.Vector3 对象表示的三维空间中的点,它们定义了物体的形状。
  2. faces: 面数组,用于存储几何体的面。面是由顶点组成的多边形,它们共同定义了几何体的表面。在 Three.js 中,面通常由 THREE.Face3 对象表示,表示一个由三个顶点组成的三角形。
  3. faceVertexUvs: 一个二维数组,用于存储每个面的纹理坐标。纹理坐标是每个顶点在纹理图像上的二维坐标,由 THREE.Vector2 对象表示。纹理坐标用于将纹理映射到几何体的表面。
  4. vertexNormals: 顶点法线数组。顶点法线是由 THREE.Vector3 对象表示的单位向量,指向顶点表面的法线方向。顶点法线用于光照计算和平滑着色。
  5. boundingBox: 几何体的轴对齐边界框(Axis-Aligned Bounding Box,AABB)。边界框是一个由最小和最大点组成的立方体,它紧密包围几何体。边界框用于快速剔除和碰撞检测等场景优化。
  6. boundingSphere: 几何体的包围球。包围球是一个半径最小的球体,它完全包含几何体。包围球同样用于快速剔除和碰撞检测等场景优化。
  7. colors: 顶点颜色数组。顶点颜色用于为每个顶点分配颜色值,它们可以在着色器中用于插值计算。顶点颜色由 THREE.Color 对象表示。
  8. morphTargets: 几何体的形状目标(Morph Targets)数组。形状目标是一组与原始几何体具有相同顶点数量的几何体,它们用于实现形状变形动画。

3.使用内置的几何体类型

Three.js 提供了许多内置的几何体类型。要使用内置的几何体类型,只需创建一个相应类型的实例,并将其与材质组合在一起,形成一个网格对象(Mesh)。

image-20230509153619692.png

例如,创建一个简单的立方体:

// 创建一个立方体几何体
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);

4.创建自定义几何体

除了使用内置的几何体类型,您还可以通过组合顶点和面来创建自定义几何体。以下是一个创建自定义三角形几何体的示例:

// 创建一个空的几何体对象
const geometry = new THREE.Geometry();
​
// 定义三个顶点
const v1 = new THREE.Vector3(0, 0, 0);
const v2 = new THREE.Vector3(1, 0, 0);
const v3 = new THREE.Vector3(0, 1, 0);
​
// 将顶点添加到几何体中
geometry.vertices.push(v1);
geometry.vertices.push(v2);
geometry.vertices.push(v3);
​
// 创建一个面,使用顶点的索引定义
const face = new THREE.Face3(0, 1, 2);
​
// 将面添加到几何体中
geometry.faces.push(face);
​
// 更新法线(这对于渲染和光照计算非常重要)
geometry.computeFaceNormals();
​
// 创建一个材质
const material = new THREE.MeshBasicMaterial({color: 0xff0000, side: THREE.DoubleSide});
​
// 创建一个网格对象
const triangle = new THREE.Mesh(geometry, material);
​
// 添加到场景中
scene.add(triangle);

5.旋转、缩放、平移、居中几何体

Three.js 提供了丰富的 API,让我们可以轻松地对几何体进行变换,这些方法本质上都是改变几何体的顶点数据。如平移、旋转和缩放等。要对网格对象进行变换,可以直接修改其 positionrotationscale 属性。例如:

5.1 缩放.scale()

// 几何体xyz三个方向都放大2倍
geometry.scale(2, 2, 2);
​
// 几何体旋转、缩放或平移之后,查看几何体顶点位置坐标的变化
// BufferGeometry的旋转、缩放、平移等方法本质上就是改变顶点的位置坐标
console.log('顶点位置数据', geometry.attributes.position);

5.2 平移.translate()

// 几何体沿着x轴平移50
geometry.translate(50, 0, 0);

5.3 旋转.rotateX().rotateY().rotateZ()

// 几何体绕着x轴旋转45度
geometry.rotateX(Math.PI / 4);

5.4 居中.center()

geometry.translate(50, 0, 0);//偏移
// 居中:已经偏移的几何体居中,执行.center(),你可以看到几何体重新与坐标原点重合
geometry.center();

附送250套精选项目源码

源码截图

 源码获取:关注公众号「码农园区」,回复 【源码】,即可获取全套源码下载链接

这篇关于【Three.js】知识梳理三:Three.js几何体Geometry的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051807

相关文章

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和

硬件基础知识——自学习梳理

计算机存储分为闪存和永久性存储。 硬盘(永久存储)主要分为机械磁盘和固态硬盘。 机械磁盘主要靠磁颗粒的正负极方向来存储0或1,且机械磁盘没有使用寿命。 固态硬盘就有使用寿命了,大概支持30w次的读写操作。 闪存使用的是电容进行存储,断电数据就没了。 器件之间传输bit数据在总线上是一个一个传输的,因为通过电压传输(电流不稳定),但是电压属于电势能,所以可以叠加互相干扰,这也就是硬盘,U盘

js+css二级导航

效果 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con

js小题:通过字符串执行同名变量怎么做

在JavaScript中,你不能直接使用一个字符串来直接引用一个变量,因为JavaScript是一种静态类型语言(尽管它的类型在运行时可以变化),变量的名字在编译时就被确定了。但是,有几种方法可以实现类似的功能: 使用对象(或Map)来存储变量: 你可以使用一个对象来存储你的变量,然后使用字符串作为键来访问这些变量。 let myVars = { 'var1': 'Hello', 'var

图形编辑器基于Paper.js教程03:认识Paper.js中的所有类

先来认一下Paper的资源对象,小弟有哪些,有个整体的认识。认个脸。 在Paper.js的 官方文档中类大致有如下这些: 基类: ProjectViewItemPointToolSizeSegmentRectangleCurveCurveLocationMatrixColorStyleTweenToolEventGradientGradientStopEvent 二级或三级类 继承Ite

HTML文档插入JS代码的几种方法

在HTML文档里嵌入客户端JavaScript代码有4中方法: 1.内联,放置在< script>和标签对之间。 2.放置在由< script>标签的src属性指定的外部文件中。 3.放置在HTML事件处理程序中,该事件处理程序由onclick或onmouseover这样的HTML属性值指定。 4.放在一个URL里,这个URL使用特殊的“javascript:”协议。 在JS编程中,主张

js 正则表达式出现问题

帮同事写个页面,出现正则表达式不管怎么改都没法匹配的情况。。。。 reg = /^sy[0-9]+$/i; if(rtx.match(reg) == null){ alert("请输入正确的RTX账号!"); return false; } 因为之前一直用的是 reg ="/^sy[0-9]+$/i"; 写PHP写习惯了。。外面多写了两个双引号……T.T 改

bootstrap和JS相关

下表列出了模态框中要用到事件。这些事件可在函数中当钩子使用。 bootstrap 显示隐藏div $('.show-info').click(function () {var show = $(this).data('show');if(show =='all'){$('#creative').show();$('#plan').show();$('#plan').attr('class','

sublime配置node.js

1、下载Nodejs插件,下载地址为: https://github.com/tanepiper/SublimeText-Nodejs(见本人网盘) 下载zip压缩包后解压,文件名改为Nodejs 2、打开Sublime Text3,点击菜单“Perferences” =>“Browse Packages”打开“Packages”文件夹,并将第1部的Nodejs文件夹剪切进来 3

Lodash-js工具库

1. Lodash 简介 Lodash 是一个现代 实用工具库,提供了许多有用的函数,帮助开发者处理常见的编程任务,如数组操作、对象处理、字符串处理等。Lodash 使得代码更简洁、更高效,极大地提高了开发效率。Lodash 的设计灵感来自于 Underscore.js,但提供了更多的功能和更好的性能。 2. 安装 Lodash Lodash 可以通过多种方式安装: 具体安装:参考官网