threejs材质的贴图(四)

news2024/11/23 12:10:03

效果

在这里插入图片描述

代码实现

import './style.css'
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'//相机轨道控制器
import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader.js"//加载hdr文件作为环境贴图
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js'


//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓创建场景
const scene = new THREE.Scene()
// 在场景中添加坐标辅助器
const axesHelper = new THREE.AxesHelper(10)//数据表示坐标轴的长度
scene.add(axesHelper)//将坐标轴添加到场景中
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑创建场景


//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓创建透视相机
const camera = new THREE.PerspectiveCamera(
    45,//视角,可视范围
    window.innerWidth / window.innerHeight,//摄像机的宽高比
    0.1,//摄像机最近能看到的距离
    1000//摄像机最远能看到的距离
)
// 设置相机的位置
camera.position.x = 8
camera.position.y = 8
camera.position.z = 8
camera.lookAt(0, 0, 0)//摄像机的朝向
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑创建透视相机


//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓创建渲染器
const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)//渲染器的尺寸大小
document.body.appendChild(renderer.domElement)//renderer.domElement就是canvas元素
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑创建渲染器


//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓添加轨道控制器
// 添加相机轨道控制器
const controls = new OrbitControls(camera, renderer.domElement)
controls.enableDamping = true //打开惯性阻尼
controls.dampingFactor = 0.05//阻尼系数
controls.autoRotate = false//是否自动旋转(围绕着lookAt的坐标旋转)
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑添加轨道控制器


// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓添加材质贴图开始
const plan = new THREE.PlaneGeometry(5, 5)//创建一个平面
let textureLoader = new THREE.TextureLoader()//纹理加载器
// 此处默认加载的是public目录下的文件,如果要加载src下的文件,需要使用require()的形式
let texture = textureLoader.load('./.....xxx.png')//加载纹理贴图
texture.colorSpace = THREE.SRGBColorSpace//添加颜色深度
// texture.colorSpace = THREE.LinearSRGBColorSpace//线性颜色
// texture.colorSpace = THREE.NoColorSpace//无颜色深度

let aoMap = textureLoader.load('./.....xxx.png')//加载oa贴图(环境遮挡贴图),让夹缝之间的图更加真实
let alphaMap = textureLoader.load('./.....xxx.png')//加载透明度贴图,黑色全透明,白色完全不透明
let lightMap = textureLoader.load('././.....xxx.png')//加载光照贴图,模拟环境光的颜色
let specularMap = textureLoader.load('././.....xxx.png')//加载高光贴图,黑色不反射,白色反射环境光
let rgbeloader = new RGBELoader()//加载hdr文件作为环境贴图
rgbeloader.load('././.....xxx.hdr', (envMap) => {
    envMap.mapping = THREE.EquirectangularReflectionMapping;//设置球形贴图
    scene.background = envMap //设置背景的环境贴图
    scene.environment = envMap //设置场景的环境贴图
    material.envMap = envMap //设置平面的环境贴图
})
const material = new THREE.MeshBasicMaterial({
    color: new THREE.Color('gray'),
    side: THREE.DoubleSide,
    map: texture,//纹理贴图
    aoMap,//环境遮挡贴图
    // alphaMap,//透明度贴图
    aoMapIntensity: 1,
    // lightMap,//光照贴图
    transparent: true,//纹理透明是否开启
    specularMap,//高光贴图
    reflectivity: 0.5//高光贴图反射区的反射程度
})

const cube = new THREE.Mesh(plan, material)
scene.add(cube)

let gui = new GUI()
gui.add(material, 'aoMapIntensity').min(0).max(1).name('oa贴图')
gui.add(material, 'reflectivity').min(0).max(1).name('高光贴图反光部分反光度')
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑添加材质贴图结束


//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓渲染
window.addEventListener('resize', () => {
    camera.aspect = window.innerWidth / window.innerHeight//重置相机的宽高比
    camera.updateProjectionMatrix()//更新相机的投影矩阵
    renderer.setSize(window.innerWidth, window.innerHeight)//重置渲染器的宽高比
})

function animate() {
    controls.update()
    renderer.render(scene, camera)//渲染=相机+场景
    requestAnimationFrame(animate)//下一帧继续调用渲染函数
}
animate()
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑渲染

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

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

相关文章

如何训练AI大模型?熬夜爆肝整理大全

随着人工智能技术的快速发展,大型预训练模型在自然语言处理、计算机视觉、语音识别等领域取得了显著成果。这些模型通过在海量数据上进行预训练,能够捕捉到丰富的特征信息,为各种下游任务提供强大的支持。然而,训练AI大模型面临着…

船舶能源新纪元:智能管理引领绿色航运潮流

在蓝色的大海上,无数船只乘风破浪,为全球的贸易和文化交流贡献着力量。然而,随着环保意识的提升和可持续发展的要求,船舶的能源消耗和排放问题逐渐成为了人们关注的焦点。在这个关键时刻,船舶能源管理系统应运而生&…

山体滑坡监测利器:传感器与智能监测平台的应用

山体滑坡,这一地质灾害的代名词,指的是山坡上的土体或岩体在重力作用下,因自然或人为因素而向下滑动的现象。滑坡具有突发性、隐蔽性、危害性和破坏性等特征,因此,对于山体滑坡的监测工作显得尤为重要。本文将探讨山体…

鸿蒙开发网络管理:【@ohos.request (上传下载)】

上传下载 说明: 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import request from ohos.request;限制与约束 默认支持https,如果要支持http,需要在config.json里…

C++ 21 之 将成员属性设置为私有

