Three.js——十二、MeshPhysicalMaterial清漆层、粗糙度、物理材质透光率以及折射率(结尾附代码)

news2025/2/3 19:02:49

环境贴图作用测试

MeshPhysicalMaterial清漆层

MeshPhysicalMaterialMeshStandarMaterial都是拥有金属度metalness、粗糙度roughness属性的PBR材质,MeshPhysicalMaterialMeshStandarMaterial的子集,除了继承了他的这些属性以外,还新增了清漆、透光率、反射率、光泽、折射率等等

清漆层属性.clearcoat

清漆层属性.clearcoat可以用来模拟物体表面刷了一层透明的模.clearcoat的范围0到1,默认0。

const material = new THREE.MeshPhysicalMaterial( {
	clearcoat: 1.0,//物体表面清漆层或者说透明涂层的厚度
} );

关于MeshPhysicalMaterial材质

MeshPhysicalMaterial是Three.js中的一种材质类型,它是基于物理的渲染(PBR)材质,可以模拟真实世界中的光照和材质反射。它支持金属和非金属材质,可以设置粗糙度、金属度、环境光遮蔽、法线贴图、位移贴图等属性,以实现更真实的渲染效果。MeshPhysicalMaterial还支持高光反射和透明度,可以用于创建逼真的玻璃、水、金属等材质。在使用MeshPhysicalMaterial时,需要注意其计算量较大,可能会影响性能,因此需要根据实际情况进行优化。

清漆层粗糙度.clearcoatRoughness

是指表面透明图层的粗糙程度范围是0-1。

使用场景

这种效果可以用来做车子的模型,比如车窗,外壳,玻璃等。
车外壳油漆效果,你可以通过PBR材质的清漆层属性.clearcoat和清漆层粗糙度.clearcoatRoughness属性模拟。

const mesh = gltf.scene.getObjectByName('外壳');
mesh.material = new THREE.MeshPhysicalMaterial( {
	clearcoat: 1.0,//物体表面清漆层或者说透明涂层的厚度
	clearcoatRoughness: 0.1,//透明涂层表面的粗糙度
} );

实际情况可以根据模型进行调整。调整可以通过GUI进行调试,实际调试效果可以在上一章中查看。

物理材质透光率

为了更好的模拟玻璃、半透明塑料一类的视觉效果,可以使用此属性来代替普通透明属性.opacity
使用.transmission属性设置Mesh透明度,即便完全透射的情况下仍可保持高反射率。
使用方式:

    const geometry = new THREE.TorusKnotGeometry(10, 3, 100, 16);
    const material = new THREE.MeshPhysicalMaterial({
      color: 0x30cff8,
      transmission: 1,
    });
    const torusKnot = new THREE.Mesh(geometry, material);
    scene.add(torusKnot);

效果:
请添加图片描述

折射率.ior

非金属材料的折射率从1.0到2.333。默认值为1.5。

  const geometry = new THREE.TorusKnotGeometry(10, 3, 100, 16);
    const material = new THREE.MeshPhysicalMaterial({
      color: 0x30cff8,
      transmission: 1,
       ior:1.5,
    });
    const torusKnot = new THREE.Mesh(geometry, material);
    scene.add(torusKnot);

请添加图片描述

解析gltf材质

一般默认使用标准网格材质MeshStandardMaterial,如果gltf有的材质具有.clearcoat.transmission等属性,标准网格材质MeshStandardMaterial无法表达的时候,会用物理网格材质MeshPhysicalMaterial来解析gltf材质。

gltf.scene.traverse(function(obj) {
    if (obj.isMesh) {
        console.log('obj.material',obj.material);
    }
});
console.log('外壳',mesh1.material);
console.log('玻璃',mesh2.material);

完整代码:

/*
 * @Author: SouthernWind 
 * @Date: 2023-06-14 16:38:59 
 * @Last Modified by: SouthernWind 
 * @Last Modified time: 2023-06-14 16:39:32
 */
