Threejs_07 环境、透明度、纹理、ao、光照等贴图的渲染

news2025/1/15 13:17:15

@老陈打码 继续学习老陈threejs 支持!!!!!!

下面用到的所有图片、资源、hdr文件都是@老陈打码的原资源

链接:https://pan.baidu.com/s/1WWWHgekCIH7OnjI7S_3ZtQ 
提取码:6666 

Threejs的背景如何设置呢,不能每天面对黑漆漆的屏幕吧。如何加载贴图呢,怎么把自己的图片放到屏幕中呢?

加载各种纹理贴图

在加载各种纹理贴图之前,我们需要有一个机器,用他来加载,相当于一个工具

// 创建纹理加载器
const textureLoader = new THREE.TextureLoader();

然后就开始我们的工作吧

1.做一个物料和基础的材质 这次我们用的是平板物料

// 物料
let planeGeometry = new THREE.PlaneGeometry(1, 1);
// 材质
let planeMaterial = new THREE.MeshBasicMaterial({
  color: 0xffffff,
});
let plane = new THREE.Mesh(planeGeometry, planeMaterial);
scene.add(plane);

 

2.首先 我们先要加载准备好的贴图 然后将纹理放入材质之中

//加载纹理
let texture = textureLoader.load(
  "/public/texture/watercover/CityNewYork002_COL_VAR1_1K.png"
);

let planeMaterial = new THREE.MeshBasicMaterial({
  color: 0xffffff,
    //纹理贴图
  map: texture,
});

效果立马就展示出来了。 

 

不过我们的图片其实是个圆形的,让他变成透明的。

let planeMaterial = new THREE.MeshBasicMaterial({
  color: 0xffffff,
  //纹理贴图
  map: texture,

  //允许透明
  transparent: true,
});

 

3.我们需要加载ao贴图(环境遮挡效果) 并放入材质

//加载AO纹理   ao = 环境遮挡效果
let aoMap = textureLoader.load(
  "/public/texture/watercover/CityNewYork002_AO_1K.jpg"
);

let planeMaterial = new THREE.MeshBasicMaterial({
  color: 0xffffff,
    //纹理贴图
  map: texture,
  
  //设置AO
  aoMap: aoMap,

});

 这样好像看不出来我们想要的效果

我们可以加入一个gui调试开发工具 来进行调节,方便我们看到效果

gui.add(planeMaterial, "aoMapIntensity").min(0).max(1).name("ao贴图强度");

仔细看好像还是有效果的 

4. 我们继续加载透明度贴图 放入材质

// 加载透明度贴图
let alphaMap = textureLoader.load("/public/texture/door/height.jpg");

// 材质
let planeMaterial = new THREE.MeshBasicMaterial({
  color: 0xffffff,
  //纹理贴图
  map: texture,

  //允许透明
  transparent: true,

  //设置AO
  aoMap: aoMap,

  //透明度贴图
  alphaMap: alphaMap,
});

 发现成了这个效果。因为我们放入的贴图就是一个矩形的样子  暂时先去掉吧。!!!

5.接着依次加入 光照贴图  高光贴图 一起放入材质之中

//加载光照贴图
let lightMap = textureLoader.load("/public/texture/colors.png");

//加载高光贴图
let specularMap = textureLoader.load(
  "/public/texture/watercover/CityNewYork002_GLOSS_1K.jpg"
);

// 材质
let planeMaterial = new THREE.MeshBasicMaterial({
  color: 0xffffff,
  //纹理贴图
  map: texture,

  //允许透明
  transparent: true,

  //设置AO
  aoMap: aoMap,

  //透明度贴图
  // alphaMap: alphaMap,

  //光照贴图
  lightMap: lightMap,

  //反射强度(默认为1)
  // reflectivity: 0.1,

  //高光贴图
  specularMap: specularMap,
});

6.背景贴图的嵌入

背景地图一般都是hdr文件,我们需要先引入一个hdr加载器 并且实例化

//导入hdr加载器
import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader.js";

// RGBELoader 实例化
let rgbLoader = new RGBELoader();

 7.加载hdr贴图 背景的设置需要在回调函数之中完成

