跳至主要內容

材质与纹理

Mr.Chen前端开发 - 前端图形 - Three.js大约 2 分钟约 725 字

使用纹理

import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'

// 创建场景
const scene = new THREE.Scene()

// 创建相机
const camera = new THREE.PerspectiveCamera(
  75,
  window.innerWidth / window.innerHeight,
  0.1,
  1000
)

// 设置相机位置
camera.position.set(2, 2, 2)
// 将相机添加到场景
scene.add(camera)

// 加载纹理
const doorTexture = new THREE.TextureLoader().load(
  '/src/assets/textures/door/color.jpg'
)
// 使用纹理进行材质创建
const material = new THREE.MeshBasicMaterial({ map: doorTexture })
// 创建几何体
const geometry = new THREE.BoxBufferGeometry()
// 根据几何体和材质创建物体
const cube = new THREE.Mesh(geometry, material)

// 将几何体添加到场景中
scene.add(cube)

// 初始化渲染器
const renderer = new THREE.WebGLRenderer()
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight)
// 将webgl渲染的canvas内容添加到body
document.body.appendChild(renderer.domElement)

// 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement)
// 阻尼效果
controls.enableDamping = true

// 渲染函数
function render() {
  renderer.render(scene, camera)
  //   渲染下一帧的时候就会调用render函数
  requestAnimationFrame(render)
  // controls.update()
}
render()

纹理常用属性

偏移

取值:0.1 ~ 1.0

doorTexture.offset.set(-0.2, 0)

旋转

doorTexture.rotation = 45
doorTexture.center.set(0.5, 0.5)

旋转中心点为(0.5, 0.5)对应纹理的正中心。默认值为(0,0),即左下角

重复

doorTexture.repeat.set(2, 3)

wrapS这个值定义了纹理贴图在水平方向上将如何包裹,在 UV 映射中对应于U。 默认值是THREE.ClampToEdgeWrapping,即纹理边缘将被推到外部边缘的纹素(纹理元素)。 其它的两个选项分别是THREE.RepeatWrappingTHREE.MirroredRepeatWrapping

wrapT这个值定义了纹理贴图在垂直方向上将如何包裹,在 UV 映射中对应于 V。和wrapS使用相同的选项

doorTexture.repeat.set(2, 3)
doorTexture.wrapT = THREE.RepeatWrapping // 简单重复
doorTexture.wrapS = THREE.MirroredRepeatWrapping // 镜像重复

纹理显示算法

magFilter当一个纹素覆盖大于一个像素时,贴图将如何采样:

//  纹理显示算法
doorTexture.magFilter = THREE.NearestFilter

Mipmap 详解(有无 Mipmap 区别、原理、优点、缺点、优化)open in new window

透明材质与透明纹理

.alphaMapalpha贴图 是一张灰度纹理,用于控制整个表面的不透明度(黑色:完全透明;白色:完全不透明)

.map是颜色贴图;.transparent定义此材质是否透明。设置为true时,通过设置材质的opacity属性来控制材质透明的程度;side定义需要渲染那一面;默认是正面

// 加载透明纹理
const alphaTexture = new THREE.TextureLoader().load(
  '/src/assets/textures/door/alpha.jpg'
)
// 使用纹理进行材质创建
const material = new THREE.MeshBasicMaterial({
  map: doorTexture,
  alphaMap: alphaTexture,
  transparent: true,
  opacity: 0.5,
  side: THREE.DoubleSide
})

环境遮挡贴图与强度

aoMap为环境遮挡贴图,它需要第二组UV

// 使用纹理进行材质创建
const material = new THREE.MeshBasicMaterial({
  map: doorTexture,
  alphaMap: alphaTexture,
  // 材质是否透明
  transparent: true,
  // opacity: .4
  side: THREE.DoubleSide,
  aoMap: aoTexture
})

// 创建一个平面
const plance = new THREE.PlaneGeometry()
const cube2 = new THREE.Mesh(plance, material)
// 挪动平面至3,0,0
cube2.position.set(0, 0, 2)
// 给平面设置第二组UV
plance.setAttribute(
  'uv2',
  new THREE.BufferAttribute(plance.attributes.uv.array, 2)
)
上次编辑于: