首页 > 其他分享 >Threejs入门-灯光

Threejs入门-灯光

时间:2024-11-28 23:34:23浏览次数:7  
标签:Threejs 场景 入门 灯光 光源 阴影 聚光灯 衰减 光照

在 Three.js 中,灯光是非常重要的元素之一,它能够模拟现实世界中的光照效果,帮助我们打造更加真实的三维场景。灯光的种类和配置方式可以影响整个场景的视觉效果,在不同的应用中,灯光的使用非常关键。

灯光概述

Three.js 提供了几种常见的光源类型:环境光(Ambient Light)、平行光(Directional Light)、点光源(Point Light)、聚光灯(Spot Light)。每种光源类型都具有不同的光照特性,适用于不同的场景需求。

file

我们围绕一个球体案例,做灯光的讲解,首先,写入以下代码,创建一个球体。

// 引入 Three.js 基础模块
import * as THREE from "three";
// 创建场景
const scene = new THREE.Scene();

// 创建相机 (视角:45度,宽高比,近裁剪面,远裁剪面)
const camera = new THREE.PerspectiveCamera(
  75,
  window.innerWidth / window.innerHeight,
  0.1,
  1000
);
camera.position.z = 5; // 设置相机位置

// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight); // 设置渲染器大小
document.body.appendChild(renderer.domElement); // 将渲染器添加到页面中

// 创建球体
const geometry = new THREE.SphereGeometry(1, 32, 32); // 球体几何体
const material = new THREE.MeshStandardMaterial({ color: 0x0077ff }); // 球体材质,使用标准材质
const sphere = new THREE.Mesh(geometry, material); // 创建球体网格
scene.add(sphere); // 将球体添加到场景中

renderer.render(scene, camera);

通过上面的代码,我们已经创建一个场景、相机、渲染器和一个球体。但是运行起来环境是黑暗的,我们需要添加灯光来照亮场景。

环境光(Ambient Light)

环境光是最基础的一种光源,它不具备方向性,也不会产生阴影。它的作用是全局地照亮场景中的所有物体,确保没有完全黑暗的区域。环境光通常用于模拟场景中的“全局光照”,比如自然光在房间内的反射或天空光等。

特点

  • 无方向性: 环境光没有特定的方向,照亮所有物体的所有面。
  • 无阴影: 环境光不产生阴影,因为它是均匀的、全局的光。
  • 全局光照: 它在场景中均匀地影响所有物体,确保没有区域是完全黑暗的。
  • 无法模拟光源的特定效果: 由于环境光的均匀性,它无法模拟物体的光照衰减、反射或投射阴影,因此常常与其他类型的光源结合使用。

属性

new THREE.AmbientLight(color, intensity);
  1. 颜色(color):
    • 环境光的颜色,通常是一个十六进制颜色值。比如,0xffffff 表示白色光。你也可以设置其他颜色,来模拟不同光源的环境光效果。
  2. 强度(intensity):
    • 环境光的强度,控制环境光的亮度。默认为 1,设置为 0 会导致没有环境光。调整强度可以影响场景整体的亮度,但不会改变场景中光源的方向性或阴影效果。

使用方式:

const ambientLight = new THREE.AmbientLight(0xffffff, 0.5); // 环境光,颜色为白色,强度为0.5
scene.add(ambientLight); // 将环境光添加到场景中

在最开的时候代码中,增加环境光后,我们就的得到了
file

可以看到,球体被均匀地照亮,没有明显的阴影。球体看起来也不立体,因为没有明显的光照方向。

平行光(Directional Light)

平行光类似于太阳光,其光线是平行的并且没有衰减。它的方向性非常强,通常用于模拟太阳或远处的光源。平行光可以产生阴影,特别适用于需要光线均匀照射的场景。

