Three.js——九、纹理贴图、纹理对象阵列、地面网格辅助观察、UV坐标以及动画

news2024/9/24 23:31:19

创建纹理贴图

const geometry = new THREE.PlaneGeometry(100, 100);
//纹理贴图加载器TextureLoader
const texLoader = new THREE.TextureLoader();
// .load()方法加载图像,返回一个纹理对象Texture
const texture = texLoader.load(
  new URL(`../assets/img/zhizhen.png`, import.meta.url).href
);
const material = new THREE.MeshLambertMaterial({
  //  color:0x00ffff,
  // 设置纹理贴图:Texture对象作为材质map属性的属性值
  map: texture, //map表示材质的颜色贴图属性
});

color 和 map 同时使用会出现重叠混合的现象,最好就是设置了 color 就不用设置 map,设置 map 就不用设置 color。color 的默认颜色为白色

尝试不同形状的模型

const geometry = new THREE.BoxGeometry(100, 100, 100); //长方体

效果:
请添加图片描述

const geometry = new THREE.SphereGeometry(50, 50, 50); //长方体

请添加图片描述

顶点 UV 坐标

const uvs = new Float32Array([0, 1, 1, 1, 0, 0, 1, 0]);
geometry.attributes.uv = new THREE.BufferAttribute(uvs, 2);

这里的2代表2个为一组

获取纹理贴图四分之一

const uvs = new Float32Array([0, 0.5, 0.5, 0.5, 0, 0, 0.5, 0]);
geometry.attributes.uv = new THREE.BufferAttribute(uvs, 2);

请添加图片描述

圆形平面设置纹理贴图

如果创建了一个圆形几何体CircleGeometry,将图片作为圆形的材质贴图,那么他就会将一张方形图片剪切渲染为圆形效果

    const geometry = new THREE.CircleGeometry(100, 100);
    const textureLoader = new THREE.TextureLoader();
    const material = new THREE.MeshBasicMaterial({
      color:0xfff000,
      map: textureLoader.load(
        new URL(`../assets/img/zhizhen.png`, import.meta.url).href
      ),
      // transparent: true,
      side: THREE.DoubleSide, //两面可见
    });
    const mesh = new THREE.Mesh(geometry, material);
    mesh.position.y = 100;
    mesh.position.x = 100;
    scene.add(mesh);

效果如下:
请添加图片描述

原理

CircleGeometry的UV坐标会对颜色纹理贴图.map进行提取,CircleGeometry的UV坐标默认提取的就是一个圆形轮廓。

纹理对象Texture阵列

使用threejs纹理对象Texture的阵列功能+矩形平面几何体PlaneGeometry实现一个地面瓷砖效果。

 const geometry = new THREE.PlaneGeometry(100, 100);
    const texLoader = new THREE.TextureLoader();
    const texture = texLoader.load( new URL(`../assets/img/zhizhen.png`, import.meta.url).href);
    const material = new THREE.MeshBasicMaterial({
      map: texture,
    });
    texture.wrapS = THREE.RepeatWrapping;
    texture.wrapT = THREE.RepeatWrapping;
    texture.repeat.set(12, 12);
    const mesh = new THREE.Mesh(geometry, material);
    scene.add(mesh);

请添加图片描述

texture.wrapS是WebGL中纹理对象的属性之一,用于指定纹理在水平方向上的重复方式。它可以设置为以下值之一:

  • gl.REPEAT:纹理在水平方向上重复。
  • gl.CLAMP_TO_EDGE:纹理在水平方向上被截断,超出部分被拉伸到边缘像素。
  • gl.MIRRORED_REPEAT:纹理在水平方向上重复,但是每次重复时都会翻转纹理。
    例如,设置texture.wrapS = gl.REPEAT可以使纹理在水平方向上重复,从而实现无缝平铺的效果。需要注意的是,纹理的wrapS和wrapT属性分别控制纹理在水平和垂直方向上的重复方式。

旋转矩形平面

注意旋转方向影响矩形平面背面还是正面朝上,threejs默认渲染正面,不渲染背面。

// 旋转矩形平面
mesh.rotateX(-Math.PI/2);

请添加图片描述

背景透明 png 贴图

把一个背景透明的.png 图像作为平面矩形网格模型 Mesh 的颜色贴图是一个非常有用的功能,通过这样一个功能,可以对 three.js 三维场景进行标注

我们这里换成一个矩形进行测试

const geometry = new THREE.PlaneGeometry(100, 100);
const textureLoader = new THREE.TextureLoader();
const material = new THREE.MeshBasicMaterial({
  map: textureLoader.load(
    new URL(`../assets/img/zhizhen.png`, import.meta.url).href
  ),
  transparent: true, // 开启透明
  side: THREE.DoubleSide, //两面可见
});
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

效果:
请添加图片描述

网格地面辅助观察GridHelper

旋转 90°

mesh.rotateX(-Math.PI / 2);
const gridHelper = new THREE.GridHelper(300, 25, 0x004444, 0x004444);
scene.add(gridHelper);

