干货:three.js中的六大光源的知识点。

我们在二维屏幕中感知三维场景的一个最重要的要素就是光,光和光源是three.js中一个非常重要的知识点。本文想借着这个话题,为老铁们分享以下六大光源知识点:环境光、点光源、聚光灯、方向光、半球光、平面光。

一、点光源

在 Three.js 中,THREE.PointLight(点光源)是一种单点发光、向所有方向照射的光源。它可以模拟现实世界中类似于灯泡、蜡烛或照明弹等光源的效果。

点光源具有以下属性:

  • color:光源的颜色。
  • distance:光源照射的距离,默认值为0,意味着光的强度不会随着距离增加而减少。
  • intensity:光源照射的强度,默认值为1。
  • position:光源在场景中的位置。
  • visible:如果该属性设置为“true”(默认值),该光源就会打开,如果设置为“false”,光源就会关闭。

通过设置这些属性,可以控制点光源的颜色、强度、照射范围和可见性等。

以下是一个创建点光源的示例代码:

const pointLight = new THREE.PointLight(0xff0000, 1, 100); 
pointLight.position.set(0, 0, 0); 
scene.add(pointLight);

在上述代码中,创建了一个红色的点光源,强度为1,照射距离为100,并将其位置设置为场景的原点(0, 0, 0)。最后,将点光源添加到场景中。

点光源可以为场景中的物体提供照明,产生阴影效果,增强场景的真实感和立体感。可以根据需要调整点光源的属性,以达到期望的照明效果。


二、环境光

在 Three.js 中,环境光(AmbientLight)是一种基本光源,它会均匀地照亮场景中的所有物体。环境光没有特定的来源方向,也不会产生阴影。

环境光的作用是为场景提供一个基本的照明,使物体能够被看见。它可以模拟现实世界中环境光的效果,例如来自天空、墙壁或其他周围物体的反射光。

环境光的颜色和强度可以通过设置相应的属性来调整。较亮的环境光可以使整个场景更明亮,而较暗的环境光可以营造出更暗的氛围。

通常情况下,环境光不会单独使用,而是与其他光源(如点光源、平行光等)结合使用,以达到更真实和丰富的照明效果。例如,可以使用环境光来弱化阴影或为场景添加一些额外的颜色。

以下是一个创建环境光的示例代码:

const ambientLight = new THREE.AmbientLight(0xffffff, 0.5); 
scene.add(ambientLight);

在上述代码中,创建了一个白色的环境光,强度为 0.5,并将其添加到场景中。

需要注意的是,环境光的效果相对较为均匀,不会产生明显的高光和阴影。在实际应用中,可以根据需要调整环境光的属性,并结合其他光源来实现更复杂的照明效果。


三、聚光灯

在 Three.js 中,聚光灯(SpotLight)是一种从一个点向特定方向发射锥形光线的光源。它可以产生阴影,常用于模拟手电筒、台灯、舞台灯光等效果。

聚光灯具有以下属性:

  • color:聚光灯的颜色。
  • intensity:聚光灯的强度。
  • distance:聚光灯的有效距离,超过该距离光线将不再产生影响。
  • angle:聚光灯的光锥角度,决定了光线的扩散范围。
  • penumbra:聚光灯锥形光圈的模糊半径,用于控制阴影的柔和度。
  • decay:聚光灯的衰减系数,影响光线强度随距离的衰减速度。
  • position:聚光灯的位置。
  • target:聚光灯的目标位置(用于确定聚光灯的方向)。

通过设置这些属性,可以调整聚光灯的光照效果,如颜色、强度、照射范围、阴影等,以满足不同场景的需求。

在 Three.js 中添加聚光灯可以按照以下步骤进行:

  1. 创建聚光灯对象:使用THREE.SpotLight构造函数创建一个聚光灯对象。
  2. 设置聚光灯属性:例如颜色、强度、位置、照射范围等。
  3. 将聚光灯添加到场景中:使用scene.add()方法将聚光灯添加到场景中。

以下是一个简单的示例代码:

