threejs平行光DirectionalLight介绍及使用

js yekong

在 Three.js 中,平行光(THREE.DirectionalLight)是一种模拟太阳光的光源类型。它是一种平行于特定方向的光源,类似于太阳光,在整个场景中产生平行的光线。平行光可以产生阴影,并且会对场景中的物体进行照明,是创建逼真场景的重要光源之一。

平行光有以下特点:

  1. 平行光的方向: 平行光是有方向的,通过设置 THREE.DirectionalLightposition 属性或者 target 属性来定义光线的方向。平行光的光线是平行于这个方向的,类似于太阳光的效果。

  2. 产生阴影: 平行光可以产生阴影,为场景中的物体增加逼真的阴影效果。要启用平行光的阴影功能,需要将 castShadow 属性设置为 true,并且为场景中的接收阴影的物体设置 receiveShadow 属性为 true

  3. 均匀的光照: 平行光在整个场景中产生均匀的光照效果,类似于太阳光的照明。

创建平行光的方式非常简单,只需调用 THREE.DirectionalLight 的构造函数,传入颜色和强度参数即可。以下是创建一个基本平行光的示例代码:

import * as THREE from 'three';

// 创建平行光,颜色为白色,强度为 1
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);

// 设置平行光的方向
directionalLight.position.set(1, 2, 3);

在这个示例中,我们使用 import 语句导入 Three.js 库,并创建了一个平行光实例 directionalLight。我们将平行光的颜色设置为白色(0xffffff 表示白色),强度设置为 1,表示光照的强度为原来的一倍。

然后,我们通过设置 directionalLight.position 属性来定义光线的方向。在这个示例中,我们将平行光的方向设置为 (1, 2, 3),表示光线平行于这个方向。

使用平行光可以为场景提供逼真的光照效果,它通常与其他类型的光源(如环境光、点光源等)一起使用,以实现更加真实的三维场景效果。通过调整平行光的方向和强度,你可以控制场景中的光照效果,增强场景的真实感。

平行光参数

在 Three.js 中,平行光(THREE.DirectionalLight)的构造函数有以下参数:

constructor(color?: THREE.Color | string | number, intensity?: number)

参数说明:

  • color:平行光的颜色,可以使用 THREE.Color、字符串表示的颜色(如 '#ffffff' 或 'white'),或者表示颜色的十进制数值。默认值为白色,即 0xffffff
  • intensity:平行光的强度,默认值为 1。强度为 0 表示没有光照效果,大于 0 表示有光照效果,并控制着光照的亮度。

除了构造函数参数之外,平行光还具有一些其他的属性可以用于进一步调整光照效果:

  • position:平行光的方向向量,它指定了光线的方向。光线将从场景的正中心朝着 position 所表示的方向照射。你可以使用 THREE.Vector3 来设置 position 的值。
  • target:用于设置平行光的目标位置,平行光的方向将朝向 target 所表示的位置。与 position 配合使用,可以更直观地控制光线的方向。

示例代码:

import * as THREE from 'three';

// 创建平行光,颜色为白色,强度为 1
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);

// 设置平行光的方向
directionalLight.position.set(1, 2, 3);

// 设置平行光的目标位置
const targetPosition = new THREE.Vector3(0, 0, 0);
directionalLight.target.position.copy(targetPosition);

在这个示例中,我们创建了一个平行光实例 directionalLight,将其颜色设置为白色,强度设置为 1。然后,我们通过 position 属性将平行光的方向设置为 (1, 2, 3)。最后,我们设置了平行光的目标位置为场景的中心位置 (0, 0, 0),使得光线从平行光的位置朝向场景的中心。

threejs 添加平行光

平行光辅助观察DirectionalLightHelper

在 Three.js 中,为了方便调试和观察平行光的方向和范围,你可以使用 THREE.DirectionalLightHelper 来创建一个平行光辅助观察器。平行光辅助观察器将以可视化的方式显示出平行光的方向和范围,使你能够更直观地了解光照的情况。

THREE.DirectionalLightHelper 的构造函数有以下参数:

constructor(light: THREE.DirectionalLight, size?: number)

参数说明:

  • light:要辅助的平行光对象,通常传入一个已经创建的 THREE.DirectionalLight 实例。
  • size:辅助观察器的尺寸(大小),默认值为 1。这个参数控制着辅助观察器的显示大小。

以下是一个示例代码,展示如何创建一个平行光并添加其辅助观察器:

import * as THREE from 'three';

// 创建平行光,颜色为白色,强度为 1
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);

// 设置平行光的方向
directionalLight.position.set(1, 2, 3);

// 创建平行光辅助观察器,并设置其尺寸
const helper = new THREE.DirectionalLightHelper(directionalLight, 5);

// 将辅助观察器添加到场景中
scene.add(helper);

在这个示例中,我们创建了一个平行光实例 directionalLight,将其颜色设置为白色,强度设置为 1。然后,我们通过 position 属性将平行光的方向设置为 (1, 2, 3)。

接着,我们使用 THREE.DirectionalLightHelper 构造函数创建了一个平行光辅助观察器 helper,并设置其尺寸为 5。最后,我们将辅助观察器添加到场景中,这样就能够在场景中看到平行光的方向和范围。

通过使用平行光辅助观察器,你可以更直观地观察和调试平行光的方向,以及确认光照是否符合你的预期效果。一旦调试完成,记得在最终的项目中移除辅助观察器,以免影响场景的表现。

平行光辅助观察DirectionalLightHelper

平行光与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)

不同位置下的平行光效果

其他光源

threejs 光源有哪些?

喜欢