3.js - MeshPhysicalMaterial - 虹彩效果

效果图
在这里插入图片描述

// @ts-nocheck

import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js'
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'


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)

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()
  requestAnimationFrame(animate)
  renderer.render(scence, camera)
}
animate()


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


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
  scence.background = envMap
  scence.environment = envMap
})

let iridescenceThicknessMap = new THREE.TextureLoader().load('../public/assets/texture/brick/brick_diffuse.jpg')

// 创建球
const geometry = new THREE.SphereGeometry(1, 32, 32)
const material = new THREE.MeshPhysicalMaterial({
	color: 0xffffff,
	roughness: 0.05,
	
	`透明度`:范围:0~1(完全透明),表示光线穿过物体的程度
	transmission: 1,
	
	reflectivity: 1, `反射`
	
	`厚度`:物体有了厚度,才会有折射效果
	thickness: 0.1,
	
	`虹彩效果`:范围:0~1,表示虹彩的强度(虹彩是一种颜色随观察角度变化而变化的效应)
	iridescence: 1,
	
	`虹彩折射率`:与虹彩效果`iridescence`一起使用,以定义虹彩的视觉效果
	iridescenceIOR: 1.3,
	
	`虹彩厚度范围`:这是一个数组,
					 定义,虹彩效果在物体内部或表面上的厚度范围。
	               在这个例子中,虹彩效果可能在物体的100400单位厚度范围内最为明显。
	iridescenceThicknessRange: [100, 400],
	
	iridescenceThicknessMap: iridescenceThicknessMap
})

const sphere = new THREE.Mesh(geometry, material)
scence.add(sphere)

const gui = new GUI()
gui.add(material, 'iridescence', 0, 1).name('虹彩色')
// gui.add(material, 'reflectivity', 0, 1).name('反射率')
gui.add(material, 'iridescenceIOR', 0, 3).name('虹彩折射率')

let iridescenceThickness = {
  min: 100,
  max: 400
}

gui
  .add(iridescenceThickness, 'min', 0, 100)
  .name('虹彩色最小厚度')
  .onChange(() => {
    material.iridescenceThicknessRange[0] = iridescenceThickness.min
  })
  
gui
  .add(iridescenceThickness, 'max', 0, 1000)
  .name('虹彩的最大厚度')
  .onChange(() => {
    material.iridescenceThicknessRange[1] = iridescenceThickness.max
  })

  • 41
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的turtle模块是一个绘图工具,可以用来绘制各种图形。在turtle模块中,可以使用circle()方法来绘制圆形。 在你提供的引用中,你展示了一个绘制四个彩虹的例子。首先,你导入了turtle库,并将其别名为tur。然后,你设置了绘图的速度和线条的宽度,以及背景颜色。接下来,你使用一个双重循环来绘制四个彩虹。在内部循环中,你使用了colorsys库中的hsv_to_rgb()方法来生成不同颜色虹彩。然后,你使用circle()方法来绘制一个半径逐渐增大的圆形,同时改变颜色。最后,你将画笔向右旋转90度,并隐藏了画笔。最后,你调用了done()方法来完成绘图。 在引用中,你提到了turtle模块的screensize()方法。这个方法用来设置或获取绘图窗口的大小。它可以接受三个可选参数:画布的宽度,画布的高度和背景颜色。如果不提供参数,它将返回默认的画布大小。在你的例子中,你设置了画布的宽度为800像素,高度为600像素,并将背景颜色设置为绿色。 最后,在引用中,你提到了turtle模块的circle()方法。这个方法用来绘制一个圆形。它接受两个必需参数:半径和角度。半径指定圆的大小,角度指定圆的弧度。如果不提供角度参数,默认绘制整个圆形。 综上所述,Python的turtle模块提供了丰富的绘图功能,可以用来绘制各种图形,包括圆形。你可以使用circle()方法来绘制圆形,并且可以通过调整半径和角度来控制圆形的大小和形状。同时,你也可以使用screensize()方法来设置绘图窗口的大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值