three Lensflare 镜头光晕

在 Three.js 中,Lensflare 是一种用来模拟镜头光晕效果的类,常用于创建光源周围的光晕或耀斑效果,特别是当镜头朝向强光源(如太阳或强烈的灯光)时。它通过一个或多个纹理贴图来实现这种效果。
Lensflare 是通过在光源位置添加多个叠加图层(通常是半透明的纹理)来实现的,这些图层会在相机视角的变化下产生不同的光晕效果。要使用 Lensflare,首先需要创建一个 Lensflare 对象,然后添加多个光晕纹理,并根据需要调整每个纹理的位置、亮度等属性。

在 Three.js 中,Sky 是一个用于生成逼真天空环境的模块,可以创建类似天空穹顶的效果,通过改变太阳的位置、散射、曝光等参数,可以模拟不同时间和天气条件下的天空效果。Sky 通常用于户外场景,以提高环境的真实感。

Lensflare 没有属性 继承基类 Mesh

js 复制代码
    // 添加光源
    const light = new THREE.PointLight(0xffffff, 1.5, 2000);
    light.position.set(0, 200, 0);
    scene.add(light);

    // 加载 Lensflare 纹理
    const textureLoader = new THREE.TextureLoader();
    const textureFlare0 = textureLoader.load(imgPng);
    const textureFlare3 = textureLoader.load(person);

    // 创建 Lensflare 对象
    const lensflare = new Lensflare();
    lensflare.addElement(new LensflareElement(textureFlare0, 300, 0));     // 主光晕
    lensflare.addElement(new LensflareElement(textureFlare3, 10, 0.6));    // 辅助光晕
    lensflare.addElement(new LensflareElement(textureFlare3, 30, 0.7));
    lensflare.addElement(new LensflareElement(textureFlare3, 60, 0.9));
    lensflare.addElement(new LensflareElement(textureFlare3, 30, 1));

    // 将 Lensflare 添加到光源
    light.add(lensflare);

Sky 天空环境 有六个属性

js 复制代码
    // 创建 Sky 对象
    const sky = new Sky();
    sky.scale.setScalar(10000);  // 设置天空范围
    scene.add(sky);
    // 设置太阳的参数
    const sun = new THREE.Vector3();
    const effectController = {
        turbidity: 10,      // 大气浑浊度
        rayleigh: 2,        // 瑞利散射强度
        mieCoefficient: 0.005,  // 米氏散射系数
        mieDirectionalG: 0.8,   // 米氏散射方向
        elevation: 2,       // 太阳的仰角
        azimuth: 180,       // 太阳的方位角
        exposure: renderer.toneMappingExposure  // 曝光设置
    };
    // 更新太阳位置和天空
    function updateSun() {
        const phi = THREE.MathUtils.degToRad(90 - effectController.elevation);
        const theta = THREE.MathUtils.degToRad(effectController.azimuth);
        sun.setFromSphericalCoords(1, phi, theta);  // 通过球坐标系设置太阳位置
        sky.material.uniforms['sunPosition'].value.copy(sun);
        renderer.toneMappingExposure = effectController.exposure;  // 设置曝光
    }
    // 初始调用更新太阳位置
    updateSun();
    // 动画控制器
    let timeOfDay = 0;  // 时间变量,从 0 到 1 代表一天
    const dayDuration = 24;  // 一天的时长(小时)
    // 创建 OrbitControls 实例
    const controls = new OrbitControls(camera, renderer.domElement);
    // 设置控制器的目标点
    controls.target.set(0, 0, 0); // 将目标点设置为立方体的中心
    function animate() {
        requestAnimationFrame(animate);
        // 每帧更新时间
        timeOfDay += 1 / (dayDuration * 60);  // 这里的 60 代表每分钟变化一次
        if (timeOfDay > 1) timeOfDay = 0;  // 时间重置,模拟新的一天
        // 计算太阳的方位角和仰角
        effectController.azimuth = timeOfDay * 360;  // 太阳的方位角,模拟全天360度旋转
        effectController.elevation = Math.sin(timeOfDay * Math.PI) * 90;  // 太阳的仰角,从 -90 到 +90
        // 更新太阳的位置和天空
        updateSun();
        controls.update(); // 更新 OrbitControls
        renderer.render(scene, camera);
    }
    animate();

