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基础

    • 1. Vite搭建Vue 3D开发环境
    • 2. Vite+Vue3引入threejs库
    • 3. Vue+threejs 3D案例—场景
    • 4. Vue+threejs 3D案例—相机
    • 5. Vue+threejs 3D案例—渲染器
    • 6. 动画渲染循环
    • 7. 平行光光源与材质
      • 8. 相机控件OrbitControls
      • 9. 渲染器设置(全屏、锯齿等)
      • 10. Canvas插入vue3组件(ref方式)【选修】
    • 2.场景搭建Three+Blender

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

    • 4.渲染性能、模型压缩

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

    • js 3D可视化
    • 1.Vue+Three.js基础
    郭隆邦
    2024-03-07
    目录

    7. 平行光光源与材质

    # 平行光光源与材质

    下面给大家简单介绍下,光源Light与材质Material的问题。

    实际生活中物体表面的明暗效果是会受到光照的影响,比如晚上不开灯,你就看不到物体,灯光比较暗,物体也比较暗。在threejs中,咱们用网格模型Mesh模拟生活中物体,所以threejs中模拟光照Light对物体表面的影响,就是模拟光照Light对网格模型Mesh表面的影响。

    # 网格材质是否受到光照影响

    threejs提供的网格材质,有的受光照影响,有的不受光照影响。

    基础网格材质MeshBasicMaterial (opens new window)不会受到光照影响。

    //MeshBasicMaterial不受光照影响
    const material = new THREE.MeshBasicMaterial(); 
    

    漫反射网格材质MeshLambertMaterial (opens new window)会受到光照影响,该材质也可以称为Lambert网格材质,音译为兰伯特网格材质。

    这时候没有设置光源,你会发现,一片漆黑,你看不到长方体。

    //MeshLambertMaterial受光照影响
    const material = new THREE.MeshLambertMaterial(); 
    

    把你WebGL渲染器的Cavnas画布背景设置成灰色,你会发现黑色的长方体,其实这很正常,生活中没有光照的物体也是一片漆黑,threejs同样道理。

    renderer.setClearColor(0x999999);
    

    # 光源简介

    Three.js提供了多种模拟生活中光源的API,文档搜索关键词light就可以看到。

    # 平行光

    平行光DirectionalLight (opens new window)就是沿着特定方向发射。

    // 平行光
    const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
    // 设置光源的方向:通过光源position属性和目标指向对象的position属性计算
    directionalLight.position.set(80, 100, 50);
    // 方向光默认指向xyz坐标原点
    scene.add(directionalLight);
    

    可视化三维空间 (opens new window)

    注意平行光的位置并不是说平行光开始发射的位置,只是为了辅助设置光线方向而已。

    // 两个坐标效果一样
    directionalLight.position.set(80, 100, 50);
    directionalLight.position.set(8, 10, 5);
    

    # 修改光照强度

    修改光照强度,查看渲染明暗变化。

    //光照强度设置为3.0
    const directionalLight = new THREE.DirectionalLight(0xffffff, 3);
    

    通过对象的属性修改光照强度

    directionalLight.intensity = 3.0;//光照强度设置为3.0
    

    # 平行光与Mesh表面光线反射规律

    平行光照射到网格模型Mesh表面,光线和模型表面构成一个入射角度,入射角度不同,对光照的反射能力不同。

    光线照射到漫反射网格材质MeshLambertMaterial (opens new window)对应Mesh表面,Mesh表面对光线反射程度与入射角大小有关。

    // 对比不同入射角,mesh表面对光照的反射效果
    directionalLight.position.set(100, 0, 0);
    directionalLight.position.set(0, 100, 0);
    directionalLight.position.set(100, 100, 100);
    directionalLight.position.set(100, 60, 50);
    
    6. 动画渲染循环
    8. 相机控件OrbitControls

    ← 6. 动画渲染循环 8. 相机控件OrbitControls→

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