Three.js开发之Fog组件知识整理

 更新时间:2025年07月05日 10:44:27   作者:泫凝  
在Threejs中Fog类用于创建线性雾的效果,雾效果常用于模拟真实世界中视觉深度递减的效果,也可以用于创建某些艺术效果,这篇文章主要介绍了Three.js Fog 组件知识的相关资料,需要的朋友可以参考下

1. Fog 组件简介

Fog(雾)用于在 Three.js 场景中创建大气效果,模拟远处物体在雾中的模糊感。它可以增强景深,提高场景的真实感,并优化性能(远处物体可被雾隐藏,减少渲染压力)。

Three.js 提供了 两种雾效

  • THREE.Fog - 线性雾,随距离均匀加深。
  • THREE.FogExp2 - 指数雾,随距离指数增长,更自然。

2. 线性雾(THREE.Fog)

2.1 语法

const fog = new THREE.Fog(color, near, far);
scene.fog = fog;
  • color:雾的颜色(例如 0xaaaaaa)。
  • near:开始出现雾的距离(从摄像机开始计算)。
  • far:雾达到完全覆盖的距离(超出此距离的物体完全被雾遮挡)。

2.2 示例

const scene = new THREE.Scene();
scene.fog = new THREE.Fog(0xaaaaaa, 5, 20);
  • 5 以内无雾,5-20 之间物体逐渐被雾覆盖,20 以外完全被雾遮挡。

2.3 线性雾特点

✅ 适合大场景(如森林、城市、山脉)。
✅ 可控性高(可以精确设定雾的范围)。
❌ 较生硬(雾的变化是线性的,可能不够真实)。

3. 指数雾(THREE.FogExp2)

3.1 语法

const fogExp2 = new THREE.FogExp2(color, density);
scene.fog = fogExp2;
  • color:雾的颜色。
  • density:雾的浓度(数值越大,雾越浓)。

3.2 示例

scene.fog = new THREE.FogExp2(0xaaaaaa, 0.05);
  • density = 0.05:随着距离增加,物体逐渐被雾覆盖,越远雾越浓。

3.3 指数雾特点

✅ 更真实(雾的浓度随距离指数增加)。
✅ 适合小型场景(如烟雾、尘雾、室内霾)。
❌ 难以控制(没有 near 和 far,只能调整 density)。

4. Fog 与材质

  • 雾的颜色会影响受雾影响的物体
  • 大多数材质支持雾(如 MeshStandardMaterial)。
  • 特殊材质不受雾影响
    • MeshBasicMaterial(基础材质,不受灯光和雾影响)
    • ShaderMaterial(自定义着色器时需手动实现雾效)

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. 动态调整雾

可以使用 dat.GUI 控制雾的参数:

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);

这样可以在运行时实时调整雾的颜色和范围。

6. 结合天空(Sky)和雾

如果场景有 Sky 组件,雾的颜色应匹配天空颜色:

scene.fog = new THREE.Fog(0x87CEEB, 10, 50); // 颜色接近天空

这样可以让雾和天空融合,减少突兀感。

7. 结合灯光和阴影

  • 方向光(DirectionalLight):雾会影响远处光照,远处物体更暗。
  • 点光源(PointLight)/聚光灯(SpotLight):灯光在雾中会形成光束效果(如雾灯)。
  • 阴影:如果雾太浓,阴影可能会变得不明显。
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(10, 10, 10);
scene.add(light);

在雾中添加灯光,可以制造神秘的光束效果。

8. 结合后处理(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);

结合后处理,可以让雾更加真实,增强沉浸感。

9. 可能遇到的问题

9.1 雾没有效果

  • 检查是否已赋值给 scene.fog
console.log(scene.fog);
  • 确保使用支持雾的材质
console.log(material.fog);  // true 才会受雾影响

9.2 雾影响过强/过弱

  • 线性雾:调整 near 和 far 之间的比例。
  • 指数雾:调整 density 以适应场景大小。

10. 总结

类型

适用场景

控制参数

适用材质

优缺点

Fog

(线性雾)

大型场景(森林、城市、山脉)

near

far

大多数材质(除 MeshBasicMaterial

✅ 可控性强,❌ 变化较生硬

FogExp2

(指数雾)

小型场景(烟雾、尘埃、室内)

density

大多数材质

✅ 真实感强,❌ 难以精确控制

最佳实践

  • 远景雾FogExp2 更真实,适合小范围雾霾。
  • 大气效果Fog 适合模拟远景雾,如大雾天气。
  • 结合后处理:配合 BokehPassUnrealBloomPass 让雾更自然。

到此这篇关于Three.js开发之Fog组件知识整理的文章就介绍到这了,更多相关Three.js Fog组件知识内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js去字符串前后空格的实现方法

    js去字符串前后空格的实现方法

    这篇文章主要介绍了js去字符串前后空格的实现方法,重点推荐使用正则的方式,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • PHP PDO操作总结

    PHP PDO操作总结

    这篇文章主要介绍了PHP PDO操作总结,本文讲解了使用PDO连接数据库、执行基本查询、获取行数、遍历结果集、转义用户输入的特殊字符、exec()、预处理语句等内容,需要的朋友可以参考下
    2014-11-11
  • 原生JS实现滑动按钮效果

    原生JS实现滑动按钮效果

    这篇文章主要为大家详细介绍了原生JS实现滑动按钮效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • javascript textarea光标定位方法(兼容IE和FF)

    javascript textarea光标定位方法(兼容IE和FF)

    主要是实现textarea中光标的定位方法,考虑到多浏览器的兼容性,需要的朋友可以参考下。
    2011-03-03
  • js中的eval()函数把含有转义字符的字符串转换成Object对象的方法

    js中的eval()函数把含有转义字符的字符串转换成Object对象的方法

    下面小编就为大家带来一篇js中的eval()函数把含有转义字符的字符串转换成Object对象的方法。小编觉的挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • JavaScript创建对象的七种经典方式分享

    JavaScript创建对象的七种经典方式分享

    JavaScript 创建对象的方式有很多,通过 Object 构造函数或对象字面量的方式也可以创建单个对象,显然这两种方式会产生大量的重复代码,并不适合量产。本文介绍了七种非常经典的创建对象的方式,希望对大家有所帮助
    2022-11-11
  • layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)

    layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)

    今天小编就为大家分享一篇layer弹出框确定前验证:弹出消息框的方法(弹出两个layer),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • 解决EventSource 删除单词的前置空格问题记录

    解决EventSource 删除单词的前置空格问题记录

    EventSource是HTML5中的一种新的API,用来实现服务器端向客户端推送事件,相比于常规的轮询方式,EventSource可以实现更加高效、低延迟的数据传输,这篇文章主要介绍了解决EventSource 删除单词的前置空格问题记录,需要的朋友可以参考下
    2024-03-03
  • JSON简介以及用法汇总

    JSON简介以及用法汇总

    JSON(JavaScript Object Notation)即JavaScript对象表示法,是一种轻量级的数据交换格式。它非常便于编程人员对数据的处理,也便于机器对数据的解析和生成,应用非常广泛
    2016-02-02
  • 微信小程序点击滚动到指定位置的实现

    微信小程序点击滚动到指定位置的实现

    这篇文章主要介绍了微信小程序点击滚动到指定位置的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05

最新评论