特点

  • 方向性: 平行光的光线具有固定的方向,所有物体接收到的光线都是平行的,光线的源头位置并不重要。它模拟的是远离物体的光源,比如太阳光或星光,这些光源的光线几乎是平行的。
  • 没有衰减: 与点光源和聚光灯不同,平行光的强度不会随着距离的增加而衰减。光照强度在整个场景中是均匀的,无论光源距离物体有多远。
  • 产生阴影: 平行光可以产生阴影,适用于需要定向光照的场景。你可以控制阴影的质量、透明度和偏移量等参数。
  • 用于模拟自然光: 平行光常常用于模拟太阳光、月光或任何远处的恒定光源,它对整个场景的照明影响均匀,不会因为物体的大小或距离而发生变化。

属性

new THREE.DirectionalLight(color, intensity);
  1. 颜色(color): 设置平行光的颜色,可以是一个十六进制的颜色值或 THREE.Color 对象。默认是白色(0xffffff)。
  2. 强度(intensity): 设置光源的强度,默认为 1。调整这个值可以控制光的亮度。

使用方式:

const directionalLight = new THREE.DirectionalLight(0xffffff, 10);
directionalLight.position.set(10, 10, 10); // 设置光源的位置
scene.add(directionalLight);

file

可以看到,加入了平行光后,球体的光照效果更加立体,有了明显的高光和阴影。光线的方向性也使得球体的表面更加立体感。

点光源(Point Light)

点光源是从一个特定点发射光线,光线会以球形的方式扩散开来。点光源会随着距离的增加而衰减,因此可以模拟类似灯泡的效果。点光源通常用于场景中的局部照明。

特点

  • 光源位置: 点光源从一个特定的位置发出光线,光线向所有方向均匀传播。你可以通过设置点光源的 position 属性来定义光源的位置。
  • 光照衰减: 点光源的光照强度会随着距离光源的远近而衰减,通常会使用距离衰减模型(如平方反比衰减)来模拟自然界中的光照衰减。它的亮度会随着距离的增加逐渐减弱。
  • 产生阴影: 点光源可以产生阴影,这使得场景的光照效果更加立体和真实。通过配置 castShadow 属性,可以控制是否启用阴影。
  • 全向光照: 点光源向四面八方发射光线,照亮周围的物体,适用于模拟小范围的局部光源。

属性

new THREE.PointLight(color, intensity, distance, decay);
  • 颜色(color): 设置光源的颜色,通常使用十六进制颜色值。默认是白色(0xffffff)。
  • 强度(intensity): 设置光源的亮度,默认是 1。增大强度会使光源变得更亮,减小则变暗。
  • 距离(distance): 设置光照的衰减范围。光照的强度随着距离的增加而减弱。如果设置为 0,光源会无限制地照亮场景中的所有物体。
  • 衰减(decay): 控制光照衰减的速率,默认值为 2。较大的衰减值会让光照更快衰减。
    使用方式:
const pointLight = new THREE.PointLight(0xffffff, 300, 0); // 点光源,颜色为白色,强度为200, 距离为0
pointLight.position.set(5, 5, 5);
scene.add(pointLight);

file

点光源和平行光,虽然都可以产生阴影。但是我们在使用场景上还是有区别的,从场景考虑,点光源更适合模拟局部光源,比如台灯、蜡烛等,而平行光更适合模拟远处的光源,比如太阳光。

特点 点光源(Point Light) 平行光(Directional Light)
光源类型 发光点,在场景中有位置 无位置的平行光线,模拟远处的光源
光线传播 向四面八方发射光线 光线是平行的,所有光线方向相同
光照衰减 会随着距离衰减,强度会减弱 不衰减,光照强度保持恒定
光照方向 所有物体会被均匀照亮,方向是从光源向外发散 所有物体的光照方向相同,具有明确的方向性
光源位置 光源的位置是可设置的 无固定位置,光源的方向决定了光照的方向
适用场景 局部光源,模拟台灯、蜡烛、手电筒等小范围照明 模拟日光、远处的光源、大范围照明(如太阳光)
是否影响阴影 会根据距离和位置影响阴影的强度和方向 影响阴影的方向,所有物体投射的阴影方向相同,但没有衰减
常见用途 小范围局部照明、汽车灯光、室内灯光等 太阳光、远光灯、大范围均匀照明