c21将成员属性设置为私有.cpp #include <iostream> using namespace std; #include <string>class person08{ private:string p_name;int p_age;int p_pwd; public:// 设置名字void setName(string name){p_name name;}// 获取名字string getName(){return p_nam…

数据结构习题

第一章 绪论 与数据元素本身的形式、内容、相对位置、个数无关的是数据的 逻辑结构。 第二章 线性表 在一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变&#xff0c;平均要移动的元素个数为 63.5。 n/2 单链表的存储密度 小于1。 创建一个包括n个结点的有序单链…

AI在线免费视频工具2:视频配声音

1、视频配声音 https://deepmind.google/discover/blog/generating-audio-for-video/ https://www.videotosoundeffects.com/ &#xff08;免费在线使用&#xff09;

6-18作业

作业1&#xff1a; mywidget.h #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include <QLabel> #include <QMessageBox>QT_BEGIN_NAMESPACE namespace Ui { class myWidget; } QT_END_NAMESPACEclass myWidget : public QWidget {Q_OBJECTpu…

2024/06/18--代码随想录算法8/17| 股票问题

121.买卖股票的最佳时机 力扣链接 动规五部曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][0] 表示第i天持有股票所得最多现金,dp[i][1] 表示第i天不持有股票所得最多现金确定递推公式 dp[i][0] max(dp[i-1][0], -price[i]) dp[i][1]max(dp[i-1][1], …

高压防触碰预警装置,工期重要还是命重要?

“说了多少遍了&#xff0c;不要在高压线下赶工期”吊车违规施工碰撞到高压线&#xff0c;导致供电线路跳闸停电事故&#xff0c;现场火花四溅及其危险&#xff0c; 高压线路被外力破坏的情况&#xff0c;违规施工、赶工期、视觉盲区导致线路外破等情况&#xff0c;想必大家也…

【小白专用24.6.18】C# SqlSugar:连接数据库实现简单的,增、删、改、查

【小白专用 已验证24.6.18】C# SqlSugar操作MySQL数据库实现增删改查-CSDN博客 通过NuGet包管理器搜索SqlSugar&#xff08;MySql还要安装MySql.Data、Newtonsoft.Json&#xff09;包并安装 SqlSugarClient db new SqlSugarClient(new ConnectionConfig(){ConnectionString …

范式(上)-第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、可用关系模式

一、范式的作用 根据关系模式间属性的数据依赖来评价关系模式的好坏 以下我们将基于函数依赖的范围内来讨论范式 二、范式的定义 1、数据依赖满足一定约束的关系模式是范式 2、范式是符合某一级别的关系模式的集合&#xff0c;关系模式R为第几范式可记为 三、第一范式&am…

【Java】已解决com.mysql.cj.jdbc.exceptions.CommunicationsException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决com.mysql.cj.jdbc.exceptions.CommunicationsException异常 一、分析问题背景 com.mysql.cj.jdbc.exceptions.CommunicationsException是Java程序在使用MySQL Connector/J与…

Docker(三)-Docker常用命令

1.run run命令执行流程:2.帮助启动类命令 2.1 启动docker systemctl start docker2.2 停止docker systemctl stop docker2.3 重启docker systemctl restart docker2.4查看docker状态 systemctl status docker2.5开机启动 systemctl enable docker2.6查看docker概要信息 …

ch552g使用torch-pad测试触摸按键遇到的问题

基本工作原理 通过设置好功能在寄存器和控制寄存器检测引脚输入的值。 实际检测阶段分为3个步骤&#xff1a;第一阶段&#xff1a;选择需要检测的阶段&#xff0c;选择扫描周期1或2ms&#xff0c;开启触摸按键中断&#xff0c;然后在87us内为充电准备阶段&#xff0c;87us内数…

第二十三篇——香农第二定律(二):到底要不要扁平化管理?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 对于企业的理解&#xff0c;扁平化的管理&#xff0c;如果从香农第二定律…

ORA-12560: TNS:协议适配器错误

项目场景&#xff1a; 由于最近一直没有连接oracle&#xff0c;然后之前windows也是正常可以启动oracle&#xff0c;正常连接。无论是SQL Developer还是SQL PLUS命令&#xff0c;都能正常连接和操作。 问题描述 这两天刚好用SQL Developer工具连接&#xff0c;然后报错&#…

【Java毕业设计】基于SpringBoot开发的图书馆管理系统

文章目录 摘 要目录1 绪论1.1 课题背景和意义1.2 国内外研究现状1.2.1 国外研究现状1.2.2 国内研究现状 1.3 课题主要内容 2 开发相关技术介绍2.1 系统开发环境2.2 系统开发技术2.2.1 Spring Boot框架2.2.2 MySQL数据库2.2.3 MVC模式 3 系统规划3.1 初步调查分析3.2 可行性分析…

数字孪生流域:定义、组成等

数字孪生流域&#xff1a;定义、组成等 1 数字孪生流域&#xff08;Digital Twin Basin/Watershed&#xff09;总则1.1 定义1.2 适用范围1.3 建设目标1.4 建设原则 2 数字孪生流域框架与组成2.1 数字孪生流域框架2.2 数字孪生流域组成2.2.1 数字孪生平台2.2.2 信息化基础设施 3…

博雅BOYAMIC小魔方测评:外设与内核并重,诠释硬核旗舰体验

撰稿|行星 来源|贝多财经 视频流量时代的到来&#xff0c;使得用户生成内容端对于视频质量的要求拾级而上。 图像、画面构成情节发展&#xff0c;影响视频内容的表达&#xff0c;而观众对内容的直接感知&#xff0c;则直接取决于视频声音呈现的品质。正因如此&#xff0c;视…