// 加载hdr贴图
rgbLoader.load(
  "/public/texture/Alex_Hart-Nature_Lab_Bones_2k.hdr",
  (envMap) => {
    //设置球形映射
    envMap.mapping = THREE.EquirectangularReflectionMapping;
    //设置环境纹理
    scene.background = envMap;
    //设置环境贴图(场景)
    scene.environment = envMap;
    //设置plane 环境贴图
    planeMaterial.envMap = envMap;
  }
);

这是我们场景的背景环境 直接用background、environment来实现。

这个时候,我们就给场景加入了一个环境,可以拖拽我们的鼠标进行背景的移动

 8.我们也可以使用gui调试开发工具,来动态的观察反射强度属性对做出来物料的影响

gui.add(planeMaterial, "reflectivity").min(0).max(1).name("反射强度");

 

 全部代码

//1.一个物体可以设置多个材质嘛

//1.设置定点组
//2 多个

//导入 threejs
import * as THREE from "three";
//导入轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
//导入lil.gui
// import * as dat from "dat.gui";  // 旧
import { GUI } from "three/examples/jsm/libs/lil-gui.module.min.js";

//导入hdr加载器
import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader.js";

// 创建场景
const scene = new THREE.Scene();
// 创建相机
const camera = new THREE.PerspectiveCamera(
  45, // 视角
  window.innerWidth / window.innerHeight, // 宽高比 窗口的宽高进行设置的
  0.1, // 近平面   相机最近最近能看到的物体
  1000 // 远平面   相机最远能看到的物体
);
// 创建渲染器
const renderer = new THREE.WebGLRenderer();
// 设置渲染器的大小  (窗口大小)
renderer.setSize(window.innerWidth, window.innerHeight);
// 将渲染器的dom元素添加到body中
document.body.appendChild(renderer.domElement);
camera.position.z = 5;
// 为了看到z轴
camera.position.y = 2;
// 设置x轴
camera.position.x = 2;
//设置相机的焦点 (相机看向哪个点)
camera.lookAt(0, 0, 0);

//添加世界坐标辅助器  (红色x轴,绿色y轴,蓝色z轴)一个线段 参数为 线段长度
const axesHelper = new THREE.AxesHelper(5);
//添加到场景之中
scene.add(axesHelper);

// 添加轨道控制器 (修改侦听位置)  一般监听画布的事件  不监听document.body
const controls = new OrbitControls(camera, renderer.domElement);
// 这里传递阻塞掉了 会导致无法点击
// const controls = new OrbitControls(camera, document.body);

//渲染函数
function animate() {
  controls.update();
  //请求动画帧
  requestAnimationFrame(animate);
  //旋转网格体
  // cube.rotation.x += 0.01;
  // cube.rotation.y += 0.01;
  //渲染
  renderer.render(scene, camera);
}
animate();
//渲染

// 监听窗口的变化 重新设置渲染器的大小 画布自适应窗口
window.addEventListener("resize", () => {
  // 重新设置渲染器的大小
  renderer.setSize(window.innerWidth, window.innerHeight);
  // 重新设置相机的宽高比
  camera.aspect = window.innerWidth / window.innerHeight;
  // 重新计算相机的投影矩阵
  camera.updateProjectionMatrix();
});

//创建gui实例
const gui = new GUI();

// 创建纹理加载器
const textureLoader = new THREE.TextureLoader();

//加载纹理
let texture = textureLoader.load(
  "/public/texture/watercover/CityNewYork002_COL_VAR1_1K.png"
);

//加载AO纹理   ao = 环境遮挡效果
let aoMap = textureLoader.load(
  "/public/texture/watercover/CityNewYork002_AO_1K.jpg"
);

// 加载透明度贴图
let alphaMap = textureLoader.load("/public/texture/door/height.jpg");

//加载光照贴图
let lightMap = textureLoader.load("/public/texture/colors.png");

//加载高光贴图
let specularMap = textureLoader.load(
  "/public/texture/watercover/CityNewYork002_GLOSS_1K.jpg"
);

// RGBELoader 实例化
let rgbLoader = new RGBELoader();