<template>
  <div class="container" ref="container"></div>
</template>

<script setup>
import * as THREE from "three";
// 轨道
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
import { GUI } from "three/addons/libs/lil-gui.module.min.js";

import { ref, reactive, onMounted } from "vue";
// 三个必备的参数
let scene,camera,renderer,controls,mesh,material,group,texture,gui,textureCube;

onMounted(() => {
  // 外层需要获取到dom元素以及浏览器宽高,来对画布设置长宽
  // clientWidth等同于container.value.clientWidth
  let container = document.querySelector(".container");
  const { clientWidth, clientHeight } = container;
  console.log(clientHeight);

  // 首先需要获取场景,这里公共方法放在init函数中
  const init = () => {
    scene = new THREE.Scene();
    // 给相机设置一个背景
    scene.background = new THREE.Color(0xaaaaaa);
    // 透视投影相机PerspectiveCamera
    // 支持的参数:fov, aspect, near, far
    camera = new THREE.PerspectiveCamera(60,clientWidth / clientHeight,0.001,6000);
    // 相机坐标
    camera.position.set(30, 30, 30);

    // 相机观察目标
    camera.lookAt(scene.position);
    // 渲染器
    renderer = new THREE.WebGLRenderer({
      antialias: true,
    });
    renderer.shadowMap.enabled = true;
    renderer.shadowMap.type = THREE.PCFSoftShadowMap;
    // 渲染多大的地方
    renderer.setSize(clientWidth, clientHeight);
    /* renderer.outputEncoding = THREE.sRGBEncoding; */
    // const axesHelper = new THREE.AxesHelper(150);
    // scene.add(axesHelper);
    container.appendChild(renderer.domElement);
    addBox();
    console.log("查看当前屏幕设备像素比", window.devicePixelRatio);
  };
  init();
  function addBox() {
    gui = new GUI();
    const geometry = new THREE.TorusKnotGeometry(10, 3, 100, 16);
    const material = new THREE.MeshPhysicalMaterial({
      color: 0x30cff8,
      metalness: 0,
      roughness: 0,
      transmission: 0.5,
      ior: 1.5,
    });
    const torusKnot = new THREE.Mesh(geometry, material);
    scene.add(torusKnot);
    gui.add(material, "transmission", 0, 1);
    gui.add(material, "ior", 1, 2.333);
  }

  // 相机控件
  const control = () => {
    controls = new OrbitControls(camera, renderer.domElement);
    controls.addEventListener("change", function () {});
  };
  control();

  // 光源
  const linght = () => {
    const pointLight = new THREE.PointLight(0xffffff, 1.0);
    // pointLight.position.set(400, 0, 0);//点光源放在x轴上
    pointLight.position.set(100, 60, 50); //设置光源的位置
    // 光源和网格模型Mesh对应一样是三维场景的一部分,自然需要添加到三维场景中才能起作用。
    scene.add(pointLight); // 添加光源到场景中

    /*  const pointLight = new THREE.AmbientLight(0xffffff, 1.0);
    pointLight.position.set(150, 150, 150);
        scene.add(pointLight); */
    const pointLightHelper = new THREE.PointLightHelper(pointLight, 1);
    scene.add(pointLightHelper);
  };
  linght();
  const render = () => {
    renderer.render(scene, camera);
    requestAnimationFrame(render);
  };
  render();
  window.addEventListener("resize", () => {
    // 更新摄像头
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, window.innerHeight);
  });
});
</script>

<style>
.container {
  width: 100%;
  height: 100vh;
  position: relative;
  z-index: 1;
}
</style>

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

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

相关文章

NDK OpenGL实现美颜功能