属性

  • turbidity : Number 在 Three.js 中,turbidity 是一个表示大气浑浊度的参数,通常用于模拟大气中的灰尘、水汽等微粒对阳光的散射效果。它主要用于设置 Sky 对象中的天空模型,使天空呈现不同的清晰或浑浊的效果。
js 复制代码
turbidity 的取值范围和效果
取值范围:一般建议的值在 0 到 20 之间。
    低值:低 turbidity 值(如 0 到 2)表示清澈的天空,类似于干净的高空环境,蓝天更深邃,视野更清晰。
    高值:较高的 turbidity 值(如 10 或以上)表示浑浊的空气环境,适合模拟雾霾、沙尘或湿度较高的天气。随着值增大,天空的颜色会逐渐偏向灰色或黄色,太阳的光线变得更加模糊。
  • rayleigh : Number 在 Three.js 中,rayleigh 参数用于控制瑞利散射的强度。瑞利散射是指光线在大气中被分子散射的现象,通常用于模拟蓝色的天空效果。rayleigh 值越高,天空的蓝色调会越深,适合模拟晴朗的白天天空。
js 复制代码
rayleigh 的取值范围和效果
  取值范围:一般推荐值在 0 到 4 之间。
    低值:较低的 rayleigh 值(如 0.1 到 0.5)会减少蓝光的散射,使天空偏暗或呈现白色光的效果,适合模拟昏暗或多云天气。
    高值:较高的 rayleigh 值(如 2 到 4)会增强蓝光的散射,天空变得更加清澈湛蓝,适合模拟晴朗无云的环境。
  • mieCoefficient : Number 在 Three.js 中,mieCoefficient 参数用于控制米氏散射的系数。米氏散射(Mie Scattering)是大气中的较大微粒(如尘埃、雾霾或水滴)对光线的散射,与瑞利散射不同,它更倾向于前向散射,并在场景中生成更强的光晕效果,尤其是靠近光源的区域。
js 复制代码
mieCoefficient 的取值范围和效果
  取值范围:一般建议值在 0 到 0.1 之间。
    低值:较低的 mieCoefficient 值(如 0.001 到 0.01)表示较少的米氏散射,适合模拟清洁的大气环境,这样阳光效果更加清晰,眩光较少。
    高值:较高的 mieCoefficient 值(如 0.05 或更高)则表示更多的米氏散射,适合模拟雾霾或湿度较高的场景,使光源附近的光晕效果更明显,天空的整体亮度会增大,并显得更加柔和。
    米氏散射影响:当 mieCoefficient 增大时,会增加光源附近的光晕效果,适合表现大气中大量微粒的情景,例如雾霾天气、晨雾或多云天气。
    结合其他参数:通常会配合 turbidity 和 rayleigh 参数一起使用,以便生成更真实的天空效果。
  • mieDirectionalG : Number 在 Three.js 中,mieDirectionalG 是用于控制米氏散射方向性的参数。米氏散射方向性可以影响光在前向(面向光源方向)和后向(背离光源方向)散射的强度。mieDirectionalG 的值决定了散射光的聚焦程度,适用于模拟有光晕的天空或雾霾等大气效果。
js 复制代码
mieDirectionalG 的取值范围和效果
  取值范围:通常在 0 到 1 之间,接近 0 表示各方向散射较均匀,接近 1 表示更强的前向散射。
    低值:较低的 mieDirectionalG 值(如 0.1 到 0.3)表示均匀的散射,光晕效果分散,不集中。
    高值:较高的 mieDirectionalG 值(如 0.8 到 1)则会产生更集中的前向散射,使光源周围出现更明显的光晕效果,适合模拟雾霾较重、光线穿透性强的天气。
    米氏散射方向性影响:随着 mieDirectionalG 值增加,光的散射集中在光源前向区域,产生更强的光晕,适合表现大气中微粒较多的情况。
    结合 mieCoefficient:mieDirectionalG 通常与 mieCoefficient 一起使用,以调整散射光的强度和方向性,从而达到更细腻的天空渲染效果。
  • sunPosition : Vector3 在 Three.js 中,sunPosition 是一个 Vector3 对象,用于设置天空模型中的太阳位置。它决定了天空中光源的方向和位置,影响太阳光线照射的角度,从而影响整个场景的光照效果。通过调整 sunPosition,可以模拟不同时间和不同气候条件下的阳光照射效果。
