学习threejs,使用Texture纹理贴图,测试repeat重复纹理贴图

👨‍⚕️ 主页: gis分享者
👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!
👨‍⚕️ 收录于专栏:threejs gis工程师


文章目录

  • 一、🍀前言
    • 1.1 ☘️Texture 纹理贴图
      • 1.1.1 ☘️代码示例
      • 1.1.2 ☘️构造函数
      • 1.1.3 ☘️属性
      • 1.1.4 ☘️方法
  • 二、🍀使用Texture纹理贴图,测试repeat重复纹理贴图
    • 1. ☘️实现思路
    • 2. ☘️代码样例


一、🍀前言

本文详细介绍如何基于threejs在三维场景中使用Texture纹理贴图,测试repeat重复纹理贴图,亲测可用。希望能帮助到您。一起学习,加油!加油!

1.1 ☘️Texture 纹理贴图

Texture 创建一个纹理贴图,将其应用到一个表面,或者作为反射/折射贴图。

1.1.1 ☘️代码示例

const texture = new THREE.TextureLoader().load( "textures/water.jpg" );
texture.wrapS = THREE.RepeatWrapping;
texture.wrapT = THREE.RepeatWrapping;
texture.repeat.set( 4, 4 );

1.1.2 ☘️构造函数

Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding )

1.1.3 ☘️属性

.id : Integer
只读 - 表示该纹理实例的唯一数字。

.isTexture : Boolean
只读标志,用于检查给定对象是否属于纹理类型。

.uuid : String
该对象实例的UUID。 这个值是自动分配的,因此不应当对其进行编辑。

.name : String
该对象的名称,可选,且无需唯一。默认值是一个空字符串。

.image : Image
一个图片对象,通常由TextureLoader.load方法创建。 该对象可以是被three.js所支持的任意图片(例如PNG、JPG、GIF、DDS)或视频(例如MP4、OGG/OGV)格式。

要使用视频来作为纹理贴图,你需要有一个正在播放的HTML5 Video元素来作为你纹理贴图的源图像, 并在视频播放时不断地更新这个纹理贴图。——VideoTexture 类会对此自动进行处理。

.mipmaps : Array
用户所给定的mipmap数组(可选)。

.mapping : number
图像将如何应用到物体(对象)上。默认值是THREE.UVMapping对象类型, 即UV坐标将被用于纹理映射。

.wrapS : number
这个值定义了纹理贴图在水平方向上将如何包裹,在UV映射中对应于U。

默认值是THREE.ClampToEdgeWrapping,即纹理边缘将被推到外部边缘的纹素。 其它的两个选项分别是THREE.RepeatWrapping和THREE.MirroredRepeatWrapping。

.wrapT : number
这个值定义了纹理贴图在垂直方向上将如何包裹,在UV映射中对应于V。

可以使用与 .wrapS : number相同的选项。

请注意:纹理中图像的平铺,仅有当图像大小(以像素为单位)为2的幂(2、4、8、16、32、64、128、256、512、1024、2048、……)时才起作用。 宽度、高度无需相等,但每个维度的长度必须都是2的幂。 这是WebGL中的限制,不是由three.js所限制的。

.magFilter : number
当一个纹素覆盖大于一个像素时,贴图将如何采样。默认值为THREE.LinearFilter, 它将获取四个最接近的纹素,并在他们之间进行双线性插值。 另一个选项是THREE.NearestFilter,它将使用最接近的纹素的值。

.minFilter : number
当一个纹素覆盖小于一个像素时,贴图将如何采样。默认值为THREE.LinearMipmapLinearFilter, 它将使用mipmapping以及三次线性滤镜。

.anisotropy : number
沿着轴,通过具有最高纹素密度的像素的样本数。 默认情况下,这个值为1。设置一个较高的值将会产生比基本的mipmap更清晰的效果,代价是需要使用更多纹理样本。 使用renderer.capabilities.getMaxAnisotropy() 来查询GPU中各向异性的最大有效值;这个值通常是2的幂。

.format : number
默认值为THREE.RGBAFormat。

.internalFormat : String
默认值是使用 .format 和 .type 的组合获得的。GPU 格式允许开发人员指定数据将如何存储在 GPU 上。

.type : number
这个值必须与.format相对应。默认值为THREE.UnsignedByteType, 它将会被用于绝大多数纹理格式。

.offset : Vector2
在 U 和 V 的每个方向上,纹理的单个重复从开始偏移多少。典型范围是 0.0 到 1.0。

