Three.js開發(fā)之Fog組件知識整理
1. Fog 組件簡介
Fog(霧)用于在 Three.js 場景中創(chuàng)建大氣效果,模擬遠處物體在霧中的模糊感。它可以增強景深,提高場景的真實感,并優(yōu)化性能(遠處物體可被霧隱藏,減少渲染壓力)。
Three.js 提供了 兩種霧效:
THREE.Fog- 線性霧,隨距離均勻加深。THREE.FogExp2- 指數(shù)霧,隨距離指數(shù)增長,更自然。
2. 線性霧(THREE.Fog)
2.1 語法
const fog = new THREE.Fog(color, near, far); scene.fog = fog;
color:霧的顏色(例如0xaaaaaa)。near:開始出現(xiàn)霧的距離(從攝像機開始計算)。far:霧達到完全覆蓋的距離(超出此距離的物體完全被霧遮擋)。
2.2 示例
const scene = new THREE.Scene(); scene.fog = new THREE.Fog(0xaaaaaa, 5, 20);
5以內(nèi)無霧,5-20之間物體逐漸被霧覆蓋,20以外完全被霧遮擋。
2.3 線性霧特點
? 適合大場景(如森林、城市、山脈)。
? 可控性高(可以精確設(shè)定霧的范圍)。
? 較生硬(霧的變化是線性的,可能不夠真實)。
3. 指數(shù)霧(THREE.FogExp2)
3.1 語法
const fogExp2 = new THREE.FogExp2(color, density); scene.fog = fogExp2;
color:霧的顏色。density:霧的濃度(數(shù)值越大,霧越濃)。
3.2 示例
scene.fog = new THREE.FogExp2(0xaaaaaa, 0.05);
density = 0.05:隨著距離增加,物體逐漸被霧覆蓋,越遠霧越濃。
3.3 指數(shù)霧特點
? 更真實(霧的濃度隨距離指數(shù)增加)。
? 適合小型場景(如煙霧、塵霧、室內(nèi)霾)。
? 難以控制(沒有 near 和 far,只能調(diào)整 density)。
4. Fog 與材質(zhì)
- 霧的顏色會影響受霧影響的物體。
- 大多數(shù)材質(zhì)支持霧(如
MeshStandardMaterial)。 - 特殊材質(zhì)不受霧影響:
MeshBasicMaterial(基礎(chǔ)材質(zhì),不受燈光和霧影響)ShaderMaterial(自定義著色器時需手動實現(xiàn)霧效)
4.1 開啟霧影響
const material = new THREE.MeshStandardMaterial({ color: 0xff0000, fog: true });4.2 禁用霧影響
const material = new THREE.MeshStandardMaterial({ color: 0xff0000, fog: false });fog: false 時,該物體不會被霧影響。
5. 動態(tài)調(diào)整霧
可以使用 dat.GUI 控制霧的參數(shù):
const gui = new dat.GUI(); const fog = new THREE.Fog(0xaaaaaa, 5, 20); scene.fog = fog; gui.addColor(fog, 'color'); gui.add(fog, 'near', 1, 50); gui.add(fog, 'far', 1, 100);
這樣可以在運行時實時調(diào)整霧的顏色和范圍。
6. 結(jié)合天空(Sky)和霧
如果場景有 Sky 組件,霧的顏色應(yīng)匹配天空顏色:
scene.fog = new THREE.Fog(0x87CEEB, 10, 50); // 顏色接近天空
這樣可以讓霧和天空融合,減少突兀感。
7. 結(jié)合燈光和陰影
- 方向光(DirectionalLight):霧會影響遠處光照,遠處物體更暗。
- 點光源(PointLight)/聚光燈(SpotLight):燈光在霧中會形成光束效果(如霧燈)。
- 陰影:如果霧太濃,陰影可能會變得不明顯。
const light = new THREE.DirectionalLight(0xffffff, 1); light.position.set(10, 10, 10); scene.add(light);
在霧中添加燈光,可以制造神秘的光束效果。
8. 結(jié)合后處理(PostProcessing)
后處理可以增強霧效果,如體積光、景深(DOF):
- 使用
UnrealBloomPass增強霧中的光照:
const bloomPass = new UnrealBloomPass(new THREE.Vector2(window.innerWidth, window.innerHeight), 0.5, 0.4, 0.85); composer.addPass(bloomPass);
- 使用
BokehPass增強遠處的虛化效果:
const bokehPass = new BokehPass(scene, camera, {
focus: 10.0,
aperture: 0.025,
maxblur: 0.01
});
composer.addPass(bokehPass);結(jié)合后處理,可以讓霧更加真實,增強沉浸感。
9. 可能遇到的問題
9.1 霧沒有效果
- 檢查是否已賦值給
scene.fog:
console.log(scene.fog);
- 確保使用支持霧的材質(zhì):
console.log(material.fog); // true 才會受霧影響
9.2 霧影響過強/過弱
- 線性霧:調(diào)整
near和far之間的比例。 - 指數(shù)霧:調(diào)整
density以適應(yīng)場景大小。
10. 總結(jié)
類型 | 適用場景 | 控制參數(shù) | 適用材質(zhì) | 優(yōu)缺點 |
(線性霧) | 大型場景(森林、城市、山脈) |
/ | 大多數(shù)材質(zhì)(除 ) | ? 可控性強,? 變化較生硬 |
(指數(shù)霧) | 小型場景(煙霧、塵埃、室內(nèi)) |
| 大多數(shù)材質(zhì) | ? 真實感強,? 難以精確控制 |
最佳實踐
- 遠景霧:
FogExp2更真實,適合小范圍霧霾。 - 大氣效果:
Fog適合模擬遠景霧,如大霧天氣。 - 結(jié)合后處理:配合
BokehPass、UnrealBloomPass讓霧更自然。
到此這篇關(guān)于Three.js開發(fā)之Fog組件知識整理的文章就介紹到這了,更多相關(guān)Three.js Fog組件知識內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript textarea光標(biāo)定位方法(兼容IE和FF)
主要是實現(xiàn)textarea中光標(biāo)的定位方法,考慮到多瀏覽器的兼容性,需要的朋友可以參考下。2011-03-03
js中的eval()函數(shù)把含有轉(zhuǎn)義字符的字符串轉(zhuǎn)換成Object對象的方法
下面小編就為大家?guī)硪黄猨s中的eval()函數(shù)把含有轉(zhuǎn)義字符的字符串轉(zhuǎn)換成Object對象的方法。小編覺的挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
JavaScript創(chuàng)建對象的七種經(jīng)典方式分享
JavaScript 創(chuàng)建對象的方式有很多,通過 Object 構(gòu)造函數(shù)或?qū)ο笞置媪康姆绞揭部梢詣?chuàng)建單個對象,顯然這兩種方式會產(chǎn)生大量的重復(fù)代碼,并不適合量產(chǎn)。本文介紹了七種非常經(jīng)典的創(chuàng)建對象的方式,希望對大家有所幫助2022-11-11
layer彈出框確定前驗證:彈出消息框的方法(彈出兩個layer)
今天小編就為大家分享一篇layer彈出框確定前驗證:彈出消息框的方法(彈出兩個layer),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09