js 复制代码
sunPosition 的作用
  影响天空光照:sunPosition 决定了太阳光在天空中的位置,影响从太阳方向照射到场景中的光照效果。
    模拟不同时间的光照效果:通过改变 sunPosition 的坐标,可以模拟一天中的不同时间,例如日出、正午、日落等,产生不同的光照角度。
    影响阴影效果:太阳的位置也会影响场景中的阴影方向和强度。
    
    太阳位置的计算:在上面的例子中,sunPosition.set(Math.sin(effectController.azimuth), Math.sin(effectController.elevation), Math.cos(effectController.azimuth)) 计算了一个基于 azimuth(方位角)和 elevation(高度角)设置的太阳位置。
    azimuth 代表太阳从水平面上(0到360度)旋转的角度,通常用来确定太阳在天空中的方位。
    elevation 代表太阳相对于地平线的高度,通常用来模拟太阳升高或降低。
    动态变化:通过动态修改 sunPosition,你可以模拟太阳的运动,比如一天中的不同时间,甚至是季节变化。
  • up : Vector3 在 Three.js 中,Sky 对象的 up 属性用于设置天空模型的"上"方向,它决定了天空在场景中的旋转方向。Sky 类是用于创建大气和天空效果的对象,通过设置 up 属性,你可以控制天空的旋转方向,以适应不同的场景需求。
js 复制代码
up 属性
    类型:Vector3
    默认值:(0, 1, 0),表示 y 轴为"上"方向。
    作用:up 属性用于控制天空中光照方向和大气效果的旋转。例如,在模拟日出或日落等场景时,up 可以通过旋转来调整天空的朝向。
    
    sky.material.uniforms['up'].value.set(0, 1, 0):在上述代码中,我们设置了天空的 up 属性为 (0, 1, 0),这意味着天空将以 y 轴为"上"方向。如果需要调整天空的旋转,可以修改这个向量的值,例如:
    sky.material.uniforms['up'].value.set(1, 0, 0):将"上"方向设置为 x 轴。
    sky.material.uniforms['up'].value.set(0, 0, 1):将"上"方向设置为 z 轴。
    影响天空效果:up 属性的设置会影响太阳、天空和其他大气效果的方向,因此调整 up 可以在不同的场景中实现不同的光照和气候效果。
相关推荐
庸俗今天不摸鱼20 分钟前
【万字总结】前端全方位性能优化指南(十)——自适应优化系统、遗传算法调参、Service Worker智能降级方案
前端·性能优化·webassembly
黄毛火烧雪下27 分钟前
React Context API 用于在组件树中共享全局状态
前端·javascript·react.js
Apifox37 分钟前
如何在 Apifox 中通过 CLI 运行包含云端数据库连接配置的测试场景
前端·后端·程序员
一张假钞40 分钟前
Firefox默认在新标签页打开收藏栏链接
前端·firefox
高达可以过山车不行40 分钟前
Firefox账号同步书签不一致(火狐浏览器书签同步不一致)
前端·firefox
m0_5937581041 分钟前
firefox 136.0.4版本离线安装MarkDown插件
前端·firefox
掘金一周1 小时前
金石焕新程 >> 瓜分万元现金大奖征文活动即将回归 | 掘金一周 4.3
前端·人工智能·后端
三翼鸟数字化技术团队1 小时前
Vue自定义指令最佳实践教程
前端·vue.js
Jasmin Tin Wei2 小时前
蓝桥杯 web 学海无涯(axios、ecahrts)版本二
前端·蓝桥杯
圈圈编码2 小时前
Spring Task 定时任务
java·前端·spring