以下纹理类型共享引擎中的第一个 uv 通道。偏移(和重复)设置根据以下优先级进行评估,然后由这些纹理共享:

color map
specular map
displacement map
normal map
bump map
roughness map
metalness map
alpha map
emissive map
clearcoat map
clearcoat normal map
clearcoat roughnessMap map

以下纹理类型共享引擎中的第二个 uv 通道。偏移(和重复)设置根据以下优先级进行评估,然后由这些纹理共享:

ao map
light map
.repeat : Vector2

纹理在 U 和 V 的每个方向上在整个表面上重复多少次。如果在任一方向上将 repeat 设置为大于 1,则相应的 Wrap 参数也应设置为 THREE.RepeatWrapping 或 THREE.MirroredRepeatWrapping 以实现所需的平铺影响。为纹理设置不同的重复值与 .offset 一样受到限制。

.rotation : number
纹理将围绕中心点旋转多少度,单位为弧度(rad)。正值为逆时针方向旋转,默认值为0。

.center : Vector2
旋转中心点。(0.5, 0.5)对应纹理的正中心。默认值为(0,0),即左下角。

.matrixAutoUpdate : Boolean
是否从纹理的.offset、.repeat、.rotation和.center属性更新纹理的UV变换矩阵(uv-transform .matrix)。 默认值为true。 如果你要直接指定纹理的变换矩阵,请将其设为false。

.matrix : Matrix3
纹理的UV变换矩阵。 当纹理的.matrixAutoUpdate属性为true时, 由渲染器从纹理的.offset、.repeat、.rotation和.center属性中进行更新。 当.matrixAutoUpdate属性为false时,该矩阵可以被手动设置。 默认值为单位矩阵。

.generateMipmaps : Boolean
是否为纹理生成mipmap(如果可用)。默认为true。 如果你手动生成mipmap,请将其设为false。

.premultiplyAlpha : Boolean
如果设置为 true,alpha 通道(如果存在)会在纹理上传到 GPU 时倍增到颜色通道中。默认为假。

请注意,此属性对 ImageBitmap 没有影响。您需要在创建位图时进行配置。

.flipY : Boolean
如果设置为 true,纹理在上传到 GPU 时沿垂直轴翻转。默认为真。

请注意,此属性对 ImageBitmap 没有影响。您需要在创建位图时进行配置。

.unpackAlignment : number
默认为4。指定内存中每个像素行起点的对齐要求。 允许的值为1(字节对齐)、2(行对齐到偶数字节)、4(字对齐)和8(行从双字边界开始)。

.encoding : number
默认值为THREE.LinearEncoding。

请注意,如果在材质被使用之后,纹理贴图中这个值发生了改变, 需要触发Material.needsUpdate,来使得这个值在着色器中实现。

.version : Integer
这个值起始值为0,计算 .needsUpdate : Boolean被设置为true的次数。

.onUpdate : Function
一个回调函数,在纹理被更新后调用。 (例如,当needsUpdate被设为true且纹理被使用。)

.needsUpdate : Boolean
将其设置为true,以便在下次使用纹理时触发一次更新。 这对于设置包裹模式尤其重要。

.userData : Object
可用于存储有关纹理的自定义数据的对象。它不应该包含对函数的引用,因为这些不会被克隆。

.source : Source
纹理的数据定义。可以跨纹理共享对数据源的引用。这在 spritesheet 的上下文中通常很有用,其中多个纹理渲染相同的数据但具有不同的纹理转换。

1.1.4 ☘️方法

EventDispatcher方法在这个类上可以使用。

.updateMatrix () : undefined
从纹理的.offset、.repeat、 .rotation和.center属性来更新纹理的UV变换矩阵(uv-transform .matrix)。

.clone () : Texture
拷贝纹理。请注意。这不是“深拷贝”,图像是共用的。 此外,克隆纹理不会自动将其标记为纹理上传。一旦其图像属性(数据源)完全加载或准备就绪,您必须将 Texture.needsUpdate 设置为 true。

.toJSON ( meta : Object ) : Object
meta – 可选,包含有元数据的对象。

将Texture对象转换为 three.js JSON Object/Scene format(three.js JSON 物体/场景格式)。

.dispose () : undefined
使用“废置”事件类型调用EventDispatcher.dispatchEvent。

