3.js - 反射率(reflectivity) 、折射率(ior)

发布于:2024-06-30 ⋅ 阅读:(134) ⋅ 点赞:(0)

没啥太大的感觉

反射率 reflectivity

  • 概念

    
      反射率:指的是,材质表面反射光线的能力
    
      反射率,用于控制材质对环境光,或光源的反射程度
    
      反射率越高,材质表面反射的光线越多,看起来就越光亮
    
    
  • 使用

    
      适用于,需要表现高反表面的材质,如:金属、镜子
    
      可以通过,调整反射率,来模拟不用材质的光泽度
    
    
  • 注意事项

    
      1、
        反射率的具体实现效果,可能与three.js的版本和材质类型而异,
    
        在某些材质中,如:Mesh-Standard-Material,可能不直接提供'reflectivity'属性,而是通过其他方式(如:环境贴图、反射贴图)来间接控制反射效果
    
      2、在使用反射率时,需要考虑光源、材质的其他属性(如:金属度、粗糙度),以达到逼真的效果
    
    


折射率 ior

  • 概念

    
      折射率,是指,光从一种介质进入另一种介质时,光线的传播方向会发生改变的现象;
    
      在3.js中,折射率用于,模拟透明、半透明材质(如:玻璃、水)对光线的折射效果,不同的材质具有不同的折射率;
    
    
  • 使用

    
      适用于,需要表现,透明、半透明效果的材质
    
      通过设置折射率属性,可以模拟真实世界中,光线穿过透明材质时的弯曲现象
    
    
  • 注意事项

    
      折射率属性的效果,通常在支持透明、半透明渲染的材质中体现,如:Mesh-Physical-Material
    
      在使用反射率时,需要考虑光源、材质的其他属性(如:透光率、粗糙度),以达到逼真的效果
    
    

代码自己看吧


// @ts-nocheck
// 引入three.js
import * as THREE from 'three'
// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
// 导入lil.gui
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js'
// 导入tween
import * as TWEEN from 'three/examples/jsm/libs/tween.module.js'
// 导入hdr加载器(专门加载hdr的)
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'
// 导入gltf加载器
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'

//#region
const scence = new THREE.Scene()

const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
camera.position.set(2, 2, 5) // 设置相机位置
camera.lookAt(0, 0, 0)

const renderer = new THREE.WebGLRenderer({
  antialias: true // 开启抗锯齿
})
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)
//#endregion

//#region
// 添加世界坐标辅助器,红色-X轴; 绿色-Y轴; 蓝色-Z轴
const axesHelper = new THREE.AxesHelper(5)
scence.add(axesHelper)

const controls = new OrbitControls(camera, renderer.domElement)
// 设置带阻尼的惯性
// controls.enableDamping = true
// 设置阻尼系数
controls.dampingFactor = 0.05

// 每一帧根据控制器更新画面
function animate() {
  // 如果,需要控制器带有阻尼效果,或者自动旋转等效果,就需要加入`controls.update()`
  controls.update()
  // `requestAnimationFrame`:在屏幕渲染下一帧画面时,触发回调函数来执行画面的渲染
  requestAnimationFrame(animate)
  // 渲染
  renderer.render(scence, camera)
  // 更新tween
  TWEEN.update()
}
animate()
//#endregion

// --------------------------------------------------------------
// --------------------------------------------------------------

// 设置贴图
const rgbeLoader = new RGBELoader()
rgbeLoader.load('/public/assets/texture/Alex_Hart-Nature_Lab_Bones_2k.hdr', envMap => {
  // 设置球形贴图,否则,环境贴图就像一个背景图片似的
  // envMap.mapping = THREE.EquirectangularReflectionMapping // 反射
  envMap.mapping = THREE.EquirectangularRefractionMapping // 折射(核心-1)
  // 给场景添加环境贴图
  scence.background = envMap
  scence.environment = envMap
})

let thicknessMap = new THREE.TextureLoader().load('../public/assets/texture/diamond/diamond_emissive.png')
// 创建立方体
const geomary = new THREE.BoxGeometry(1, 1, 1)
const material = new THREE.MeshPhysicalMaterial({
  transparent: true, // 透明
  transmission: 0.95, // 材质的透光率,范围:0(不透明)~ 1(透明)
  roughness: 0.1, // 材质的粗糙度,范围:0(光滑)~ 1(粗糙),粗糙程度,影响材质的反射光泽度

  // 衰减颜色:白光在达到衰减距离时由于吸收而变成的颜色;默认值为白色
  attenuationColor: new THREE.Color(0.9, 0.9, 0),
  // 衰减距离:光在与粒子相互作用之前,在介质中传播的平均距离。该值以世界空间单位给出,并且必须大于零;默认值为“无限”;
  attenuationDistance: 1,

  thickness: 2 // 立方体的厚度
  // thicknessMap: thicknessMap, // 厚度纹理图
})
const cube = new THREE.Mesh(geomary, material)
scence.add(cube)

const gui = new GUI()
gui.add(cube.material, 'attenuationDistance', 0, 10).name('衰减距离')
gui.add(cube.material, 'thickness', 0, 2).name('厚度')
gui.add(cube.material, 'ior', 0, 2).name('折射率')
gui.add(cube.material, 'reflectivity', 0, 1).name('反射率')


在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到