Three.js中文网 Three.js中文网
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
Web3D系统课程视频
  • 0.学前说明

  • 1.Vue+Three.js基础

  • 2.场景搭建Three+Blender

  • 3.渲染效果提升(材质光照)

    • 1. 光照、环境贴图
      • 2. 环境贴图hdr格式
      • 3. 天空盒全景图作为背景
      • 4. threejs深度冲突
      • 5. 标准网格材质(金属)
      • 6. 物理网格材质(玻璃)
      • 7. dat.gui辅助调试物理材质
      • 8. dat.gui辅助调试光照参数
      • 9. dat.gui调节平行光照射角度
    • 4.渲染性能、模型压缩

    • 5.封装、进度条、切视角

    • js 3D可视化
    • 3.渲染效果提升(材质光照)
    郭隆邦
    2024-03-12
    目录

    1. 光照、环境贴图

    # 光照、环境贴图

    本节课给大家介绍下光照、环境贴图对gltf模型渲染的影响。

    # 回顾:光照

    前面给大家讲解课程时候说过,需要光照的材质,如果没有任何光源,就会漆黑一片。

    平行光DirectionalLight相当于近似模拟太阳光照耀效果,你旋转三维场景可以发现,有光照的一面更亮,没有光照的偏向黑色。

    // 平行光
    const directionalLight = new THREE.DirectionalLight(0xffffff,3.0);
    directionalLight.position.set(80, 100, 50);
    scene.add(directionalLight);
    

    光照强度增大点,你会发现场景更明亮一些。

    // 平行光
    directionalLight.intensity = 10.0;
    

    你可以隐藏前面gltf加载时候的平行光进行设置,观察下。

    先删除平行光代码,这时候一片漆黑,接下来给大家设置通过设置环境贴图,照亮场景。

    # 立方体环境贴图

    所谓立方体环境贴图,就是一个模型周围的环境的图像,比如人在户外,人的上下左右前后分别拍摄一张照片,得到3D空间中6个角度方向的照片。

    这6张照片就构成了一个立方体环境贴图。

    # 立方体纹理加载器CubeTextureLoader

    下面6张图片放在vue项目的public/envMap/文件中。

    // 加载环境贴图
    // 加载周围环境6个方向贴图
    // 上下左右前后6张贴图构成一个立方体空间
    // 'px.jpg', 'nx.jpg':x轴正方向、负方向贴图  p:正positive  n:负negative
    // 'py.jpg', 'ny.jpg':y轴贴图
    // 'pz.jpg', 'nz.jpg':z轴贴图
    const textureCube = new THREE.CubeTextureLoader()
        .setPath('./envMap/')
        .load(['px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg']);
        // CubeTexture表示立方体纹理对象
    

    # 设置材质环境贴图属性.envMap

    递归遍历给每一个Mesh的材质设置环境贴图。

    给三维场景mesh的材质设置环境贴图,这时候,你会原来一片黑色的gltf模型,可以正常预览了。

    loader.load("../收费站.glb", function (gltf) {
        // 递归遍历批量设置环境贴图
        gltf.scene.traverse(function (obj) {
            if (obj.isMesh) { //判断是否是网格模型
                obj.material.envMap = textureCube; //设置环境贴图
            }
        });
    })
    

    物体与物体之间,其实会相互反射光线,彼此产生影响。这种影响,可以用环境贴图来近似模拟。环境贴图作用其实就是模拟周围环境的光照效果,这个时候,你虽然不设置任何光源,仅仅设置.envMap也能看到物体表面的颜色效果。

    # 环境贴图反射率.envMapIntensity

    材质的.envMapIntensity属性主要用来设置模型表面反射周围环境贴图的能力,或者说环境贴图对模型表面的影响能力。具体说.envMapIntensity相当于环境贴图的系数,环境贴图像素值乘以该系数后,在用于影响模型表面。

    // envMapIntensity:控制环境贴图对mesh表面影响程度
    //默认值1, 设置为0.0,相当于没有环境贴图
    obj.material.envMapIntensity = 1.0;
    

    # 给三维场景设置环境贴图

    这样的话,相当于场景中每个Mesh设置envMap,不用递归遍历设置所有mesh材质的.envMap属性。

    scene.environment = textureCube;
    

    # 总结

    如果你想模拟太阳光照射效果,你可以设置平行光DirectionalLight。

    实际生活,除了太阳光影响物体,物体与物体之间,其实相互反射光线,彼此产生影响。这种影响,可以用环境贴图来近似模拟。一般做Web3D可视化项目,通常要设置环境贴图,通过环境贴图模拟物体周围相互影响的光照。

    13. 加载gltf模型相机.lookAt()设置
    2. 环境贴图hdr格式

    ← 13. 加载gltf模型相机.lookAt()设置 2. 环境贴图hdr格式→

    Theme by Vdoing | Copyright © 2016-2025 豫ICP备16004767号-2
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式