// 加载hdr贴图
rgbLoader.load(
  "/public/texture/Alex_Hart-Nature_Lab_Bones_2k.hdr",
  (envMap) => {
    //设置球形映射
    envMap.mapping = THREE.EquirectangularReflectionMapping;
    //设置环境纹理
    scene.background = envMap;
    //设置环境贴图(场景)
    scene.environment = envMap;
    //设置plane 环境贴图
    planeMaterial.envMap = envMap;
  }
);

// 物料
let planeGeometry = new THREE.PlaneGeometry(1, 1);
// 材质
let planeMaterial = new THREE.MeshBasicMaterial({
  color: 0xffffff,
  //纹理贴图
  map: texture,

  //允许透明
  transparent: true,

  //设置AO
  aoMap: aoMap,

  //透明度贴图
  // alphaMap: alphaMap,

  //光照贴图
  lightMap: lightMap,

  //反射强度(默认为1)
  // reflectivity: 0.1,

  //高光贴图
  specularMap: specularMap,
});
let plane = new THREE.Mesh(planeGeometry, planeMaterial);
scene.add(plane);

gui.add(planeMaterial, "aoMapIntensity").min(0).max(1).name("ao贴图强度");
gui.add(planeMaterial, "reflectivity").min(0).max(1).name("反射强度");

 

 

 

 

 

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

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

相关文章

Windows安装Hadoop运行环境

1、下载Hadoop 2、解压Hadoop tar zxvf hadoop-3.1.1.tar.gz3、设置Hadoop环境变量 3.1.1、系统环境变量 # HADOOP_HOME D:\software\hadoop-3.1.13.1.2、Path 环境变量 %HADOOP_HOME%\bin %HADOOP_HOME%\sbin3.1.3、修改Hadoop文件JAVA_HOME 注 : 路径中不要出现空格 ,…

达索系统SOLIDWORKS流体分析网格划分失败,大多是这2种原因

SOLIDWORKS Flow Simulation 是直观的流体力学 (CFD) 分析软件,该软件功能强大、操作人性化,快速轻松的分析产品内部或外部流体的流动情况,以用来改善产品性能和功能。 当流体分析运行网格划分时,提示失败。 这是由于凸起面与圆…

【黑马甄选离线数仓day01_项目介绍与环境准备】

1. 行业背景 1.1 电商发展历史 电商1.0: 初创阶段20世纪90年代,电商行业刚刚兴起,主要以B2C模式为主,如亚马逊、eBay等 ​ 电商2.0: 发展阶段21世纪初,电商行业进入了快速发展阶段,出现了淘宝、京东等大型电商平台&a…

日本it就职培训机构,日本IT行业的三种类型

日本的IT产业一直保持增长趋势,市场规模逐年增加,在日本所有产业中占据很大比例。由于日本老龄化严重,日本国内的IT人才无法满足需求,为缓解这一问题,日本将引进外国优秀IT人才作为一项国策,日本IT行业不仅…

Vue-报错No “exports“ main defined in xx

vue报错:No "exports" main defined in F:\wjh\vue#Practice\EasyQuestionnaire-web-master\EasyQuestionnaire-web-master\node_modules\babel\helper-compilation-targets\package.json 1.在文件中找到该路径的package.json文件, 2.按照提示…

Vue 重写push和replace方法,解决:Avoided redundant navigation to current location

当我们使用编程式路由导航跳转路径时,如果我们两次携带同样的参数进行跳转,会进行页面报错: 那产生这个问题的原因是什么呢? 我们接收并输出调用push方法返回的结果: 会发现这是一个Promise对象 我们都知道&#xff…

【AI】行业消息精选和分析(11月22日)

今日动态 👓 Video-LLaVA:视觉语言模型革新: - 图像和视频信息转换为文字格式。 - 多模态理解能力,适用于自动问答系统等。 📈 百度文心一言用户数达7000万: 🔊 RealtimeTTS:实时文本…

【EI会议征稿】2024年新能源技术与电力系统国际学术研讨会(NETPS 2024)