如果不想开启透明则会成为颜色贴图

const geometry = new THREE.PlaneGeometry(100, 100);
const textureLoader = new THREE.TextureLoader();
const material = new THREE.MeshBasicMaterial({
  map: textureLoader.load(
    new URL(`../assets/img/zhizhen.png`, import.meta.url).href
  ),
});
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

请添加图片描述

旋转矩形平面

mesh.rotateX(-Math.PI / 2);

如果不想与地面网格重叠,那么给平面设置.position偏移则可不与地面进行重合

mesh.position = 1;

关于动画

这里说一下纹理图旋转动画

旋转球体纹理贴图

纹理对象.wrapS或.wrapT与.offset组合使用

当你在动画方法中设置offset偏移后,需要将.wrapS或者.wrapT设置为重复映射
下面是对比效果

直接加偏移量

  const render = () => {
    texture.offset.x += 0.001;
    renderer.render(scene, camera);
    requestAnimationFrame(render);
  };

效果:请添加图片描述

偏移量+纹理映射

  texture.offset.x += 0.5; 
  texture.wrapS = THREE.RepeatWrapping; // 对应offste.x偏移
  /* 或 */
  // texture.offset.y +=0.5;//纹理V方向偏移
  // texture.wrapT = THREE.RepeatWrapping;//对应offste.y偏移

效果:请添加图片描述

可以看到第一种方法旋转一圈后就会出现问题,后续就无法重复映射。

纹理贴图阵列 + UV动画

通过阵列纹理贴图设置.map,这样的话贴图像素可以更小一些。

 const geometry = new THREE.PlaneGeometry(500, 500);
    const texLoader = new THREE.TextureLoader();
    texture = texLoader.load(
      new URL(`../assets/img/zhizhen.png`, import.meta.url).href
    );
    const material = new THREE.MeshBasicMaterial({
      // color:0xfff000,
      map: texture,
      // transparent: true,
      // side: THREE.DoubleSide, //两面可见
    });
    texture.wrapS = THREE.RepeatWrapping;
    texture.wrapT = THREE.RepeatWrapping;
    // uv两个方向纹理重复数量
    texture.repeat.x = 5; //注意选择合适的阵列数量
    texture.repeat.y = 5; //注意选择合适的阵列数量
    const mesh = new THREE.Mesh(geometry, material);
    mesh.rotateX(-Math.PI / 2);
    scene.add(mesh);
  const render = () => {
    texture.offset.x += 0.01;
    texture.offset.y += 0.01;
    renderer.render(scene, camera);
    requestAnimationFrame(render);
  };
  render();

请添加图片描述

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

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

相关文章

IRIS75 DM蓝牙5.2双模热插拔PCB

键盘使用说明索引(均为出厂默认值) 软件支持(驱动的详细使用帮助)一些常见问题解答(FAQ)首次使用步骤蓝牙配对规则(重要)蓝牙和USB切换键盘默认层默认触发层0的FN键配置的功能默认功…

B站恰饭视频汇总,如何查找不同行业的品牌商单和恰饭视频?

随着“短视频时代”来临,广告主都在重点布局短视频平台,尝试用长短视频平台协同投放的方式来提高广告点击率。B站作为短视频产出的高质量平台,也是许多年轻人活跃的聚焦地,拥有很强的用户粘性和无限的商业潜力,是广告主…

港联证券|如何抓住牛股?股票为什么能够连续涨停?

牛股是指在股票市场中表现出色、股价涨幅较大的个股,对于投资者来说,抓住牛股是实现投资目标的关键之一。那么如何抓住牛股?股票为什么能够连续涨停?港联证券也为大家准备了相关内容,以供参考。 如何抓住牛股&#xff…

迅为RK3568开发板Buildroot 系统设置屏幕旋转

迅为支持的触摸屏幕有四种: MIPI 7 寸屏幕(默认物理屏幕为竖屏) LVDS 7 寸屏幕(默认物理屏幕为竖屏) LVDS 10.1 寸 1024*600 屏幕(默认物理屏幕为横屏) LVDS 10.1 寸 1280*800 屏幕&#xf…

代码随想录二刷 day13 | 栈与队列 之 239. 滑动窗口最大值 347.前 K 个高频元素

day13 239. 滑动窗口最大值347.前 K 个高频元素 239. 滑动窗口最大值 题目链接 解题思路: 设计单调队列的时候,pop和push操作要保持如下规则: pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹…

拜登签字了

* * * 原创:刘教链 * * * 号外:今天在“刘教链Pro”发表了一篇《对PoS的链重建攻击》,总结了一下最近关于PoW和PoS安全性的碰撞,抛砖引玉,欢迎关注“刘教链Pro”并阅读。 * * * 隔夜比特币仍在27k上方盘旋。盘旋之中微…

数据万象 | AIGC 存储内容安全解决方案

