Three.js纹理贴图

news2024/11/15 18:54:36

目录

Three.js入门

Three.js光源

Three.js阴影

Three.js纹理贴图

纹理是一种图像或图像数据,用于为物体的材质提供颜色、纹理、法线、位移等信息,从而实现更加逼真的渲染结果。
纹理可以应用于Three.js中的材质类型,如MeshBasicMaterialMeshLambertMaterialMeshPhongMaterialMeshStandardMaterial等。

UV映射

UV映射是2D图像投影到3D模型的表面以进行纹理映射的3D建模过程(也即把位图贴到3D几何形状的过程或者方法)。在这个过程中,3D模型上的每个顶点都会被赋予一个二维坐标(U, V)。

由于X,Y,Z已经表示模型空间中的3D图形的轴了。所以用U和V分别表示纹理坐标的水平和垂直方向。

顶点UV坐标可以在0~1.0之间任意取值,纹理贴图左下角对应的UV坐标是(0,0),右上角对应的坐标(1,1)

UV映射公式如下:

(u,v) -> (x,y,z)

(u,v)代表纹理上的坐标,(x,y,z)代表几何图形上的点(向量)。

以立方缓冲几何体的一个面为例:
在这里插入图片描述

贴图的左下角(0,0) 映射到几何体的(-1,-1,1);
贴图的左下角(1,0) 映射到几何体的(1,-1,1);
贴图的左下角(0,1) 映射到几何体的(-1,1,1);
贴图的左下角(1,1) 映射到几何体的(1,1,1);

three.js的所有内置的几何体都内置了UV映射,所以开发者不需要担心这个问题。

纹理的使用方法

加载纹理
// 1.
const textureLoader = new THREE.TextureLoader();
// 2.
const texture = textureLoader.load(uv);

const boxGeometry = new THREE.BoxGeometry(2, 2, 2);
const boxMaterial = new THREE.MeshStandardMaterial({
  color: 0xffffff,
  map: texture, // 2.重点位置
});
const boxMesh = new THREE.Mesh(boxGeometry, boxMaterial);
scene.add(boxMesh);

  1. 使用TextureLoader进行加载纹理;
  2. 加载图像并在纹理准备就绪后更新纹理,然后设置给MeshStandardMaterial的map

在这里插入图片描述

纹理变换
  • repeat

我们可以使用 repeat 属性对纹理进行重复显示,repeat 是一个 Vector2 实例,所以可以指定 x y 属性。

texture.repeat.x = 2;
texture.repeat.y = 2;

repeat

默认情况下纹理不会重复(THREE.ClampToEdgeWrapping),最后一个像素被拉伸了,我们需要设置 wrapS 和 wrapT可重复。

texture.wrapS = THREE.RepeatWrapping
texture.wrapT = THREE.RepeatWrapping

repeat

  • wrapSwrapT

上面重复的纹理方向是相同的,可以设置为镜像方向。