.transformUv ( uv : Vector2 ) : Vector2
基于纹理的.offset、.repeat、 .wrapS、.wrapT和.flipY属性值来变换uv。

二、🍀使用Texture纹理贴图,测试repeat重复纹理贴图

1. ☘️实现思路

  • 1、初始化renderer渲染器。
  • 2、初始化Scene三维场景scene。
  • 3、初始化camera相机,定义相机位置 camera.position.set,设置相机方向camera.lookAt。
  • 4、创建THREE.AmbientLight环境光源ambiLight,创建DirectionalLight平行光源light,设置light位置,scene场景加入ambiLight和light。
  • 5、加载几何模型:定义createMesh方法(参数:geom 几何对象,texture 纹理贴图名称),方法内调用THREE.ImageUtils.loadTexture方法创建Texture纹理贴图texture,texture的wrapS和wrapT属性使用THREE.RepeatWrapping,使用THREE.MeshPhongMaterial高光材质mat,创建THREE.Mesh网格对象mesh,返回mesh。调用createMesh方法分别创建球体网格对象sphere和立方体网格对象cube,设置sphere、cube的位置,scene场景添加sphere和cube。定义controls方法,方法内定义gui控制项repeatX(x方向重复贴图数)、repeatY(y方向重复贴图数)和repeatWrapping(是否采用THREE.RepeatWrapping)以及updateRepeat方法(gui控制项变更更新方法)。定义render方法,实现sphere和mesh的旋转动画。具体代码参考下面代码样例。
  • 6、加入gui控制。加入stats监控器,监控帧数信息。

2. ☘️代码样例

<!DOCTYPE html>
<html>
<head><title>学习threejs,使用Texture纹理贴图,测试repeat重复纹理贴图</title><script type="text/javascript" src="../libs/three.js"></script><script type="text/javascript" src="../libs/stats.js"></script><script type="text/javascript" src="../libs/dat.gui.js"></script><style>body {margin: 0;overflow: hidden;}</style>
</head>
<body><div id="Stats-output">
</div>
<div id="WebGL-output">
</div><!-- Js代码块 -->
<script type="text/javascript">// 初始化function init() {var stats = initStats();// 创建三维场景scenevar scene = new THREE.Scene();// 创建相机var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);// 创建渲染器webGLRenderer,设置渲染器颜色和大小var webGLRenderer = new THREE.WebGLRenderer();webGLRenderer.setClearColor(new THREE.Color(0xEEEEEE, 1.0));webGLRenderer.setSize(window.innerWidth, window.innerHeight);webGLRenderer.shadowMapEnabled = true;var sphere = createMesh(new THREE.SphereGeometry(5, 20, 20), "floor-wood.jpg");scene.add(sphere);sphere.position.x = 7;var cube = createMesh(new THREE.BoxGeometry(6, 6, 6), "brick-wall.jpg");cube.position.x = -7;scene.add(cube);// 设置相机位置和方向camera.position.x = 00;camera.position.y = 12;camera.position.z = 20;camera.lookAt(new THREE.Vector3(0, 0, 0));var ambiLight = new THREE.AmbientLight(0x141414);scene.add(ambiLight);var light = new THREE.DirectionalLight();light.position.set(0, 30, 20);scene.add(light);// webGLRenderer渲染器绑定html页面要素document.getElementById("WebGL-output").appendChild(webGLRenderer.domElement);var step = 0;var controls = new function () {this.repeatX = 1;this.repeatY = 1;this.repeatWrapping = true;this.updateRepeat = function (e) {cube.material.map.repeat.set(controls.repeatX, controls.repeatY);sphere.material.map.repeat.set(controls.repeatX, controls.repeatY);// 使用RepeatWrapping,纹理将简单地重复到无穷大。 使用 RepeatWrapping,纹理将简单地重复到无穷大。// ClampToEdgeWrapping是默认值,纹理中的最后一个像素将延伸到网格的边缘。//使用MirroredRepeatWrapping, 纹理将重复到无穷大,在每次重复时将进行镜像。if (controls.repeatWrapping) {cube.material.map.wrapS = THREE.RepeatWrapping;cube.material.map.wrapT = THREE.RepeatWrapping;sphere.material.map.wrapS = THREE.RepeatWrapping;sphere.material.map.wrapT = THREE.RepeatWrapping;} else {cube.material.map.wrapS = THREE.ClampToEdgeWrapping;cube.material.map.wrapT = THREE.ClampToEdgeWrapping;sphere.material.map.wrapS = THREE.ClampToEdgeWrapping;sphere.material.map.wrapT = THREE.ClampToEdgeWrapping;}cube.material.map.needsUpdate = true;sphere.material.map.needsUpdate = true;}};var gui = new dat.GUI();gui.add(controls, "repeatX", -4, 4).onChange(controls.updateRepeat);gui.add(controls, "repeatY", -4, 4).onChange(controls.updateRepeat);gui.add(controls, "repeatWrapping").onChange(controls.updateRepeat);render();function createMesh(geom, texture) {var texture = THREE.ImageUtils.loadTexture("../assets/textures/general/" + texture);texture.wrapS = THREE.RepeatWrapping;texture.wrapT = THREE.RepeatWrapping;geom.computeVertexNormals();var mat = new THREE.MeshPhongMaterial();mat.map = texture;var mesh = new THREE.Mesh(geom, mat);return mesh;}function render() {stats.update();step += 0.01;cube.rotation.y = step;cube.rotation.x = step;sphere.rotation.y = step;sphere.rotation.x = step;// render using requestAnimationFramerequestAnimationFrame(render);webGLRenderer.render(scene, camera);}function initStats() {var stats = new Stats();stats.setMode(0);stats.domElement.style.position = 'absolute';stats.domElement.style.left = '0px';stats.domElement.style.top = '0px';document.getElementById("Stats-output").appendChild(stats.domElement);return stats;}}window.onload = init;
</script>
</body>
</html>