NDK​系列之OpenGL实现美颜特效&#xff0c;本节主要是在上一节大眼萌的特效视上增加美颜特效。 OpenGL视频特效系列&#xff1a; NDK OpenGL渲染画面效果 NDK OpenGL离屏渲染与工程代码整合 NDK OpenGL仿抖音极快极慢录制特效视频 NDK OpenGL与OpenCV实现大眼萌特效 NDK…

java并发编程 11:JUC之ReentrantLock使用与原理

目录 使用可重入可打断锁超时公平锁条件变量 原理非公平锁实现原理源码流程 锁重入原理可打断原理与不可打断原理公平锁原理条件变量原理await流程signal流程 使用 ReentrantLock是可冲入锁&#xff0c;与 synchronized 一样&#xff0c;都支持可重入。但是相对于 synchronize…

kafka第三课-可视化工具、生产环境问题总结以及性能优化

一、可视化工具 https://pan.baidu.com/s/1qYifoa4 密码&#xff1a;el4o 下载解压之后&#xff0c;编辑该文件&#xff0c;修改zookeeper地址&#xff0c;也就是kafka注册的zookeeper的地址&#xff0c;如果是zookeeper集群&#xff0c;以逗号分开 vi conf/application.conf 启…

如何刻录光盘

如何刻录光盘 1 、将光盘放入光驱&#xff0c;选择“用于CD/DVD播放机” &#xff0c;该模式下&#xff0c;刻录在光盘的文件无法进行编辑和删除 2 、将需要刻录的文件拷贝至光盘内&#xff0c;则会在“准备好写入光盘中的文件”下显示拷贝进去的文件&#xff0c;此时文件还没…

EDI 工作流操作指南

一个完整的EDI工作流中&#xff0c;起始端为通常为文件传输端口&#xff1a;如AS2、OFTP等&#xff0c;末端为数据库端口。此前的文章中我们对AS2端口以及数据库端口已做了详细介绍&#xff0c;本文主要介绍 EDI 文件的格式转换以及映射。 如下图所示&#xff0c;工作流界面中…

安装blissOS重启后无法进入图形化界面

重启blissOS 重启时&#xff0c;按e键两下 进入 上图是一个可编辑页面&#xff0c;不要删除修改前面的内容&#xff0c;移动光标前往quiet&#xff0c;然后删除quiet输入“ nomodeset xforceseva ”&#xff0c;然后按下回车 然后按回车&#xff0c;按b键进入系统 在set-…

class组件constructor方法

class组件constructor方法 https://blog.csdn.net/m0_37557930/article/details/116228217 https://blog.csdn.net/qq_39207948/article/details/113143131 ​ 为何我们使用子类继承父类&#xff0c;就必须在 constructor( ) 方法中调用 super( ) 方法&#xff0c;否则新建实…

【C】文件操作详解

这里写目录标题 文件操作什么是文件文件名文件类型文本文件二进制文件 文件缓冲区文件指针文件的打开和关闭fopenfclose 文件的顺序读写fgetcfputcfgetsfputcfscanffprintffwritefread比较scanf/fscanf/sscanfsscanf 比较printf/fprintf/sprintfsprintf 文件的随机读写fseekfte…

周考一之重做

输入一个学生的成绩&#xff0c;如果学习成绩>90分的同学用A表示&#xff0c;60-89分之间用B表示&#xff0c;60分以下的用C表示(10) public static void main(String[] args){ Scanner scanner new Scanner(System.in); System.out.println(“请输入学生成绩&#xff1a;…

linux图形界面总结---X、Xorg、WM、QT、GTK、KDE、GNOME的区别与联系

文章目录 一、 linux图形界面二、X协议三、Xfree86 Xorg四、WM(window manager:窗口管理器)五、X协议的Client端实现六、KDE、GNOME、QT和GTK直接关系七、参考&#xff1a; 一、 linux图形界面 linux本身没有图形界面&#xff0c;linux现在的图形界面的实现只是linux下的应用程…

值类型与引用类型