AIGC(人工智能生产内容) 已经成为与PGC(专业生产内容)、UGC(用户生产内容)并驾齐驱的内容生产方式。由于 AI 的特性,AIGC在创意、个性化、生产效率等方面具有独特的优势,这些优势可以…

Hadoop中MapReduce概述

MapReduce概述 MapReduce定义MapReduce优缺点MapReduce核心思想MapReduce进程MapReduce编程规范MapTask并行度决定机制ReduceTask并行度决定机制mapreduce中job的提交流程MapReduce工作流程shuffle机制分区partition数据清洗(ETL)进一步分析MapTask和Red…

项目经理如何制定工作计划?做到这3点就够了

工作计划的重要性在于明确目标和实现具体步骤,协调大家一致行动,增强工作的主动性,减少工作的盲目性,让工作有条不紊地进行。同时,制定计划也可以对工作进度和质量有个保证和标准,对大家的工作有约束和督促…

Android Native crash问题分析

1、准备材料 android-ndk-r21b工具:addr2line和objdump工具。 .so库:crash对应的带符号表的共享库 源代码code:crash对应的源码文件 tombstone:Android系统产生的墓碑文件 2、 tombstone墓碑文件分析 关键信息: c…

前端div水平居中的几种实现方式

借助display布局 父元素开启display:flex布局,并设置justify-content:center主轴的空隙分布 因为是单行,所以使用align-items:center设置侧轴上的对其方式 <body><style>.a{width: 200px;height: 200px;background-color: red;display: flex;justify-content: c…

JS新标签页打开,让你的网站访问更加便捷

前言 大家在浏览网页时&#xff0c;常常需要在新的标签页中打开链接&#xff0c;以便在不离开当前页面的情况下查看其他内容。其中&#xff0c;JS 打开新标签页作为一种常用的功能之一&#xff0c;既可以方便用户快速访问相关链接&#xff0c;又能有效提升网站的用户体验。在本…

【Python 二进制和十六进制】零基础也能轻松掌握的学习路线与参考资料

1.了解二进制和十六进制的基本概念和用途 在计算机中&#xff0c;二进制和十六进制是两种常用的表示数据的方式。二进制只有两个数字0和1&#xff0c;表示一个比特&#xff08;bit&#xff09;&#xff0c;在实际的计算机程序中&#xff0c;常用八个比特表示一个字节&#xff…

如何在 JavaScript 中创建自定义警告框

本文将介绍如何使用 jQuery UI、SweetAlert2 和自定义警报功能在 JavaScript 中创建自定义警报框。 使用 jQuery UI 创建自定义警告框 我们可以使用 jQuery UI 来模仿 JavaScript 本机 alert() 函数的功能。 尽管 jQuery UI 有很多 API&#xff0c;您可以使用它的 dialog() AP…

Python--注释

Python--注释 <font size4, colorblue> 一、Python中注释的形式<font size4, colorblue> 1、单行注释&#xff1a;使用“#”符号注释<font size4, colorblue> 2、多行注释&#xff1a;使用一对三个英文单引号注释<font size4, colorblue> 3、多行注释&…

W3电力线载波通信技术

CK_Label_W3 CK_Label_W3&#xff08;外接供电版&#xff09; 产品型号 CK_Label_W3 尺寸 114.5*44.5*19mm 屏幕尺寸 2.9 inch 分辨率 296*128 像素密度 112dpi 显示技术 电子墨水屏显示 显示颜色 黑/白 外观颜色 白色 按键 4 指示灯 4 RGB灯 灯光颜色…

帮你梳理了一份前端知识架构图

列一份前端知识架构图 在上一篇文章中&#xff0c;我们简要地总结了前端的学习路径与方法&#xff0c;我们提到的第一个学习方法就是&#xff1a;建立知识框架。那么&#xff0c;今天我们就一起来列一份前端的知识框架图。 在开始列框架之前&#xff0c;我想先来谈谈我们的目…

GoogleTest之gMock:创建Mock

目录 MOCK_METHODmock方法的访问属性mock重载函数mock模板类mock非虚函数mock自由函数Nice/Strict/Naggymock方法简化参数mock具体类的替代方法代理给fake mock是用来模拟对象&#xff0c;隔离边界的一种测试方法&#xff0c;以便在开发阶段不需要依赖第三方或其他依赖项可以进…

C#,码海拾贝(31)——约化“对称矩阵“为“对称三对角阵“的“豪斯荷尔德Householder变换法“之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 矩阵类 /// 作者&#xff1a;周长发 /// 改进&#xff1a;深度混淆 /// https://blog.csdn.net/beijinghorn /// </summary> public partial class Matrix {…

运维小白必学篇之基础篇第九集:Linux文件管理实验

Linux文件管理实验 实验作业&#xff1a; 1、筛选/etc/issue文件中的空行 2、筛选/etc/passwd文件中以“bash”结尾的行 3、筛选/etc/passwd文件中以“sync”开头的行 4、列出/etc/passwd文件中包含“dns”的行,并显示行号 5、创建a1-a3.txt3个文件&#xff0c;使用tar命令将这…