效果如下:
在这里插入图片描述

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

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

相关文章

图像配准及识别

一、图像配准基础 图像配准&#xff0c;听起来很高大上&#xff0c;其实用大白话来说&#xff0c;就是“让两张照片对齐”的技术。想象一下&#xff0c;你有两张拍得不完全一样的照片&#xff0c;比如一张是你从正面拍的风景&#xff0c;另一张是从侧面拍的同一个地方&#xff…

QT之QML(简单示例)

需求一&#xff1a;点击按钮弹出菜单&#xff0c;并且自定义菜单弹出位置。 mouse.x 和 mouse.y 获取的是相对于 MouseArea&#xff08;在这个例子中是 Button&#xff09;左上角的局部坐标。如果你想要在鼠标点击位置显示 Menu&#xff0c;你需要将这个局部坐标转换为相对于应…

如何编写单元测试

一、前言知识 1.开发过程 需求分析->设计->开发->测试->上线 2.测试种类 单元测试(测试模块编码)、黑盒测试(测试功能是否满足需求)、白盒测试(测试程序内部的逻辑结构)、回归测试(提出的缺陷进行二次验证)、集成测试(测试主要的业务功能及模块间的整合性)、系…

LeetCode 解题思路 30(Hot 100)

解题思路&#xff1a; 递归参数&#xff1a; 生成括号的对数 n、结果集 result、当前路径 path、左括号数 open、右括号数 close。递归过程&#xff1a; 当当前路径 path 的长度等于 n * 2 时&#xff0c;说明已经生成有效括号&#xff0c;加入结果集。若左括号数小于 n&…

【Golang】Windows系统键鼠空闲监测练习

在本文中&#xff0c;我们将练习如何使用Golang编写一个简单的Windows系统空闲时间监测工具。该工具能够检测系统的空闲时间&#xff0c;并在达到一定阈值时计数。 功能概述 监控鼠标和键盘的空闲事件&#xff0c;每空闲超过50s&#xff0c;触发次数加一。 该工具具有以下功…

关于React Redux

官网&#xff1a;&#x1f449;详情一 &#x1f449;详情二 &#x1f449;关于redux 使用原因&#xff1a;&#x1f449;详情 /** 2-1、随着javascript单页应用程序的发展&#xff0c;需要在代码中管理更多的状态&#xff08;包括服务器响应数据、缓存数据、本地创建还未发送…

MySQL和Oracle批量插入SQL差异详解

文章目录 MySQL和Oracle批量插入SQL差异详解1. 基本批量插入语法1.1 MySQL批量插入1.2 Oracle批量插入 2. 带序列的批量插入2.1 MySQL带自增ID的批量插入2.2 Oracle带序列的批量插入 3. 条件批量插入3.1 MySQL条件批量插入3.2 Oracle条件批量插入 MySQL和Oracle批量插入SQL差异…

43页可编辑PPT | 大数据管理中心设计规划方案大数据中心组织架构大数据组织管理