聚光灯(Spot Light)

聚光灯(Spotlight)是一种具有方向性的光源,其光线从一个特定的点发射,并且有一个锥形的照射范围。它通常用于模拟舞台灯光、手电筒、汽车头灯等聚焦的光源。与点光源(Point Light)和平行光(Directional Light)不同,聚光灯具有可调节的照射角度聚焦范围,并且可以设置光的衰减效果。

特点

  1. 光源位置与方向:
    • 聚光灯是从一个点发射光线的,通常需要设置光源的位置,并通过 target 属性指定光源的照射方向。
    • 聚光灯的光线形成一个锥形区域,只有这个区域内的物体能够被照亮。
  2. 光照范围:
    • 聚光灯的光照范围是可调的,可以通过 角度 (angle) 来控制光锥的宽度。
    • 你可以设置 衰减范围 (distancedecay),控制光源的影响范围和衰减速率。
  3. 锥形区域:
    • 聚光灯的光照效果是锥形的,指定了一个 内角 (angle) 和 外角 (penumbra)。
      • angle 控制了光锥的半角。
      • penumbra 控制了光锥的边缘模糊程度,值为 0 到 1 之间的浮动值,0 表示边缘清晰,1 表示边缘完全模糊。
  4. 光照衰减:
    • 与点光源相似,聚光灯也具有衰减效果。随着距离的增加,光源的强度会衰减。
    • 你可以调整 衰减距离 (distance) 和 衰减系数 (decay),来设置光照的强度和范围。
  5. 阴影:
    • 聚光灯可以投射阴影,适合用来创建光照集中在某个区域的效果。

场景

  1. 舞台照明: 聚光灯通常用于舞台表演,照亮特定区域或演员,使其更加突出。
  2. 汽车前灯: 汽车头灯可以模拟聚光灯的效果,用来照亮前方的道路。
  3. 手电筒或探照灯: 手电筒的光照范围通常是锥形的,类似于聚光灯,适合用来照亮小范围区域。
  4. 游戏中的聚焦效果: 在游戏或虚拟现实中,可以用聚光灯来突出显示某些重要物体或区域,比如在关卡中照亮目标物体或道具。
  5. 灯光特效: 在建筑可视化或电影制作中,聚光灯常常用于创建某种特殊的光影效果,例如光束穿透烟雾或光斑效果。

属性

new THREE.SpotLight(color, intensity, distance, angle, penumbra, decay);
  • color: 光源的颜色,默认为 0xffffff(白色)。
  • intensity: 光源的强度,默认为 1
  • distance: 光源的照射范围,默认为 0,即光源的光照没有限制。
  • angle: 光锥的开口角度,单位为弧度。默认值是 Math.PI / 3(60 度)。
  • penumbra: 控制光锥边缘的模糊程度,值在 01 之间,0 表示锐利的边缘,1 表示完全模糊的边缘。
  • decay: 控制光照的衰减速率,默认为 2

使用方式:

const spotLight = new THREE.SpotLight(0xffffff, 1);
spotLight.position.set(10, 10, 10);
spotLight.target = scene; // 设置聚光灯的目标
scene.add(spotLight); 5. 区域光(RectArea Light)

灯光的属性与配置

每种光源除了位置和强度之外,还有很多可以调整的属性。了解这些属性,有助于我们更好地控制场景中的光照效果。

  1. 颜色与强度
    光源的颜色决定了它照射的光线的颜色,强度决定了光线的亮度。通常,白色光线的强度会影响场景的亮度,而颜色的改变会影响整体的色调。

调整颜色和强度:

const directionalLight = new THREE.DirectionalLight(0xffffff, 1); // 强度为 1
directionalLight.color.set(0xff0000); // 设置光源为红色 2. 光衰减

光源通常会随着距离的增加而衰减。点光源和聚光灯都可以设置衰减因子,模拟现实世界中光线衰减的效果。衰减通常包括常规衰减(距离的平方)和最大衰减距离。

点光源衰减:

const pointLight = new THREE.PointLight(0xffffff, 1, 100); // 衰减距离为 100 3. 阴影

某些光源(如平行光、点光源和聚光灯)能够产生阴影。阴影的产生有助于提高场景的真实感。我们可以设置光源产生阴影的开关、阴影的强度以及阴影的质量。

设置阴影:

directionalLight.castShadow = true; // 开启阴影
renderer.shadowMap.enabled = true; // 开启渲染器的阴影映射 4. 光线投射

聚光灯的投射角度可以通过 angle 和 penumbra 控制,angle 设置聚光灯的锥形角度,penumbra 用于调整边缘的柔和度。

设置聚光灯的投射角度:

spotLight.angle = Math.PI / 4; // 设置聚光灯的角度为 45 度
spotLight.penumbra = 0.2; // 设置阴影边缘柔和度

灯光的进阶应用

除了基础的光照效果外,Three.js 还允许我们使用光源与材质的结合,创造出更加复杂的光影效果。在此部分,我们将介绍一些常见的进阶技巧。

  1. 光照贴图
    光照贴图(Lightmap)是一种预计算的光照信息纹理,它可以存储光照、阴影和反射等信息,并将这些信息应用到模型的表面。这种技术常用于静态场景中,特别是在场景的复杂计算(如全局光照、阴影等)较为消耗性能时,通过光照贴图可以大大提高渲染效率。

  2. HDR 环境光贴图
    HDR 环境光贴图(High Dynamic Range environment map)是一种高动态范围的纹理,它包含了更多的亮度和细节,能够真实地模拟环境中的光照效果。HDR 环境光贴图通常用于提供更高质量的反射、光照效果,适用于更真实的图像渲染。

  3. 反射与折射
    反射和折射是通过灯光与物体表面相互作用产生的效果。在 Three.js 中,我们可以使用镜面反射或折射来增加场景的真实感。

  4. 光源的动画效果
    灯光的动态效果可以通过修改光源的属性(如位置、颜色、强度等)来实现。Three.js 提供了丰富的动画机制,结合光源的属性,可以制作出非常丰富的灯光动态效果。

    常见的灯光动画:

    • 闪烁效果: 模拟灯光的闪烁,例如模拟霓虹灯或电灯的闪烁。
    • 渐变效果: 灯光的强度或颜色渐变,模拟灯光的逐渐变亮或变暗。
    • 移动光源: 让光源在场景中移动,模拟手电筒、车灯等效果。

Three.js学习:https://www.threejs3d.com/

标签:Threejs,场景,入门,灯光,光源,阴影,聚光灯,衰减,光照
From: https://www.cnblogs.com/zsboy/p/18575442