// 创建聚光灯
const spotLight = new THREE.SpotLight(0xffffff, 1); 
spotLight.position.set(-10, 10, 0); 
spotLight.angle = Math.PI / 10; 
spotLight.penumbra = 0.2; 
scene.add(spotLight);

在上述代码中,创建了一个白色的聚光灯,强度为 1,位置为(-10, 10, 0),照射范围的角度为 Math.PI / 10,边缘模糊半径为 0.2。最后,将聚光灯添加到场景中。

你可以根据需要调整聚光灯的属性,以获得不同的照明效果。


四、方向光

在 Three.js 中,方向光(DirectionalLight)又称为平行光,是一种类似于太阳光的光源。它从一个方向发射光线,并且光线是平行的,不会随着距离的增加而衰减。方向光可以用来模拟太阳光、月光等远距离光源的效果。

方向光的作用是照亮场景中的物体,使其产生明暗变化和阴影效果。通过设置方向光的颜色、强度和方向,可以营造出不同的光照氛围和视觉效果。

以下是一个添加方向光的示例代码:

// 创建方向光
const directionalLight = new THREE.DirectionalLight(0xffffff, 1); 
// 设置方向光的方向
DirectionalLight.position.set(0, 0, 1); 
// 将方向光添加到场景中
scene.add(DirectionalLight);

在上述代码中,首先创建了一个方向光对象,并设置了其颜色为白色,强度为 1。然后,通过设置方向光的位置来确定其照射方向。最后,将方向光添加到场景中。

你可以根据需要调整方向光的颜色、强度和方向,以获得不同的光照效果。同时,还可以结合其他光源和材质来进一步丰富场景的表现。

五、半球光

在 Three.js 中,半球光(HemisphereLight)是一种特殊的光源,它可以为室内或室外场景创建更加自然的光照效果,模拟反光面和光线微弱的天气。半球光的颜色是从天空到地面两个颜色之间的渐变,与物体材质的颜色作叠加后得到最终的颜色效果。一个点受到的光照颜色是由所在平面的朝向(法向量)决定的——面向正上方就受到天空的光照颜色,面向正下方就受到地面的光照颜色,其他角度则是两个颜色渐变区间的颜色。

半球光的作用是为场景提供更加自然和真实的光照,使物体看起来更加立体和生动。它通常用于模拟天空光和地面反射光,可以与其他光源(如点光源、聚光灯、方向光等)结合使用,以增强场景的光照效果。
以下是一个添加半球光的示例代码:

// 创建半球光光源
const hemisphereLight = new THREE.HemisphereLight(0xffffff, 0x000000, 1);
// 设置光源位置
hemisphereLight.position.set(0, 10, 0);
// 将半球光添加到场景中
scene.add(hemisphereLight);

在上述代码中,首先创建了一个半球光光源对象,并设置了其颜色、强度和位置。然后,将半球光添加到场景中。你可以根据需要调整半球光的颜色、强度和位置,以获得不同的光照效果。

六、平面光

在 Three.js 中,平面光(RectAreaLight)是一种从矩形平面均匀发射光线的光源。它可以模拟明亮的窗户或条状灯光,常用于室内和家具建模等场景。

平面光的主要作用是为场景提供特定方向和范围的光照,使物体产生明暗变化和阴影效果。通过设置平面光的颜色、强度、宽度和高度,可以营造出不同的光照氛围和视觉效果。

以下是一个添加平面光的示例代码:

// 创建平面光
const rectLight = new THREE.RectAreaLight(0xffffff, 1, 10, 10); 
// 设置平面光的位置
rectLight.position.set(5, 5, 0); 
// 将平面光添加到场景中
scene.add(rectLight);

在上述代码中,首先创建了一个平面光对象,并设置了其颜色、强度、宽度和高度。然后,通过设置平面光的位置来确定其照射方向。最后,将平面光添加到场景中。

需要注意的是,平面光有以下几个特点:

  • 不支持阴影;
  • 只支持 MeshStandardMaterial 和 MeshPhysicalMaterial 两种材质;
  • 必须在场景中加入 RectAreaLightUniformsLib,并调用 init()。