这份文档是一份关于大数据管理中心规划设计方案的详细报告&#xff0c;涵盖了背景与需求分析、整体规划方案、关键能力实现方案以及实施方案等内容。报告强调大数据在城市治理中的重要性&#xff0c;提出通过构建统一的大数据平台&#xff0c;整合城市各部门数据资源&#xff0…

Python-八股总结

目录 1 python 垃圾处理机制2 yield3 python 多继承&#xff0c;两个父类有同名方法怎么办&#xff1f;4 python 多线程/多进程/协程4.1 多线程与GIL全局解释器锁4.2 多进程4.3 协程 5 乐观锁/悲观锁6 基本数据结构**1. 列表&#xff08;List&#xff09;****2. 元组&#xff0…

HTML 标签类型全面介绍

HTML 标签类型全面介绍 HTML&#xff08;HyperText Markup Language&#xff09;是构建 Web 页面结构的基础语言。HTML 由不同类型的标签组成&#xff0c;每种标签都有特定的用途。本文将全面介绍 HTML 标签的分类及其用法。 1. HTML 标签概述 HTML 标签通常成对出现&#xf…

vscode中的【粘滞滚动】的基本概念和作用,关闭了以后如何开启

1、粘滞滚动的基本概念和作用 ‌VSCode中的“粘滞”功能主要是指编辑器在滚动时的一种特殊效果&#xff0c;使得编辑器在滚动到某个位置时会“粘”在那里&#xff0c;而不是平滑滚动到底部或顶部。‌ 粘滞滚动的基本概念和作用 粘滞滚动功能可以让用户在滚动时更直观地看到当前…

【商城实战(101)】电商未来已来:新技术引领商城发展新航向

【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想…

深度学习Note.5(机器学习.6)

1.Runner类 一个任务应用机器学习方法流程&#xff1a; 数据集构建 模型构建 损失函数定义 优化器 模型训练 模型评价 模型预测 所以根据以上&#xff0c;我们把机器学习模型基本要素封装成一个Runner类&#xff08;加上模型保存、模型加载等功能。&#xff09; Runne…

linux服务器专题1------redis的安装及简单配置

在 linux上安装 Redis 可以按照以下步骤进行(此处用Ubuntu 服务器进行讲解)&#xff1a; 步骤 1: 更新系统包 打开终端并运行以下命令以确保你的系统是最新的&#xff1a; sudo apt update sudo apt upgrade步骤 2: 安装 Redis 使用 apt 包管理器安装 Redis&#xff1a; s…

面试问题总结:qt工程师/c++工程师

C 语言相关问题答案 面试问题总结&#xff1a;qt工程师/c工程师 C 语言相关问题答案 目录基础语法与特性内存管理预处理与编译 C 相关问题答案面向对象编程模板与泛型编程STL 标准模板库 Qt 相关问题答案Qt 基础与信号槽机制Qt 界面设计与布局管理Qt 多线程与并发编程 目录 基础…

实现实时数据推送:SpringBoot中SSE接口的两种方法

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

LXC 导入多Linux系统

前提要求 ubuntu下安装lxd 参考Rockylinux下安装lxd 参考LXC 源替换参考LXC 容器端口发布参考LXC webui 管理<

ES的文档更新机制

想获取更多高质量的Java技术文章&#xff1f;欢迎访问Java技术小馆官网&#xff0c;持续更新优质内容&#xff0c;助力技术成长 Java技术小馆官网https://www.yuque.com/jtostring ES的文档更新机制 在现代应用中&#xff0c;数据的动态性越来越强&#xff0c;我们不仅需要快…

trae.ai 编辑器:前端开发者的智能效率革命

一、为什么我们需要更智能的编辑器&#xff1f; 作为从业5年的前端开发者&#xff0c;我使用过从Sublime到VSCode的各种编辑器。但随着现代前端技术的复杂度爆炸式增长&#xff08;想想一个React组件可能涉及JSX、CSS-in-JS、TypeScript和GraphQL&#xff09;&#xff0c;传统…

MySQL篇(一):慢查询定位及索引、B树相关知识详解

MySQL篇&#xff08;一&#xff09;&#xff1a;慢查询定位及索引、B树相关知识详解 MySQL篇&#xff08;一&#xff09;&#xff1a;慢查询定位及索引、B树相关知识详解一、MySQL中慢查询的定位&#xff08;一&#xff09;慢查询日志的开启&#xff08;二&#xff09;慢查询日…