Three.js材質(zhì)與光照知識(shí)點(diǎn)總結(jié)(附詳細(xì)代碼)
前言
在 Three.js 中,材質(zhì)(Material) 和 光照(Light) 是 3D 場(chǎng)景視覺效果的核心。合理搭配材質(zhì)和光照,可以讓物體 真實(shí)反光、透明、金屬感、卡通效果 等。
1. 材質(zhì)(Material)分類
Three.js 提供了多種材質(zhì),每種材質(zhì)適用于不同的效果:
材質(zhì)類型 | 適用場(chǎng)景 | 特點(diǎn) | 是否受光照影響 |
| 純色/紋理 | 不受光照影響 | ? |
| PBR 物理材質(zhì)(推薦) | 支持 金屬、粗糙度 | ? |
| 高級(jí) PBR 材質(zhì) | 透明、清漆、次表面散射 | ? |
| 低成本光照 | 無高光,計(jì)算漫反射 | ? |
| 經(jīng)典光照材質(zhì) | 支持 高光(specular) | ? |
| 卡通渲染 | 類似 2D 動(dòng)漫 | ? |
| 深度緩沖材質(zhì) | 用于 陰影、后處理 | ? |
| 預(yù)烘焙材質(zhì) | 不受光照影響,依賴 MatCap 貼圖 | ? |
2. 常見材質(zhì)屬性
所有材質(zhì)都繼承自 THREE.Material,但有些屬性只適用于特定材質(zhì)。
屬性 | 作用 | 適用材質(zhì) |
| 顏色紋理 | 所有材質(zhì)(除 Depth、Matcap) |
| 顏色 | 所有材質(zhì) |
| 透明度 |
才生效 |
| 是否透明 | 所有材質(zhì) |
| 正面/背面/雙面 |
|
| 線框模式 | 所有材質(zhì) |
| 金屬度( ) |
|
| 粗糙度( ) |
|
| 高光強(qiáng)度 |
|
| 高光顏色 |
|
| 是否平面著色 |
讓模型棱角分明 |
| 位移貼圖(改變頂點(diǎn)高度) |
|
| 法線貼圖(增加凹凸感) |
|
| 環(huán)境遮蔽貼圖(增強(qiáng)陰影) |
|
| 環(huán)境貼圖(反射環(huán)境) |
|
3. 紋理貼圖(Texture)
材質(zhì)可以使用多種 貼圖(Texture) 來增強(qiáng)視覺效果:
紋理貼圖 | 作用 | 適用材質(zhì) |
| 基礎(chǔ)顏色貼圖 | ? |
| 透明度(黑色透明) | ? |
| 凹凸貼圖 |
|
| 法線貼圖 |
|
| 粗糙度貼圖 |
|
| 金屬度貼圖 |
|
| 環(huán)境遮蔽(陰影) |
|
| 自發(fā)光貼圖 |
|
const material = new THREE.MeshStandardMaterial({
map: colorTexture, // 顏色貼圖
normalMap: normalTexture, // 法線貼圖
roughnessMap: roughnessTexture, // 粗糙度貼圖
metalnessMap: metalnessTexture, // 金屬度貼圖
aoMap: ambientOcclusionTexture, // AO 貼圖
displacementMap: heightTexture, // 位移貼圖
displacementScale: 0.1, // 位移強(qiáng)度
transparent: true,
side: THREE.DoubleSide,
});4. 光照(Lighting)
在 Three.js 中,某些材質(zhì)需要 光源 才能正確顯示,比如 MeshStandardMaterial。
環(huán)境光(AmbientLight)
- 不產(chǎn)生陰影,均勻照亮整個(gè)場(chǎng)景
- 適用于基礎(chǔ)填充光
const ambientLight = new THREE.AmbientLight(0xffffff, 1); scene.add(ambientLight);
點(diǎn)光源(PointLight)
- 類似燈泡,從一個(gè)點(diǎn)向四周發(fā)光
- 可以產(chǎn)生陰影
const pointLight = new THREE.PointLight(0xffffff, 30); pointLight.position.set(2, 3, 4); scene.add(pointLight);
平行光(DirectionalLight)
- 類似太陽光,從固定方向照射
- 適用于戶外場(chǎng)景
const directionalLight = new THREE.DirectionalLight(0xffffff, 1); directionalLight.position.set(5, 5, 5); scene.add(directionalLight);
聚光燈(SpotLight)
- 類似手電筒,有方向性
const spotLight = new THREE.SpotLight(0xffffff, 10); spotLight.position.set(0, 5, 0); scene.add(spotLight);
5. HDR 環(huán)境貼圖
Three.js 支持 HDR 貼圖 來增強(qiáng)場(chǎng)景光照與反射效果。
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';
const rgbeLoader = new RGBELoader();
rgbeLoader.load('textures/environment.hdr', (hdrTexture) => {
hdrTexture.mapping = THREE.EquirectangularReflectionMapping;
// 影響整個(gè)場(chǎng)景
scene.environment = hdrTexture;
scene.background = hdrTexture;
// 影響單個(gè)物體
material.envMap = hdrTexture;
material.needsUpdate = true;
});? HDR 貼圖能提供更真實(shí)的環(huán)境反射? 需要設(shè)置 THREE.EquirectangularReflectionMapping
6. 鼠標(biāo)拖動(dòng)畫面
Three.js 提供 OrbitControls 來讓用戶交互。
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
// 創(chuàng)建控件
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true; // 添加阻尼效果
controls.screenSpacePanning = false; // 限制平移方向鼠標(biāo)操作
鼠標(biāo)操作 | 效果 |
左鍵拖動(dòng) | 旋轉(zhuǎn)視角 |
右鍵拖動(dòng) | 平移相機(jī) |
滾輪滾動(dòng) | 縮放 |
7. 調(diào)試 GUI
可以使用 dat.GUI 調(diào)整參數(shù):
import * as dat from 'dat.gui'; const gui = new dat.GUI(); gui.add(material, 'metalness').min(0).max(1).step(0.01); gui.add(material, 'roughness').min(0).max(1).step(0.01); gui.add(material, 'aoMapIntensity').min(0).max(10).step(0.01);
這樣可以 實(shí)時(shí)修改材質(zhì)參數(shù),方便調(diào)試。
總結(jié)
? MeshStandardMaterial 是最推薦的 PBR 材質(zhì)? 光照對(duì)不同材質(zhì)的影響不同,基本材質(zhì) (MeshBasicMaterial) 不受影響
? HDR 貼圖能大幅提升環(huán)境反射效果? OrbitControls 讓鼠標(biāo)控制視角
到此這篇關(guān)于Three.js材質(zhì)與光照知識(shí)點(diǎn)的文章就介紹到這了,更多相關(guān)Three.js材質(zhì)與光照內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
html的DOM中document對(duì)象forms集合用法實(shí)例
這篇文章主要介紹了html的DOM中document對(duì)象forms集合用法,實(shí)例分析了forms集合的功能與使用技巧,需要的朋友可以參考下2015-01-01
關(guān)于JS中一維數(shù)組和二維數(shù)組互轉(zhuǎn)問題
這篇文章主要介紹了js中一維數(shù)組和二維數(shù)組互轉(zhuǎn),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
微信小程序?qū)崿F(xiàn)省市區(qū)三級(jí)地址選擇
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)省市區(qū)三級(jí)地址選擇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
js每隔兩秒輸出數(shù)組中的一項(xiàng)(實(shí)例)
下面小編就為大家?guī)硪黄猨s每隔兩秒輸出數(shù)組中的一項(xiàng)(實(shí)例)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
javascript全局變量封裝模塊實(shí)現(xiàn)代碼
javascript全局變量封裝模塊的應(yīng)用,本文將詳細(xì)介紹,需要了解更多的朋友可以參考下2012-11-11
JavaScript實(shí)現(xiàn)流星雨效果的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript實(shí)現(xiàn)簡(jiǎn)易的流星雨的效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
微信小程序嵌入H5頁面(webview)的基本用法和父子傳參數(shù)詳細(xì)說明
微信小程序中嵌入H5頁面通常指的是在小程序中使用Web-view組件來加載外部的網(wǎng)頁,下面這篇文章主要給大家介紹了關(guān)于微信小程序嵌入H5頁面(webview)的基本用法和父子傳參數(shù)的相關(guān)資料,需要的朋友可以參考下2024-08-08

