【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套精选项目源码

源码截图

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/698970.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于会议论文/CPCI/ISTP会议论文

关于会议论文 会议论文是公开发表的学术论文,一般正式的国际学术会议都会公开征稿,并要求录用的论文在会议上进行宣读、交流,然后集结出版,这就是我们常说的会议论文集,而这些发表的论文也可用于硕博毕业、项目结题、…

1 c++多线程创建和传参

什么是进程? 系统资源分配的最小单位。 什么是线程? 操作系统调度的最小单位,即程序执行的最小单位。 为什么需要多线程? (1)加快程序执行速度和响应速度, 使得程序充分利用CPU资源。 (2&…

Python中columns()函数

1. columns的概念 在数据分析和处理中,columns是指数据表中的列,也称为字段。每一列代表了特定类型的数据,在一个数据表中,每一行代表了一个数据实例,而每一列则代表了一个特定的特征或属性。 可以直接定义和更改列标题,也可以直接读取某列的数据,或者对某列进行运算。…

Java:双色球案例

文章目录 题目最终代码及运行结果过程中出现的问题判断选取的小球数字是否满足条件获奖多少没输出其他问题 学到的东西 题目 最终代码及运行结果 package com.zhang; /* 双色球案例: 投注号码由6个红球和1个蓝球号码组成。红色球号码从1——33中选择,蓝色球号码从1…

不定时更新 解决无法访问GitHub github.com 打不开 访问加速

1 修改hosts Windows 10为例,‪文件C:\Windows\System32\drivers\etc\hosts 管理员打开记事本来修改 文件-打开-“C:\Windows\System32\drivers\etc\hosts” 20.205.243.168 api.github.com 185.199.108.154 github.githubassets.com 185.199.108.133 raw.githubusercontent.…

Linux:桌面系统中的文件后缀和类型

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的文件后缀与Windows系统有些不同,因为其似乎没有很重要,一个文件是否可执行对后缀没有要求。但是,后缀依然可以用于表示文件…

企业成功实施MES管理系统的七个建议

在当今数字化浪潮下,企业为实现生产过程的智能化、高效化,越来越多地选择实施MES管理系统。MES管理系统不仅上承公司级的ERP系统,获取计划、资源等数据,还与PLM、PDM等系统集成,获取BOM及工艺等数据;同时&a…

SpringBoot高手之路jdk动态代理

文章目录 JDK动态代理基于jdk的动态代理Aop底层就是基于动态代理实现的实现代码先写代理对象工具 JDK动态代理 基于jdk的动态代理 业务需求 通过动态代理技术,对service层的方法统计执行时间–创建代理对象 Aop底层就是基于动态代理实现的 jdk动态代理技术是基于接口做的代理…

计算机专业是否仍是“万金油”?—2024高考生的思考

随着2024年高考落幕,数百万高三学生将面对人生中的重要抉择:选择大学专业。在这个关键节点上,计算机相关专业是否仍是“万金油”的选择?让我们从多个角度来探讨这个问题。 本人985高校计算机类专业毕业,从事IT和互联网…

超详解——python函数定义和调用——小白篇

目录 1. 函数的参数 位置参数: 关键字参数: 默认参数: 2. 关键字参数 3. 参数组 4. 函数重载 5. 函数的返回值 单个返回值: 多个返回值: 6. 函数的内置属性 __name__: __doc__: 7…

【ATU Book-i.MX8系列 - TFLite 进阶】 NXP i.MX8M Plus 实现高效 Mobilenet SSD 物体检测

NXP i.MX8M Plus 实现高效 Mobilenet SSD 物体检测 一、概述 在 边缘运算(Edge Computing) 领域中,轻量级的模型扮演着举足轻重的角色。因此,如何在有限硬体资源下实现电脑视觉(Computer vision) 应用是个极具挑战性的课题。特别…

安享智慧理财金融测试项目

1. 项目介绍 安享智慧理财金融系统是基于 Java 语言开发,集 PC 端、APP 端、WAP 端为一体的 P2P(个人对个人)的借贷系统,提供了完整的借款和投资功能。 web用户端 说明:PC 网站,供借款人和投资人使用功能…

【浏览器清空证书】

chrome://net-internals/#hsts 在地址栏输入并访问:chrome://net-internals/#hsts

【回眸】Linux内核(十一) 进程间通讯 之 管道

前言 进程的介绍已经告一段落,接下来学习的内容是进程间的通讯. 进程间通信(IPC) 面试考点: IPC的通讯方式通常有:管道(无名和命名) ,消息队列,信号量,共享存储,socket,streams等.socket和streams支持2个不同的主机上的2个进程IPC. 管道通常指无名管道 特点: 1. 半双工(…

【稳定检索/投稿优惠】2024年艺术、语言与文化交流国际会议(ALCE 2024)

2024 International Conference on Art, Language, and Cultural Exchange 2024年艺术、语言与文化交流国际会议 【会议信息】 会议简称:ALCE 2024 截稿时间:点击查看 大会地点:中国桂林 会议官网:www.icalce.com 会议邮箱&#…

Hadoop 2.0:主流开源云架构(二)

目录 二、Hadoop 2.0简述(一)Hadoop 2.0由来(二)Hadoop 2.0相关项目(三)Hadoop应用 三、Hadoop 2.0部署(一)部署综述(二)传统解压包部署 二、Hadoop 2.0简述 …

企业微信hook接口协议,ipad协议http,取消扫码返回

简要描述: 取消扫码返回 返回类型: 100003 返回uuid: f7503bb5-7d27-408f-ab24-8c4ace7f 返回示例 {"Vid":1688853790599424,"Qrcode_key":"D368DC88254A3E79FF72942B588D7FBE","Corpid":197…

PLSQL 报错 could not locate oci.dll

0、确保PLSQL已激活。 1、在PLSQL安装包内搜索oci.dll,如果没有搜到需要下载 链接:https://pan.baidu.com/s/1HOfKAEFfuAGYACjfcwqJ1g 提取码:6evh 2、打开PLSQL,设置oci.dll的路径 ps:PLSQL安装包 链接&#xff…

AI预测体彩排3采取888=3策略+和值012路或双胆下一测试6月11日新模型预测第1弹

很抱歉各位小伙伴,端午节三天去了趟外地,没有按时更新3D和排三的预测。前面跟大家说过,8码定位是关键,8码定位能稳定在80%的命中率,才有望通过缩号缩至200-250注以内通过等额方式进行投资。由于前面的模型对8码定位的效…

程序猿大战Python——流程控制——其他控制语句

for循环 目标:掌握for循环的使用。 与while循环功能类似,for语句也能完成反复多次的执行。 for语法: for 临时变量 in 序列:满足条件时,执行的代码1满足条件时,执行的代码2…… [else:当for循环正常执行结束后&#…