Threejs 光照教程,为 3D 场景注入灵魂

定义

光照是模拟现实世界中的光线照射效果,通过光照可以模拟现实世界中的物体表面反射光线的效果,从而产生明暗对比,使物体看起来更加真实。

光照类型

Three.js 中提供了以下几种光照类型:

  • 环境光(AmbientLight): 环境光是一种均匀的光源,它不会产生阴影,只会照亮整个场景。环境光通常用于模拟自然光的效果。
  • 点光源(PointLight): 点光源是一种从一个点向所有方向发射光线的光源,它会产生阴影。点光源通常用于模拟灯泡、蜡烛等光源的效果。
  • 平行光(DirectionalLight): 平行光是一种从一个方向向所有方向发射光线的光源,它会产生阴影。平行光通常用于模拟太阳光的效果。
  • 半球光(HemisphereLight): 半球光是一种从一个方向向所有方向发射光线的光源,它不会产生阴影。半球光通常用于模拟天空和地面的光照效果。
  • 聚光灯(SpotLight): 聚光灯是一种从一个点向一个方向发射光线的光源,随着光线照射的变远,光线圆锥体的尺寸也逐渐增大。它会产生阴影。聚光灯通常用于模拟手电筒、舞台灯光等光源的效果。
  • ...

正如之前说到的有些材质不受光照影响,有些材质需要光的参与,不然漆黑一片。

AmbientLight

环境光是一种来自四面八方均匀的光源,它不会产生阴影,只会照亮整个场景。环境光通常用于模拟自然光的效果。

js 复制代码
const light = new THREE.AmbientLight(0xff0000, 0.5); // 红色,强度为0.5
scene.add(light);

参数:

  • color: 光的颜色,默认值为 0xffffff(白色)。
  • intensity: 光的强度,默认值为 1。

DirectionalLight

平行光是沿着特定方向发射的光。这种光的表现像是无限远,从它发出的光线都是平行的。常常用平行光来模拟太阳光的效果。 太阳足够远,因此我们可以认为太阳的位置是无限远,所以我们认为从太阳发出的光线也都是平行的。

js 复制代码
const light = new THREE.DirectionalLight(0xffffff, 1);
scene.add(light);

参数:

  • color: 光的颜色,默认值为 0xffffff(白色)。
  • intensity: 光的强度,默认值为 1。

加了平行光后,场景中物体的颜色会发生变化,因为平行光会改变物体表面的明暗对比。

DirectionalLightHelper 是一个用于显示 DirectionalLight 光线方向的辅助对象。它可以帮助我们更好地理解 DirectionalLight 的方向和位置。

js 复制代码
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(0, 1, 0);
scene.add(light);

const helper = new THREE.DirectionalLightHelper(light, 1);
scene.add(helper);

参数:

  • light: 要显示方向的 DirectionalLight 对象。
  • size: 辅助对象的大小,默认值为 1。

添加辅助对象后可以更直观的看到光源的方向。默认平行光角度是垂直于地面的,所以看起来是水平的。

位置调整

js 复制代码
light.position.set(-5, 5, 0);

HemisphereLight

半球光是一种来自天空和地面的光源,光照颜色从天空光线颜色渐变到地面光线颜色。半球光通常用于模拟天空和地面的光照效果。半球光不能投射阴影

js 复制代码
const hemisphereLight = new THREE.HemisphereLight(0xff0000, 0x0000ff, 1);
scene.add(hemisphereLight);

参数:

  • skyColor: 天空的颜色,默认值为 0xffffff(白色)。
  • groundColor: 地面的颜色,默认值为 0xffffff(白色)。
  • intensity: 光的强度,默认值为 1。

PointLight

点光源是一种从一个点向所有方向发射光线的光源,它会产生阴影。点光源通常用于模拟灯泡、蜡烛等光源的效果。

js 复制代码
const light = new THREE.PointLight(0xffffff, 1, 100);
scene.add(light);

参数:

  • color: 光的颜色,默认值为 0xffffff(白色)。
  • intensity: 光的强度,默认值为 1。
  • distance: 光源照射的最大距离,默认值为 0(表示无限远)。
  • decay: 沿着光照距离的衰退量。默认值为 2。

点光源同样也有辅助对象 PointLightHelper,用于显示点光源的位置和范围。

js 复制代码
const pointLight = new THREE.PointLight(0xff0000, 10, 100);
pointLight.position.set(0, 6, 0);
scene.add(pointLight);

const pointLightHelper = new THREE.PointLightHelper(pointLight, 1);
scene.add(pointLightHelper);

SpotLight

聚光灯是一种从一个点向特定方向发射光线的光源,它会产生阴影。聚光灯通常用于模拟手电筒、舞台灯光等光源的效果。

js 复制代码
const spotLight = new THREE.SpotLight(0xffffff, 1, 100, Math.PI / 6, 0.5);
spotLight.position.set(0, 6, 0);
scene.add(spotLight);

参数:

  • color: 光的颜色,默认值为 0xffffff(白色)。
  • intensity: 光的强度,默认值为 1。
  • distance: 光源照射的最大距离,默认值为 0(表示无限远)。
  • angle: 聚光灯的圆锥角度,默认值为 Math.PI / 3。
  • penumbra: 聚光灯的半影衰减百分比,默认值为 0。
  • decay: 沿着光照距离的衰退量。默认值为 2。


书洞笔记

相关推荐
m0_7482299918 小时前
Vue2 vs Vue3:核心差异全解析
前端·javascript·vue.js
C澒18 小时前
前端监控系统的最佳实践
前端·安全·运维开发
xiaoxue..18 小时前
React 手写实现的 KeepAlive 组件
前端·javascript·react.js·面试
hhy_smile18 小时前
Class in Python
java·前端·python
小邓吖19 小时前
自己做了一个工具网站
前端·分布式·后端·中间件·架构·golang
南风知我意95719 小时前
【前端面试2】基础面试(杂项)
前端·面试·职场和发展
LJianK119 小时前
BUG: Uncaught Error: [DecimalError] Invalid argument: .0
前端
No Silver Bullet19 小时前
Nginx 内存不足对Web 应用的影响分析
运维·前端·nginx
一起养小猫20 小时前
Flutter for OpenHarmony 实战 表单处理与验证完整指南
android·开发语言·前端·javascript·flutter·harmonyos
weixin_3954489120 小时前
main.c_cursor_0130
前端·网络·算法