你可以根据需要调整平面光的参数和位置,以获得不同的光照效果。同时,还可以结合其他光源和材质来进一步丰富场景的表现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3269824.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

模拟string(四)详解

目录 判断string大小关系bool operator(const string&s1,const string s2)代码 bool operator<(const string& s1, const string& s2)代码 bool operator<(const string& s1, const string& s2)代码 bool operator>(const string& s1, const …

Stable Diffusion WebUI本地环境搭建

一、项目代码下载 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 二、环境配置 conda create --n stafu python3.10.6 实际上跟自己创建的环境没有关系&#xff0c;项目启动会自动复制这个环境&#xff0c;之后项目根据这个基础环境构建 也可以在自己…

机器学习——第一章 绪论

目录 1. 1 引言 1. 2 基本术语 1.3 假设空间 1.4 归纳偏好 1. 1 引言 机器学习致力于研究如何通过计算的手段&#xff0c;利用经验来玫善系统自身的性能在计算机系统中&#xff0c;"经验"通常以"数据"形式存在&#xff0c;因此&#xff0c;机器学习所研…

由字节对齐引发的一场“血案“

最近在搞个网络通信协议&#xff0c; 采用socket udp传输&#xff0c; 运行时&#xff0c;居然报段错误了&#xff0c; 经过debug&#xff0c;发现居然是因为字节对齐问题导致的。 这个问题在实现通信协议&#xff0c;是经常会遇到的问题&#xff0c; 为了方便读者理解&am…

PSVR2下个月将正式支持PC

PlayStation VR 2将于下个月正式支持PC平台。连接PC&#xff0c;需要使用PlayStation VR2头显PC适配器&#xff0c;该适配器将于8月7日发售。 需要注意的是&#xff0c;玩家还需要一根兼容DisplayPort 1.4的线缆、一个Steam账号以及满足最低配置要求的PC。 索尼特别强调&#…

js 替换json中的转义字符 \

例如有以下字符串 "\"{\\\"account\\\":\\\"66\\\",\\\"name\\\":\\\"66\\\"}\"" 想得到如下字符串 {"account":"66","name":"66"} 执行替换字符串 "\"{…

大坝安全监测设备有哪些主要功能?

推荐型号&#xff1a;TH-WY1】大坝安全监测设备的主要功能包括以下几个方面&#xff1a; 1. **实时监测大坝的各项物理参数**&#xff1a;包括应变、位移、水位、流量等<sup>1</sup><sup>2</sup>。 2. **数据处理和分析**&#xff1a;对监测数据进行处…

热门音效、BGM哪里可以免费下载?

剪辑的奇妙世界等你探索&#xff01;在这个创意的领域里&#xff0c;音效是创造氛围、增强表现力的重要元素。我整理了8个优质的剪辑音效素材网站&#xff0c;它们提供了丰富多样的音效资源&#xff0c;无论是制作视频、音乐还是动画&#xff0c;都能为你提供所需的声音。 1、b…

单关节电机动力学辨识

这是一个单关节电机的动力学辨识过程&#xff0c;这是一个yaw轴转动电机的动力学辨识过程 1、动力学建模 &#xff08;1&#xff09;整体动力学 F J α f F J\alpha f FJαf 单关节的物理量包括惯性项、离心力和科氏力、摩擦力。这里忽略离心力和科氏力&#xff0c;据说…

信息学奥赛初赛天天练-47-CSP-J2020完善程序1-质数、因数、质因数、质因数分解算法、质因数分解算法优化

PDF文档公众号回复关键字:20240727 2020 CSP-J 完善程序1 1 完善程序 (单选题 &#xff0c;每小题3分&#xff0c;共30分) 质因数分解给出正整数 n&#xff0c;请输出将 n 质因数分解的结果&#xff0c;结果从小到大输出 例如&#xff1a;输入 n120&#xff0c;程序应该输出…

mysql报错:Unknown collation: ‘utf8mb4_0900_ai_ci‘的原因及解决方法

参考博客&#xff1a;http://t.csdnimg.cn/NRzyk 报错场景描述 使用navicate在查询中运行sql语句时报错&#xff1a;Unknown collation: utf8mb4_0900_ai_ci 报错原因 生成转储文件的数据库版本为8.0&#xff0c;我本地数据库版本为5.6&#xff0c;高版本导入到低版本&…

【C++】透析类和对象(下)

有不懂的可以翻阅我之前文章&#xff01; 个人主页&#xff1a;CSDN_小八哥向前冲 所属专栏&#xff1a;CSDN_C入门 目录 拷贝构造函数 运算符重载 赋值运算符重载 取地址运算符重载 const成员函数 取地址重载 再探构造函数 初始化列表 类型转换 static成员 友元 内…

【CN】Argo 持续集成和交付(一)

1.简介 Argo 英 [ˈɑ:ɡəu] 美 [ˈɑrˌɡo] Kubernetes 原生工具&#xff0c;用于运行工作流程、管理集群以及正确执行 GitOps。 Argo 于 2020 年 3 月 26 日被 CNCF 接受为孵化成熟度级别&#xff0c;然后于 2022 年 12 月 6 日转移到毕业成熟度级别。 argoproj.github.i…

(最全最小白易懂版)Yolov8新手教程-配置环境、数据集处理、目标检测、结果分析处理(图像指标、可视化结果)、报错分析等全过程学习记录

目录 一、安装环境&#xff08;配置yolo、demo测试&#xff09; 二、数据集准备&#xff08;格式学习&#xff09; 三、训练数据集 1.划分数据集 2.训练数据集 2.1常规训练 2.2微调 3.各种报错记录 3.1AttributeError 3.2TypeError 3.3Error while loading conda en…

Flutter Dio网络请求报错FormatException: Unexpected character

最近开发Flutter项目&#xff0c;网络请求采用的是Dio框架&#xff0c;在发起网络请求的时候报错&#xff1a; 网络请求返回的数据为&#xff1a; var returnCitySN {\"cip\": \"127.0.0.1\", \"cid\": \"00\", \"cname\"…

浅谈 JVM 的内存划分、类加载、垃圾回收机制

文章目录 一、JVM内存划分1.1、JVM为什么要进行内存划分&#xff1f; 二、JVM类加载2.1、什么是类加载&#xff1f;2.2、类加载大体过程2.3、何时触发类加载&#xff1f;2.4、双亲委派模型[!面试高频问题]2.4.1、类加载器2.4.1、什么是双亲委派模型&#xff1f; 三、JVM 垃圾回…

Flink SQL 的工作机制

前言 Flink SQL 引擎的工作流总结如图所示。 从图中可以看出&#xff0c;一段查询 SQL / 使用TableAPI 编写的程序&#xff08;以下简称 TableAPI 代码&#xff09;从输入到编译为可执行的 JobGraph 主要经历如下几个阶段&#xff1a; 将 SQL文本 / TableAPI 代码转化为逻辑执…

书生大模型实战营--L1关卡-OpenCompass 评测 InternLM-1.8B 实践

一、使用 OpenCompass 评测 internlm2-chat-1.8b 模型在 MMLU 数据集上的性能 1、使用lmdeploy部署 internlm2-chat-1.8b模型 2、根据OpenCompass官网教程安装并下载数据集 opencompass/README_zh-CN.md at main open-compass/opencompass GitHub 注意&#xff1a; pyhton…

【Java】this关键字、构造方法、标准javabean类(009)

目录 ♦️构造方法 &#x1f383;无参数构造方法&#xff08;空参构造&#xff09; &#x1f383;有参数构造方法 ♦️this关键字 &#x1f383;就近原则 &#x1f383;使用this关键字调用本类中的属性 ​编辑 &#x1f383;使用this关键字调用成员方法 ​编辑 &#x…

Collention集合基础知识

Array 数组是一种连续的内存空间存储相同数据类型数据的线性数据结构 数组获取其他元素的地址值 寻址公式 a[i] baseaddress i*datatypesize 为什么数组索引从0开始 从1开始不行吗 从0开始寻址公式 a[i] baseaddress i*datatypesize 从1开始寻址公式 a[i] baseadd…