探索三维世界【3】:Three.js 的 Geometry 几何体 与 Material 材质

news2024/11/24 13:26:38

探索三维世界【3】:Three.js 的 Material 材质

  • 1、Geometry几何体
  • 2、Material 材质
  • 3、创建平面与材质
  • 4、多平面渲染

1、Geometry几何体

Three.js中的几何体Geometry是构成3D模型的基本单元之一,它定义了一个物体的形状和大小。Geometry包含了物体的顶点、面、法线、UV映射、颜色等信息,它可以定义各种各样的形状,例如三角形、矩形、圆形、立方体等等。

在使用Three.js创建物体时,需要将Geometry传入到Mesh对象中,Mesh对象则用于定义物体的材质和纹理等属性。Geometry可以通过手动指定顶点和面来创建,也可以通过使用Three.js中自带的多种几何体构造函数来创建,例如BoxGeometry、SphereGeometry、CylinderGeometry等等。

需要注意的是,使用Geometry创建物体时,需要手动计算并设置物体的法线以及UV映射等属性,这一过程有些繁琐。为了简化这一过程,Three.js还提供了BufferGeometry类,它可以自动计算这些属性,提高渲染效率和性能。

2、Material 材质

Three.js 中的 Material 材质是用于决定物体表面颜色、反射度、透明度等外观特性的对象。Material 材质有着很多不同的类型。

  1. BasicMaterial:对物体简单着色,只显示颜色和线框,不进行光照计算。
  2. LambertMaterial:光照模型中的漫反射计算,可以反射入射光,但是没有高光。
  3. PhongMaterial:光照模型中的高光反射计算,不仅计算漫反射,还计算镜面反射,有金属光泽感或亮面感。
  4. TextureMaterial:使用纹理贴图作为物体的贴图,可以设置细节、阴影、透明度等效果。

Material 材质还有许多不同的属性设置,如透明度、反射率、金属光泽度等。在 Three.js 中,可以根据需求选择合适的 Material 材质类型来创建物体的外观效果。

3、创建平面与材质

在这里创建一个简单的平面,其中BufferGeometry是面片、线或点几何体的有效表述。包括顶点位置,面片索引、法相量、颜色值、UV 坐标和自定义缓存属性值。同时创建基础网格材质MeshBasicMaterial是一个以简单着色(平面或线框)方式来绘制几何体的材质。这种材质不受光照的影响。最后将几何体与材质通过Mesh对象创建,Mesh是构成3D物体的基本单元之一,它是由Geometry和Material组合而成的。Geometry表示物体的形状和大小,而Material则表示物体的外观和纹理。Mesh还具有位置、旋转、缩放等属性,这些属性可以用来控制物体的位置和变形。在使用Mesh对象时,通常需要将其添加到场景中,才能够被渲染出来。可以使用Scene对象的add方法将Mesh对象添加到场景中。

注:Mesh对象只能够代表单个物体,不能用来代表多个物体。如果需要表示多个物体,可以考虑使用Three.js中的Group对象。此外,对于大量几何体,使用BufferGeometry而非Geometry可以提高渲染性能。

// 几何体与材质
const geometry = new THREE.BufferGeometry(1, 1, 1);
const vertices = new Float32Array([
    -1.0, -1.0, 1.0,
    1.0, -1.0, 1.0,
    1.0, 1.0, 1.0,

    1.0, 1.0, 1.0,
    -1.0, 1.0, 1.0,
    -1.0, -1.0, 1.0
])
geometry.setAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );
const material = new THREE.MeshBasicMaterial( { color: 0xff0000 } );

const cube = new THREE.Mesh(geometry, material);
// 设置位置
cube.position.set(0, 0, 0)
scene.add(cube);

查看效果:

在这里插入图片描述

4、多平面渲染

在这里我们使用循环随机绘制50个三角形平面,其中整体逻辑和上面是一样的, 并且给每一个三角形平面都设置了一个透明度和颜色随机,这样就可以看到如下效果

for (let i = 0; i < 50; i++) {
    // 几何体与材质
    const geometry = new THREE.BufferGeometry(1, 1, 1);
    const vertices = new Float32Array(9)
    for (let j = 0; j < 9; j++) {
        vertices[j] = Math.random() * 5
    }
    geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3));
    let color = new THREE.Color(Math.random(), Math.random(), Math.random())
    const material = new THREE.MeshBasicMaterial({
        color,
        // transparent设置为true 才可设置透明度
        transparent: true,
        opacity: 0.5
    });
    const cube = new THREE.Mesh(geometry, material);
    // 设置位置
    cube.position.set(0, 0, 0)
    scene.add(cube);
}

查看效果
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RK3568平台开发系列讲解(网络篇)网络包的接收过程

🚀返回专栏总目录 文章目录 一、内核接收网络包过程二、用户态读取网络包过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们一起来梳理下网络包的接收过程。 一、内核接收网络包过程 硬件网卡接收到网络包之后,通过 DMA 技术,将网络包放入 Ring Buffer;…

PyTorch数据加载工具:高效处理常见数据集的利器

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

HTTP 缓存新鲜度 max-age

新鲜度 理论上来讲&#xff0c;当一个资源被缓存存储后&#xff0c;该资源应该可以被永久存储在缓存中。由于缓存只有有限的空间用于存储资源副本&#xff0c;所以缓存会定期地将一些副本删除&#xff0c;这个过程叫做缓存驱逐。另一方面&#xff0c;当服务器上面的资源进行了更…

使用ControlNet控制Stable-Diffusion出图人物的姿势