texture.wrapS = THREE.MirroredRepeatWrapping
texture.wrapT = THREE.MirroredRepeatWrapping`

wrapS和wrapT

  • offset

我们可以使用 offset 属性对纹理进行重复偏移,repeat 是一个 Vector2 实例,所以可以指定 x y 属性。

texture.offset.x = 0.1;
texture.offset.y = 0.1;
texture.wrapS = THREE.RepeatWrapping;
texture.wrapT = THREE.RepeatWrapping;

offset

如果不设置THREE.RepeatWrapping重复,则会出现纹理空白区域。

  • rotation
texture.rotation = Math.PI / 4;

rotation

旋转是弧度,逆时针方向旋转。旋转的点默认是(0,0)这个点

  • center

如果要按照纹理的中心进行旋转,需要修改center

texture.center = new THREE.Vector2(0.5, 0.5);

center

  • minFiltermagFilter

可以使用 minFilter 属性来设置纹理图的 minification 缩小过滤器,使用magFilter 属性来设置纹理图的 minification 放大过滤器。

当纹理的像素小于渲染像素时,我们需要将纹理放大;当纹理的像素大于渲染像素时,我们需要将纹理缩小

以放大过滤器为例:

image

  • Nearest就是找最近的一个像素点的颜色;
  • Linear 就是根据附近的四个像素点的平均颜色值️;

纹理类型

纹理有很多种类型,接下来我们就来介绍这些不同的纹理。

如果只是测试效果,可以在一些免费的纹理图片网站上去下载。譬如 www.3dtextures.me 等。

本文使用的纹理图片如下:
在这里插入图片描述

颜色纹理

颜色纹理只会将纹理的像素应用在几何体上。它等同于直接在 material 上设置 color 属性,但是 color 属性只能设置一种颜色,而颜色纹理可以为每一个位置设置颜色。

const textureLoader = new THREE.TextureLoader();
const colorTexture = textureLoader.load('path/to/color_texture.jpg');

const material = new THREE.MeshBasicMaterial({
  map: colorTexture // 增加颜色纹理
});

颜色纹理

法线纹理

法线纹理它不会移动顶点,但是它会让光线认为面的朝向不同。所以看起来会有凹凸立体感。

const normalTexture = textureLoader.load('./images/door/normal.jpg');

const planeMaterial = new THREE.MeshStandardMaterial({
  map: texture,
  normalMap: normalTexture, // 增加法线纹理
});

法线纹理

立体视觉效果还是比较明显的

位移纹理

位移纹理是灰度图像,它将移动顶点以创造一些高度。使用高度纹理,你要添加更多的细分网格才能看到效果。

const displacementTexture = textureLoader.load("./images/door/height.jpg");

const planeGeometry = new THREE.PlaneGeometry(3, 3, 16, 16); // 增加网格
const planeMaterial = new THREE.MeshStandardMaterial({
  map: texture,
  normalMap: normalTexture,
  displacementMap: displacementTexture,// 增加高度纹理
});

位移纹理

可以通过displacementScale控制位移的距离。

金属纹理

金属纹理(metalness texture)是灰度图像,将指定哪个部分是金属(白色)和非金属(黑色)。此信息将有助于创造反射,给 material 增加金属质感。

const metalTexture = textureLoader.load("./images/door/metalness.jpg");


const planeMaterial = new THREE.MeshStandardMaterial({
  map: texture,
  normalMap: normalTexture,
  metalnessMap: metalTexture, // 增加金属纹理
});

金属纹理

增加金属感,是否有感觉?我没看出来。

粗糙度纹理

粗糙度(rougness texture)经常和金属度纹理一起使用,它也是灰度图,它将指定哪个部分是粗糙的(白色),哪一部分是光滑的(黑色)。

const roughTexture = textureLoader.load("./images/door/roughness.jpg");


const planeMaterial = new THREE.MeshStandardMaterial({
  map: texture,
  normalMap: normalTexture,
  metalnessMap: metalTexture, 
  roughnessMap: roughTexture, // 增加粗糙度纹理
});

这个例子看不出效果,就不截图了。

环境光遮蔽纹理

环境遮挡纹理(ambient occlusion texture)是灰度图像,它将在表面缝隙中添加假的阴影。虽然它在物理上不准确,但它有助于创建对比度。

const aoTexture = textureLoader.load("./images/door/ambientOcclusion.jpg");

const planeMaterial = new THREE.MeshStandardMaterial({
  map: texture,
  normalMap: normalTexture,
  metalnessMap: metalTexture, 
  roughnessMap: roughTexture, 
  aoMap: aoTexture, // 增加环境光遮蔽纹理
});

环境光遮蔽纹理

环境纹理

环境纹理来模拟物体周围的环境光照和反射。环境纹理通常用于创建反射镜面效果或提供全局光照。

  const sphere = new THREE.Mesh(
    new THREE.SphereGeometry(2, 50, 50),
    new THREE.MeshPhysicalMaterial({
      roughness: 0,
      metalness: 0,
      color: 0xffea00,
      envMap: texture, // 设置环境纹理
      transmission: 1,
      ior: 2.3,
    })
  );

环境纹理

看看这个玻璃球上的效果

重要参考资料:
three.js - Textures & Texture Mapping
Three.js Texture Mapping Tutorial
Texture

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

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

相关文章

本质矩阵E、基本矩阵F、单应矩阵H

1. E (归一化坐标对进行计算) t ^ R 为3*3的矩阵, 因为R,t共有6个自由度,又因为单目尺度等价性,所以实际上E矩阵共有5个自由度。因此至少需要5个点对来求解。 2. 基本矩阵F:根据两帧间匹配的像素点对儿计算 3*3且自由度为7的矩阵kF也为基础矩阵&#x…

构建之法 - 软工教学:每天都向前推进一点点

作者:福州⼤学 汪璟玢⽼师 汪老师:每次都向前推进一点点,哪怕只有一点点,也好过什么都不做。 ​邹老师:对,几个学期下来,就已经超过那些“空想”的团队很远了。坚持下去! 汪老师&…

x86 kgdb deug调试分析

本文主要是收集,以下文章写得很好,我二次整理一下。 如果要手动livedb. 1. call kdbg_arch_late() 2. kgd_set_hw_break(addr,8,1); 3. kgdb_correct_hw_break();// enable bp to cpu regs -------------------------------分割线----------------…

第5讲:如何构建类的方法

【分享成果,随喜正能量】在这个社会上,对别人好一点,多站在别人的角度考虑,不要为小事争执,不要取笑他人,不要在别人背后嚼舌根,更不能逼人太甚。凡事退一步,对你有好处。。 《VBA中…

前沿分享-无创检测血糖RF波

非侵入性血糖仪,利用射频 (RF) 波连续测量血液中的葡萄糖水平。利用射频波技术连续实时监测血液中的葡萄糖水平,使用的辐射要比手机少得多。 大概原理是血液中的葡萄糖是具有介电特性,一般来说就是介电常数。 电磁波波幅的衰减反映了介质对电…

电脑文件丢失如何找回?使用这个方法轻松找回!

电脑文件丢失怎么办?有没有免费的电脑文件恢复软件?相信很多人在日常办公中也都经常会遇到这种现象,不管是在学习中,还是日常的办公,往往也都会在电脑上存储大量的数据文件,那么如果我们在日常办公操作过程…

忆恒创源发布PBlaze7 7940系列PCIe 5.0企业级NVMe SSD

今天,国内知名企业级SSD产品和解决方案供应商——北京忆恒创源科技股份有限公司(Memblaze,以下简称“忆恒创源”)全新一代PCIe 5.0企业级NVMe SSD PBlaze7 7940正式发布。与主流PCIe 4.0产品相比,PBlaze7 7940有着2.5倍…

1.利用matlab建立符号表达式(matlab程序)

1.简述 、 1. 使用sym命令创建符号变量和表达式 语法: sym(‘变量’,参数) %把变量定义为符号对象 说明:参数用来设置限定符号变量的数学特性,可以选择为’positive’、’real’和’unreal’, ’positive’ 表示为“正、实”符…

【C++】位图|布隆过滤器|海量数据处理面试题

文章目录 一.位图1. 位图的概念2. 位图的使用3. 位图的实现 二.布隆过滤器1. 布隆过滤器2. 布隆过滤器的实现 三.海量数据处理面试题1.位图2.布隆过滤器3.哈希切割 一.位图 1. 位图的概念 所谓位图,就是用每一位来存放某种状态,适用于海量数据&#xf…

沁恒ch32V208处理器开发(一)开发环境

目录 简介:开发环境开发界面自定义风格 烧录工具支持范围烧录界面 简介: CH32V2x 系列是南京沁恒基于 32 位 RISC-V 指令集及架构设计的工业级通用微控制器。采用青稞 V4 内核,支持硬件中断堆栈,提升中断响应效率;CH3…

PyCharm新手入门指南

安装好Pycharm后,就可以开始编写第一个函数:Hello World啦~我们就先来学习一些基本的操作,主要包含新建Python文件,运行代码,查看结果等等。 文章主要包含五个部分: 一、界面介绍 主要分为菜单栏、项目目录…

3.2用互斥元保护共享数据

概述 于是,你有一个类似于上一节中链表那样的共享数据结构,你想要保护它免于竞争条件以及可能因此产生的不变量损坏。如果你可以将所有访问该数据结构的代码块标记为互斥的(mutually exclusive),岂不是很好?如果任何线…

flutter 没有open android module in Android studio 插件代码爆红

参考 1.结论 其实就是缺少这个文件 2.解决方案有两个 2.1 方案一 手动创建一个,命名规则是项目名字‘_android’‘.iml’ 内容如下: <?xml version"1.0" encoding"UTF-8"?> <module type"JAVA_MODULE" version"4">&l…

Python小白入门:类和面向对象思想的超详细知识点总结

目录 一、创建和使用类1.1 创建类1.2 根据类创建实例1.2.1访问属性1.2.2 调用方法1.2.3 创建多个实例 练习题 二、使用类和实例2.1 创建一个类2.2 给属性指定默认值2.3 修改属性值2.3.1 直接通过实例进行修改2.3.2通过方法进行设置2.2.3 通过方法对属性值进行递增 练习题 三、继…

【第一阶段】kotlin中反引号中的函数名特点

在kotlin中可以直接中文定义函数&#xff0c;使用反引号进行调用 eg: fun main() {2023年8月9日定义的函数(5) }private fun 2023年8月9日定义的函数(num:Int){println("反引号的用法$num") }执行结果 在Java中is,in可以定义方法&#xff0c;但是在kotlin中is,in是…

基于亚奈奎斯特采样和SOMP算法的平板脉冲响应空间插值matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...................................................................... %fine regular gr…

RobotFramework的安装过程及应用举例

一、安装python3.8.0 二、安装wxPython C:\>pip install -U wxPython Collecting wxPythonObtaining dependency information for wxPython from https://files.pythonhosted.org/packages/00/78/b11f255451f7a46fce2c96a0abe6aa8b31493c739ade197730511d9ba81a/wxPython-…

flutter开发实战-实现marquee根据文本长度显示文本跑马灯效果

flutter开发实战-实现marquee文本跑马灯效果 最近开发过程中需要marquee文本跑马灯效果&#xff0c;这里使用到了flutter的插件marquee 效果图如下 一、marquee 1.1 引入marquee 在pubspec.yaml中引入marquee # 跑马灯效果marquee: ^2.2.31.2 marquee使用 marquee使用也是…

k8s 自身原理 1

咱们从 pod 一直分享到最近的 Statefulset 资源&#xff0c;到现在好像我们只是知道如何使用 k8s&#xff0c;如何按照 k8s 设计好的规则去应用&#xff0c;去玩 k8s 仔细想想&#xff0c;对于 k8s 自身的内在原理&#xff0c;我们好像还不是很清楚&#xff0c;对于每一个资源…

【linux】-进程概念之环境变量的详解(命令行参数的介绍)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …