three.js物体纹理及其常用属性介绍

news/2024/10/30 13:37:33/

一、Three中的纹理和材质介绍

THREE中的纹理材质是用来渲染3D场景中的物体表面的。纹理贴图定义物体表面的颜色和外观,而材质则定义物体表面如何反射光线。

  • 纹理可以使用多种类型的图像文件,包括JPEG、PNG、GIF等。纹理可以是简单的颜色、图案或者是复杂的图像

  • 材质是指物体表面材料的特性。在THREE中,材质可以定义物体表面的颜色质地透明度等属性。材质可以使用多种类型的渲染器,包括基本的Phong(光泽)、Lambert(哑光)和Basic渲染器。此外,高级材质如PBR(物理渲染)材质还可以模拟真实的光学特性,包括表面反射、漫反射和透明度等。

总的来说,THREE中的纹理和材质是用来定义物体表面属性,使3D场景更加真实、逼真的关键部分。

二、自定义立方体纹理

效果如图:
在这里插入图片描述
核心代码:

// 导入纹理
const textureLoader = new THREE.TextureLoader();
const doorColorTexture = textureLoader.load("./textures/door/height.jpg");
// 添加物体
const cubeGeometry = new THREE.BoxBufferGeometry(1, 1, 1);
// 材质
const basicMaterial = new THREE.MeshBasicMaterial({map: doorColorTexture,
});
// 创建物体
const cube = new THREE.Mesh(cubeGeometry, basicMaterial);
// 将物体添加到场景
scene.add(cube);

三、纹理常用属性介绍

1. 偏移量offset

在这里插入图片描述

// 设置纹理偏移
// doorColorTexture.offset.x = 0.5; // 沿着x轴偏移50%
// doorColorTexture.offset.y = 0.5; // 沿着y轴偏移50%
doorColorTexture.offset.set(0.5, 0.5); // 0.5表示偏移50%

2. 旋转rotation

在这里插入图片描述

// 设置旋转中心
doorColorTexture.center.set(0.5, 0.5); // 设置纹理旋转
doorColorTexture.rotation = Math.PI / 4;  // 45度

3. 重复repeat

在这里插入图片描述


// 设置纹理重复
doorColorTexture.repeat.set(3, 4) // 沿着x轴重复3次
// 设置纹理重复模式 MirroredRepeatWrapping 镜像重复
doorColorTexture.wrapS = THREE.RepeatWrapping; // 沿着x轴重复
doorColorTexture.wrapT = THREE.RepeatWrapping; // 沿着y轴重复

4. 纹理显示算法

在这里插入图片描述

// 导入纹理
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load("./textures/minecraft.png");
// 添加物体
const cubeGeometry = new THREE.BoxBufferGeometry(1, 1, 1);
// 材质
const basicMaterial = new THREE.MeshBasicMaterial({map: texture,
});
const cube = new THREE.Mesh(cubeGeometry, basicMaterial);
scene.add(cube);

在这里我们换个纹理贴图,当我们放大时:
在这里插入图片描述
可以看到图像模糊了,这样的用户体验是很不好的,有没有什么办法解决呢?

这就是设置其的显示方式,默认是LinearFilter线性显示,我们改成NearestFilter就可以了

// texture纹理显示设置
texture.minFilter = THREE.NearestFilter;
texture.magFilter = THREE.NearestFilter;
// texture.minFilter = THREE.LinearFilter;
// texture.magFilter = THREE.LinearFilter;

设置完成之后,我们在放大看看
在这里插入图片描述
即使放到很大还是很清晰

THREE.NearestFilter介绍

THREE.NearestFilter是three.js中的一种纹理显示模式,也称为最近邻过滤。

在此模式下,网格表面的纹理像素直接对应到屏幕像素,像素之间没有任何插值,因此图像会出现锯齿状的效果。这种模式适用于一些低分辨率的像素风格游戏或像素艺术,可以增强游戏的复古感或像素艺术的细节表现。

可以通过以下方式来设置THREE.NearestFilter:

texture.magFilter = THREE.NearestFilter;
texture.minFilter = THREE.NearestFilter;

其中

  • magFilter表示纹理的放大过滤方式,
  • minFilter表示缩小过滤方式。

我们在设置过程中,将这两个过滤模式都设置为THREE.NearestFilter即可将整个纹理的显示模式都改为最近邻过滤。

5. 透明纹理

我们还是以最开始的门的纹理为例,要设置门的透明,我们需要准备一张和门这个纹理图片切合的黑白图片,黑色代表不显示,白色代表完全显示
在这里插入图片描述
这时我们没有设置透明之前的样子
在这里插入图片描述

// 导入纹理
const textureLoader = new THREE.TextureLoader();
const doorColorTexture = textureLoader.load("./textures/door/height.jpg");// 添加物体
const cubeGeometry = new THREE.BoxBufferGeometry(1, 1, 1);
// 材质
const basicMaterial = new THREE.MeshBasicMaterial({map: doorColorTexture,
});
const cube = new THREE.Mesh(cubeGeometry, basicMaterial);
scene.add(cube);

我现在的需求是只保留门,其他黑色的边框完全透明,
在这里插入图片描述
代码如下:

// 导入纹理
const textureLoader = new THREE.TextureLoader();
const doorColorTexture = textureLoader.load("./textures/door/height.jpg");
// 添加透明背景纹理
const doorAplhaTexture = textureLoader.load("./textures/door/alpha.jpg");// 添加物体
const cubeGeometry = new THREE.BoxBufferGeometry(1, 1, 1);
// 材质
const basicMaterial = new THREE.MeshBasicMaterial({map: doorColorTexture,alphaMap: doorAplhaTexture, // 设置透明transparent: true, // 允许透明
});
const cube = new THREE.Mesh(cubeGeometry, basicMaterial);
scene.add(cube);

6. 环境遮挡贴图aoMap和强度aoMapIntensity

这是我们上面设置了透明度的门,可看上去并不立体,感觉就是一个平面图,没有那种3d的真实的门的感觉
在这里插入图片描述
想要让门有真实的感觉我们需要设置纹理贴图的遮挡和强度,我们先准备一张遮挡图片如下:
在这里插入图片描述

然后我们在设置遮挡和强度

// 导入纹理
const textureLoader = new THREE.TextureLoader();
const doorColorTexture = textureLoader.load("./textures/door/height.jpg");
const doorAplhaTexture = textureLoader.load("./textures/door/alpha.jpg");
// 定义遮挡贴图
const doorAoTexture = textureLoader.load("./textures/door/ambientOcclusion.jpg"
);// 添加物体
const cubeGeometry = new THREE.BoxBufferGeometry(1, 1, 1);
// 材质
const basicMaterial = new THREE.MeshBasicMaterial({map: doorColorTexture,alphaMap: doorAplhaTexture,transparent: true,aoMap: doorAoTexture, // 遮挡贴图aoMapIntensity: 1, // 强度1为最强,0最小// opacity: 0.3,//   side: THREE.DoubleSide,
});
basicMaterial.side = THREE.DoubleSide;
const cube = new THREE.Mesh(cubeGeometry, basicMaterial);
scene.add(cube);
// 给cube添加第二组uv
cubeGeometry.setAttribute("uv2",new THREE.BufferAttribute(cubeGeometry.attributes.uv.array, 2)
);

效果如图:
在这里插入图片描述
如上图是设置了遮挡和强调之后的门,看上去是不是更加真实了呢。

好啦以上就是关于three.js物体的纹理new THREE.TextureLoader()及其常用属性的介绍啦


http://www.ppmy.cn/news/503653.html

相关文章

Redis简单动态字符串SDS

目录 前言 一.SDS定义 二.SDS与C字符串的区别 2.1 常数复杂度获取字符串的长度 2.2 杜绝缓冲区溢出 2.3 减少修改字符串时带来的内存重分配次数 2.3.1 空间预分配 2.3.2 惰性空间释放 2.4 二进制安全 2.5 兼容部分C字符串函数 2.6 总结 三.SDS缺点 前言 Redis没有直接使用C语…

获取bing壁纸php,php获取bing每日壁纸示例分享

php获取bing每日壁纸示例分享 复制代码 代码如下: $strfile_get_contents(http://cn.bing.com/HPImageArchive.aspx?idx0&n1); if(preg_match("/(.?)/ies",$str,$matches)){ $imgurlhttp://cn.bing.com.$matches[1]; } if($imgurl){ header(Content-Type: imag…

python 日历壁纸_极客编程日历2018桌面壁纸

图灵社区出版了一本极客编程日历“Happy Hacking 2018”,实体已经售罄,但是提供了PDF电子版下载。我们可以编写脚本,把日历和桌面壁纸结合在一起。最终效果如图: 编程日历桌面壁纸 Python源代码: import datetime from…

Mybatis源码分析_日志模块 (1)

不得不承认,学习MyBatis的时间成本要比学习Spring低很多,Mybatis是我所了解过的代码量最小、整体架构最简单,但是又是最具有学习价值的一个框架。如果,你想快速的阅读一个框架的源码,并且掌握这个框架的精髓&#xff0…

python修改桌面壁纸_轻松有趣的Python小案例,让电脑自动更换壁纸

周末好!难得放假,今天的你是不是一觉睡到大中午了?不要有愧疚感,现在的年轻人压力实在太大,好好睡上一觉已经是一件很奢侈的事情了,就给自己好好放个假吧! 在这难得的休闲时光,我们…

什么是版本控制系统?怎么学习? - 易智编译EaseEditing

版本控制系统(Version Control System,简称VCS)是一种用于管理和跟踪文件版本的工具或系统。它可以追踪文件的变更历史,记录每个版本的修改内容,以及支持多人协作开发。 学习版本控制系统可以帮助你更好地管理和控制你…

每一次Http请求,Java线程是如何处理的?

每一次Http请求,Java线程是如何处理的? 文章目录 每一次Http请求,Java线程是如何处理的?前言一、Http请求处理二、两种服务器模型及处理方式1、两种服务:2.更好的处理方式 总结 前言 当我们写好一个项目时&#xff0c…

在 Navicat Premium 中管理 MySQL 用户 | 第 2 部分:创建新用户

第 2 部分:创建新用户 第 2 部分:创建新用户 第 1 部分 中,我们学习了如何使用 Navicat Premium 用户管理工具保护 MySQL 的 root 帐号。本篇文章将集中介绍如何设置新用户的帐号详细信息、帐号限制和 SSL 设置。如果你想边学边用&#xff1…