常见的值类型&#xff1a;int&#xff0c;long&#xff0c; short&#xff0c; float&#xff0c; double&#xff0c; byte&#xff0c; char&#xff0c; enum&#xff0c; struct...... 常见的引用类型&#xff1a;字符串&#xff0c; 数组&#xff0c; 类...... 区别&…

附录10-3.JS正则常见案例

目录 1 某一个字符串重复出现两次 2 多行字符串转变为数组套对象 3 多个正则表达式匹配一个字符 4 在指定的字符前加一些什么东西 1 某一个字符串重复出现两次 match的方式如果你使用小括号分组&#xff0c;第一个结果是符合正则的结果&#xff0c;也就是我查出来了 l…

Excel表格怎么样转换成PDF?分享这3个方法免费转换!

在日常办公和学习中&#xff0c;我们常常需要将Excel表格转换为PDF格式以便分享、打印或存档。本文将介绍三种简便的免费方法。方法一介绍了记灵在线工具&#xff0c;方法二使用办公软件&#xff08;WPS或Office&#xff09;&#xff0c;方法三则使用Adobe软件。 方法一&#…

大二毕设.2-自研Spring框架

目录 项目描述&#xff1a; 基本演示 提取标记类 IOC容器的装载 IOC容器的操作 DI依赖注入 Aspect排序 AOP MVC 功能实现讲解 项目描述&#xff1a; 为了更好地学习 Spring 的核心&#xff0c;参考 Spring 源码实现的一个简易框架当前已实现 IOC&#xff0c;DI依赖注…

交叉编译gRPC初实践

快速开始 一、创建android编译目录&#xff0c;在grpc源码根目录下运行&#xff1a; mkdir -p cmake/build_android && cd cmake/build_android 二、cmkae生成对应Makefile等编译所需的文件 cmake -DCMAKE_TOOLCHAIN_FILE/zhuyazhou/DDS/tools_dds/android-ndk-r25/b…

Python(Conda)环境迁移(从win10到macos12.5)笔记

文章目录 背景环境 1、通过conda迁移2、通过python迁移3、最后&#xff08;逐一安装&#xff09; 背景环境 win10是以前安装的conda和py。目前需要导出的环境的版本为py3.10.4。macos是重新安装的conda&#xff0c;目前有的环境是py3.11.4。我是先进conda用刚安装好的base创建…

idea 有时提示找不到类或者符号,日志报java: 找不到符号的解决

解决一&#xff1a; idea maven编译成功&#xff0c;运行失败提示找不到符号&#xff0c;主要是get和set方法找不到符号&#xff0c;此时就是idea的lombok版本冲突 IDEA版本导致的Lombok失效&#xff0c;需要更新lombok版本到1.18.14及之后版本得到解决 <dependency>&…

计划、逻辑与智能

有计划性是指基于目标、目的或问题&#xff0c;通过制定计划、设立步骤和执行策略来达成预期结果的思维和行为。有计划的智能强调理性、逻辑和目标导向&#xff0c;它能够帮助人们更好地组织和管理资源&#xff0c;解决复杂的问题&#xff0c;并实现预期的目标。 无计划性则代表…

Seal AppManager如何基于Terraform简化基础设施管理

作者简介 陈灿&#xff0c;数澈软件Seal 后端研发工程师&#xff0c;曾在腾讯负责敏捷研发体系建设以及 DevOps 解决方案的敏捷实践。在敏捷研发和产品效能提升有着丰富的经验&#xff0c;致力于构建一站式研发友好的平台工程解决方案。现在是 Seal 平台工程团队核心研发人员。…

配置spark

配置spark Yarn 模式Standalone 模式Local 模式 Yarn 模式 tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /opt/module cd /opt/module mv spark-3.0.0-bin-hadoop3.2 spark-yarn修改 hadoop 配置文件/opt/module/hadoop/etc/hadoop/yarn-site.xml, 并分发 <!--是否启动一…