相关文章

  • 【机器学习】什么是逻辑回归?从入门到精通:掌握逻辑回归与二分类问题的解决之道
    从入门到精通:掌握逻辑回归与二分类问题的解决之道引言1.1逻辑回归简介1.2逻辑回归的应用场景逻辑回归基本原理2.1逻辑回归概述逻辑回归的基本思想预测类别的概率2.2线性模型与Sigmoid函数线性模型Sigmoid函数Sigmoid函数的性质为什么选择Sigmoid函数2.3逻辑回归......
  • ThreeJs-03材质进阶
    一.uv贴图在3D计算机图形学中,UV映射是一种将2D纹理映射到3D模型表面的方法。在这里,“U”和“V”代表了2D纹理空间的坐标,这与2D笛卡尔坐标系统中的“X”和“Y”是类似的。在3D模型的每个顶点上,都会有一组对应的UV坐标,它们定义了3D模型在这个顶点上的表面应当对应纹理图像的哪个部......
  • 想做黑客?先来学习 SQL 注入,一文带你学会!黑客技术零基础入门到精通教程建议收藏!
    SQL注入(SQLInjection)是一种常见的网络攻击手段,攻击者通过在Web应用程序的输入字段中插入恶意SQL代码,欺骗后台数据库执行非授权的SQL语句。SQL注入可以用于获取、篡改或删除数据库中的数据,甚至可以用于执行系统命令,导致数据泄露、数据破坏或服务器被控制等严重后果......
  • 网络安全中什么是CC攻击?CC攻击怎么防御?黑客技术零基础入门到精通,收藏这一篇就够了!
    前言这是晓晓给粉丝盆友们整理的网络安全渗透测试入门阶段dos与ddos渗透与防御基础教程喜欢的朋友们,记得给晓晓点赞支持和收藏一下,关注我,学习黑客技术。随着互联网的发展和技术的进步,网络安全问题日益严峻,网络攻击手段层出不穷,其中CC攻击就是一种比较常见的网络攻击手段......
  • 【建议收藏】渗透测试零基础入门教程,全程干货!
    转眼间,从大三开始学安全,到现在也有五年了,也算是对渗透测试有一定理解,公众号准备出一些入门教程,以实操为主,希望可以帮助到想入门渗透测试的小白。如果觉得有用,可以在文章后面支持一下我,作为我写下去的动力。1.什么是渗透测试渗透测试就是模拟真实黑客的攻击手法对目标网站或......
  • 一文带你了解HVV实战攻防演练之红队攻击,零基础入门到精通,收藏这一篇就够了!
    0x00什么是红队红队,一般是指网络实战攻防演习中的攻击一方。红队一般会针对目标系统、人员、软件、硬件和设备同时执行的多角度、混合、对抗性的模拟攻击;通过实现系统提权、控制业务、获取数据等目标,来发现系统、技术、人员和基础架构中存在的网络安全隐患或薄弱环节。红......
  • 【2024最新】小白如何自学网络安全,零基础入门到精通,看这一篇就够了!
    小白人群想学网安但是不知道从哪入手?一篇文章告诉你如何在4个月内吃透网安课程,掌握网安技术一、基础阶段1.了解网安相关基础知识了解中华人民共和国网络安全法、熟知网络安全的相关概念:包括信息安全、风险管理、网络攻防原理、认证与加密等基本概念,2. Linux操作系统Linux......
  • 从入门到精通:安徽京准GPS北斗卫星时间同步系统
    从入门到精通:安徽京准GPS北斗卫星时间同步系统从入门到精通:安徽京准GPS北斗卫星时间同步系统京准电子科技官微——ahjzsz 第一部分  网络时间同步显示系统概述:医院、学校网络时间同步显示系统是由高精度GPS(北斗)网络母钟、高品质,高稳定性系统网络子钟、智能化控制设备及......
  • JVM基础入门
    目录一、什么是JVM1.1.JVM的概念及作用1.2.JVM、JRE、JDK二、JVM内部体系结构2.1.JVM的体系结构2.2.JVM的架构2.3.类加载器2.3.1.类加载器的层次结构2.3.2双亲委派机制打破双亲委派机制2.4.沙箱安全机制、Native关键字、PC寄存器2.5.方法区垃圾回收(后文会介绍)内......
  • InheritableThreadLocal从入门到放弃
    作者:京东零售田超辉背景:一个上线了很久但是请求量很低(平均每天一两次)的历史功能突然出现空指针报错:  我们翻开代码定位到对应的报错代码:  结合堆栈和代码可以确定是由于bdIdJobMap的值为null导致往bdIdEmployeeJobMap这个map中putAll的时候空指针了。而bdIdJobM......