概述 在Stable-Diffusion&#xff08;以下简称SD&#xff09;出图中&#xff0c;我们往往需要对出图人物的姿势进行控制&#xff0c;这里我使用一个比较简单上手的方法&#xff0c;通过ControlNet可以很方便地对画面风格&#xff0c;人物姿势进行控制&#xff0c;从而生成更加…

Python —— Windows10下训练Yolov5分割模型并测试

附:Python —— Windows10下配置Pytorch环境、进行训练模型并测试(完整流程,附有视频)   效果 手机拍摄一段工位视频,上传到win10训练了yolov5分割鼠标的样本后推理效果截图。 训练准备 1、查看自己下载的Yolov5源码是否存在"segment"文件夹,该文件夹下存在分…

【Python入门篇】——Python基础语法(字面量注释与变量)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; Python入门&#xff0c;本专栏主要内容为Python的基础语法&#xff0c;Python中的选择循环语句…

有限等待忙等、让权等待死等、互斥遵循的几大原则——参考《天勤操作系统》,柳婼的博客

参考柳婼的博客 一、 有限等待&&死等 有限等待: 对请求访问的临界资源的进程&#xff0c;应该保证有限的时间进入临界区&#xff0c;以免陷入死等状态。受惠的是进程自己 死等: 进程在有限时间内根本不能进入临界区&#xff0c;而一直尝试进入陷入一种无结果的等待状…

在字节跳动做了6年软件测试,4月无情被辞,想给划水的兄弟提个醒

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入字节&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是6年的工作经验吧。 这6年之间完成了一次…

TIM编码器接口

一、知识点 1、Encoder Interface 编码器接口的工作流程 编码器接口可接收增量&#xff08;正交&#xff09;编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;自动控制CNT自增或自减&#xff0c;从而指示编码器的位置、旋转方向和旋转速度 2、编码器接口…

6.2.1邻接矩阵法

接下来我们将认识图的几种存储结构&#xff1a; 邻接矩阵&#xff0c;邻接表&#xff0c;十字链表&#xff0c;邻接多重表 图的存储 1&#xff09;邻接矩阵法 0表示邻接vertex不邻接 只需要一个二位数组就可以实现&#xff1a; 顶点虽然是char类型&#xff0c;但可以存储更加…

搭建vue3+vite工程

搭建vue3vite工程 目录 搭建vue3vite工程 一、官方-文档-快速上手 二、详细截图及步骤 2.1、安装nvm 2.2、 用nvm安装多版本可切换的node.js版本 2.3、 按照官方文档初始化最近版本的vue3 三、脚本配置与调试 3.1、"2.3、"所产生的配置及脚本命令 3.2、脚本…

SpringCloud学习笔记06

九十五、Cloud Alibaba简介 0、why会出现SpringCloud alibaba Spring Cloud Netflix项目进入维护模式 1、是什么 官网&#xff1a;spring-cloud-alibaba/README-zh.md at 2.2.x alibaba/spring-cloud-alibaba GitHub 2、能干嘛 3、去哪下 spring-cloud-alibaba/README-…

Linux——理解文件系统和动静态库

一、理解文件系统 使用命令查看信息 1&#xff0c;使用ls -l查看文件属性和文件内容 2&#xff0c;stat文件名查看更多信息 3&#xff0c;inode Linux中的文件分为文件属性和文件内容。文件属性又称为元信息。保存在inode结构中&#xff0c;inode是一个文件属性的集合。一个文…

Oracle SQL执行计划操作(13)——其他相关操作

该类操作主要包括以上未进行讲解的其他相关操作。根据不同的具体SQL语句及其他相关因素,如下各操作可能会出现于相关SQL语句的执行计划。 1)SELECT STATEMENT 检索表中数据。该操作出现于通过select语句检索表中数据时产生的执行计划。该操作具体如图15-1中节点0所示。 图1…

除了Axure,还有哪些原型设计工具

产品原型设计工具是设计师制作产品原型必不可少的工具。产品原型工具可以帮助我们解决很多问题&#xff0c;但产品原型工具的选择已经成为一个大问题。 除了我们熟悉的产品原型设计工具Axure&#xff0c;市场上还有很多有用的产品原型设计工具&#xff0c;本文将分享7种有用的…

redis详解之数据结构

目录 Redis是什么 Redis字符串的特点&#xff1a; 1字符串的存储 2字符串的获取 3字符串的删除 4字符串的计数 5字符串的修改 6字符串的批量操作 7字符串的二进制安全性 总结&#xff1a; Redis是什么&#xff1a; Redis是一种基于内存的键值对存储数据库&#xff0c;…

C++命名空间的定义以及使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、命名空间定义&#xff1f;1.1定义&#xff1a;1.2变量在域中的访问顺序&#xff1a; 二、命名空间使用2.1加命名空间名称及作用域限定符&#xff08;推荐&a…

【致敬未来的攻城狮计划】— 连续打卡第二十一天:RA2E1_UART —— 串口控制LED亮灭

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

js高级记录

目录 1.怎么理解闭包&#xff1f; 2.闭包的作用&#xff1f; 3.闭包可能引起的问题&#xff1f; 4.变量提升 5.函数动态参数 6.剩余参数 ...&#xff08;实际开发中提倡使用&#xff09; 7.展开运算符 8.箭头函数 9.解构赋值&#xff08;数组、对象&#xff09; 1.怎么理…

为UOS启用VNC和Windows远程桌面

1 参考资料 UOS系统中安装x11vnc远程桌面 如何通过windows电脑远程UOS桌面RDP 已在ARM版本和X86版本中验证均可用 2 准备工作 2.1 设置代理&#xff08;可选&#xff09; 如果设备本身能和公网通&#xff0c;就不需要了。 由于我们全程需要在root账号下进行&#xff0c;系…