2024年新能源技术与电力系统国际学术研讨会(NETPS 2024) 2024 International Symposium on New Energy Technologies and Power Systems 2024年新能源技术与电力系统国际学术研讨会(NETPS 2024)将于2024年3月22-24日在中国南京隆…

Microsoft Dynamics 365:Dynamics NAV 2016 Setup 安装(澳洲版)

今天与大家一起分享 CU 06 for Microsoft Dynamics NAV 2016 的 Setup 安装(澳洲版)的安装,步骤截图如下。包括下载地址、操作、安装步骤、问题解决等。 1、下载地址(微软官方) https://support.microsoft.com/en-us…

算法——滑动窗口(Sliding Window)

一、背景知识 滑动窗口算法(Sliding Window): 在给定数组 / 字符串上维护一个固定长度或不定长度的窗口。可以对窗口进行滑动操作、缩放操作,以及维护最优解操作。题型一:固定长度题型二:不固定长度 二、例…

spring-boot-admin-starter-server监控springboot项目

文章目录 场景实现具体操作展示 场景 监控三件套Prometheus、Grafana、Alertmanager 部署起来太复杂,如果公司没有运维而且项目很小就可以使用spring-boot-admin-starter-server替代。这个包使用起来还是很简单的, 下面就实现一个对springCloud项目的监控 实现 参考 项目 具体操…

一篇五分生信临床模型预测文章代码复现——Figure 10.机制及肿瘤免疫浸润(六)

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

RabbitMQ快速入门(简单收发消息)

文章目录 前言一、数据隔离1.用户管理2.virtual host 二、控制台收发1.交换机2.队列3.绑定 三、编程式收发1.依赖和配置2.收发信息 总结 前言 1.了解数据隔离 2.RabbitMQ控制台收发信息 3.SpringBoot整合RabbitMQ收发信息 一、数据隔离 1.用户管理 点击Admin选项卡&#xff0…

配置静态 Eth-trunk

1、需求 1)交换网络中存在2个 VLAN – 10 和 20 2)每个VLAN的IP地址为:192.168.xx.0/24(xx为 vlan 号) 3)对交换机之间的链路进行链路捆绑,增加互联带宽 4)确保同 VLAN的 PC 之间互…

第十五章---I/O(输入/输出)

15.1输入输出流 流是一组有序的数据序列,根据操作的类型,可分为输入流和输出流两种。I/O(Input/Output,(输出)流提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。虽然 I/O 流疆盘文件存取有关,但是程序的源和目…

Doris动态分区(十四)

动态分区是在 Doris 0.12 版本中引入的新功能。旨在对表级别的分区实现生命周期管理(TTL),减少用户的使用负担。 目前实现了动态添加分区及动态删除分区的功能。动态分区只支持 Range 分区。 原理 在某些使用场景下,用户会将表…

坚鹏:湘潭市银行业协会BLM银行数字化转型战略培训圆满结束

在数字化转型背景下,湘潭市银行业协会为了落实监管政策《关于银行业保险业数字化转型的指导意见》,充分认识到学习银行银行数字化转型战略的价值和重要性,特别举办《2023年数字化转型战略专题培训班》。为了改变大家的认知,为了拓…

Ajax入门-Express框架介绍和基本使用

电脑实在忒垃圾了,出现问题耗费了至少一刻钟time,然后才搞出来正常的效果; 效果镇楼 另外重新安装了VScode软件,原来的老是报错,bug。。; 2个必要的安装命令; 然后建立必要的文件夹和文件&…

回转窑无线测温系统解决方案

方案概述(以回转窑监测为例) 回转窑通常使用在热电厂、钢铁厂、冶金厂及干燥设备行业。而这些行业一般具有高温、潮湿、粉尘、高压、不便布线或现场无法提供电源等环境特点。同时,回转窑在工作中,具有旋转、高温等特点。为此&…

upload-labs关卡12(基于白名单的%00截断绕过)通关思路

文章目录 前言一、靶场需要了解的前置知识1、%00截断2、0x00截断3、00截断的使用条件1、php版本小于5.3.292、magic_quotes_gpc Off 二、靶场第十二关通关思路1、看源代码2、bp抓包%00截断3、验证文件是否上传成功 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&…