three.js 光源、光源辅助对象和阴影简介

news2024/11/15 23:48:13

Three.js 光源对物体的影响

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

threejs提供的网格材质,有的受光照影响,有的不受光照影响。
在这里插入图片描述

光源简介

当使用漫反射网格材质MeshLambertMaterial时,会受到光线的影响, 我们代码里面如果没有设置光线,则使用漫反射网格材质MeshLambertMaterial修饰的模型不可见,这个时候,我们添加光线后,便可以看见。

three.js提供了很多模拟生活中光源的API。
在这里插入图片描述
光源特点:
在这里插入图片描述

点光源PointLight

点光源PointLight从一个点向各个方向发射的光源。可以类比为一个发光点,就像生活中一个灯泡以灯泡为中心向四周发射光线。

PointLight( color, intensity, distance, decay )

  • color:光源颜色。默认为白色(0xffffff)。
  • intensity:光照强度。默认值为 1。
  • distance:光源照射的最大距离。默认值为 0(无限远)。
  • decay:沿着光照距离的衰退量。默认值为 2。
const pointLight = new THREE.PointLight(0xff0000, 1, 100);
// 设置点光源位置
pointLight.position.set(50, 50, 50);
// 将点光源添加到场景中
scene.add(pointLight);

除了通过THREE.PointLight的参数设置,还可以通过属性设置光照相关参数。

pointLight.intensity = 1.0; // 光照强度
pointLight.decay = 0.0; // 设置光源不随距离衰减

点光源辅助对象PointLightHelper

// 光源辅助观察 pointLight模拟光源,10辅助对象尺寸
const pointLightHelper = new THREE.PointLightHelper(pointLight, 10);
scene.add(pointLightHelper);

环境光AmbientLight

环境光AmbientLight环境光会均匀的照亮场景中的所有物体。它没有特定方向,只是整体改变场景光照明暗。

AmbientLight(color, intensity)

  • color:光源颜色。默认为白色(0xffffff)。
  • intensity:光照强度。默认值为 1。
const ambientLight = new THREE.AmbientLight(0xffffff, 0.4);
// 将环境光添加到场景中
scene.add(ambientLight);

平行光DirectionalLight

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

DirectionalLight(color, intensity)

  • color:光源颜色。默认为白色(0xffffff)。
  • intensity:光照强度。默认值为 1。
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.4);
// 设置光源方向
directionalLight.position.set(80, 100, 50);
// 将平行光添加到场景中
scene.add(directionalLight);

可以通过设置.target属性指定目标,可以不设置,默认的位置是0,0,0。

// 方向光指向对象网格模型mesh
directionalLight.target = mesh;

平行光阴影

1.模型阴影投射

通过.castShadow设置产生阴影的模型对象。

// 设置产生投影的网格模型
mesh.castShadow = true;

2.光源阴影投射

和产生阴影的模型一样,光源也有阴影投射属性.castShadow属性,光源默认不产生阴影,需要代码开启。通过.castShadow设置产生阴影的光源对象。

// 平行光
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
// 平行光设置产生阴影的光源对象,开启光源阴影的计算功能
directionalLight.castShadow = true;

3.模型阴影接收

通过.receiveShadow设置接收阴影效果的模型。

// 设置接收阴影的投影面
mesh.receiveShadow = true;

4.允许渲染器阴影渲染。

webGL的渲染器的阴影贴图属性.shadowMap的属性值是一个对象,.shadowMap具有.enabled.type等属性。

// 设置渲染器,允许光源阴影渲染
renderer.shadowMap.enabled = true; 

5.设置光源阴影渲染范围

平行光阴影相机属性.shadow.camera的作用是约束三位场景阴影计算范围,属性值是一个正投影相机对象OrthographicCamera。所以.shadow.camera属性的用法可以参考正投影相机对象OrthographicCamera

// 设置三维场景计算阴影的范围
directionalLight.shadow.camera.left = -50;
directionalLight.shadow.camera.right = 50;
directionalLight.shadow.camera.top = 200;
directionalLight.shadow.camera.bottom = -100;
directionalLight.shadow.camera.near = 0.5;
directionalLight.shadow.camera.far = 600;

平行光辅助对象DirectionalLightHelper

// 可视化平行光,directionalLight被模拟的光源,5平面尺寸,0xff0000光源颜色
const directionalLightHelper = new THREE.DirectionalLightHelper(directionalLight, 5,0xff0000);
scene.add(directionalLightHelper);

平行光照射到网格模型Mesh表面,光线和模型表面构成一个入射角度,入射角度不同,对光照的反射能力不同。
光线照射到漫反射网格材质MeshLambertMaterial对应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);

聚光灯SpotLight

聚光灯SpotLight光线从一个点沿一个方向射出,随着光线照射的变远,光线圆锥体的尺寸也逐渐增大。

SpotLight(color, intensity, distance, angle, penumbra, decay)

  • color:光源颜色。默认为白色(0xffffff)。
  • intensity:光照强度。默认值为 1。
  • distance:光源照射的最大距离。默认值为 0(无限远)。
  • angle:光线照射范围的角度。默认值为Math.PI/3。
  • penumbra:聚光锥的半影衰减百分比。默认值为 0。
  • decay:沿着光照距离的衰减量。默认值为 2。
const spotLight = new THREE.SpotLight(0xffffff,1.0);
// 设置聚光光源位置
spotLight.position.set(0, 50, 0);
// 将聚光灯添加到场景中
scene.add(spotLight);

除了通过THREE.SpotLight的参数设置,还可以通过属性设置光照相关参数。

spotLight.intensity = 1.0; // 光照强度
spotLight.decay = 0.0; // 设置光源不随距离衰减
spotLight.angle = Math.PI / 6; // 设置聚光光源发散角度,光锥角度的二分之一

聚光源目标对象.target和光源的位置.position共同确定聚光源照射方向。聚光源目标对象属性的位置通过属性值Object3D.position属性设置

// spotLight.target是一个模型对象Object3D,默认在坐标原点
spotLight.target.position.set(50,0,0);
//spotLight.target添加到场景中.target.position才会起作用
scene.add(spotLight.target);

聚光源辅助对象SpotLightHelper

// 可视化平行光,spotLight被模拟的光源,0xff0000光源颜色
const spotLightHelper = new THREE.SpotLightHelper(spotLight,0xff0000);
scene.add(spotLightHelper);

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

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

相关文章

Linux进程间通信学习记录(IPC 机制以及共享内存)

0.System V IPC机制: ①.IPC对象包含:共享内存、消息队列和信号灯集。 ②.每个IPC对象有唯一的ID。 ③.IPC对象创建后一直存在,直到被显示地删除。 ④.每一个IPC对象有一个关联的KEY。(其他进程通过KEY访问对应的IPC对象&#xff…

索引的设计原则

4.索引的设计原则 4.1.数据准备 a.创建数据库、创建表 CREATE DATABASE atguigudb1; USE atguigudb1;# 创建学生表和课程表 CREATE TABLE student_info (id INT(11) AUTO_INCREMENT,student_id INT NOT NULL ,name VARCHAR(20) DEFAULT NULL,course_id INT NOT NULL ,class_…

x64汇编语言与逆向工程实战指南(四)

目录 1. 数组的存储与遍历1.1 编写数组数据写入内存1.2 汇编循环遍历数组元素 3. Lea指令4. mul指令与imul指令4.1 mul 指令4.2 imul 指令总结 5. div指令5.1 div 指令的基本原理5.2 8 位除法5.3 16 位除法5.3 32 位除法特点和要求 1. 数组的存储与遍历 1.1 编写数组数据写入内…

基于Web的可回收物品收购系统-计算机毕业设计源码49082

摘 要 随着电子商务和在线交易的快速发展,二手商品市场逐渐成为一个不可忽视的经济领域。其中,可回收系统的收购成为了一个关键环节,它不仅有助于资源的有效再利用,还对环境保护和可持续发展起到了积极的推动作用。Servlet可回收…

单片机中的存储器讲解

单片机中的存储器 目录 单片机中的存储器常用的存储器易失性存储器RAMSRAMDRAM 非易失性存储器ROMMask ROMPROMEPROME2PROMFlashNOR FlashNADN Flash 单片机里全局变量、局部变量、堆、栈的存储区域区域介绍栈区堆区静态区代码区常量区 内存分区分类四个区域 常用的存储器 易失…

【Linux】:实现一个简易的shell

目录 1.命令行提示符 2.命令行参数 2.1 获取命令行参数 2.2 解析命令行参数 3.判断指令类型 3.1 模拟cd命令 3.2 模拟export和echo bash的环境变量来源 4.外部指令的执行 1.命令行提示符 在我们输入指令前,终端界面一般有一个命令行提示符, …

性能优化理论篇 | swap area是个什么东西

我们知道每台计算机的内存(RAM)都是有限的,而我们的应用程序需要加载到内存才能被运行,如果一台机器运行多个应用程序时,内存可能会耗尽。Linux 系统中的“交换空间(也称为交换分区)”可以帮助缓…

VM相关配置及docker

NAT——VMnet8网卡 桥接——WLAN/网线 仅主机——VMnet1网卡 docker与虚拟机的区别 启动docker服务 systemctl start docker 重启 systemctl start docker关闭docker服务 systemctl stop docker.servicedocker的两大概念 镜像:images,应用程序的静态文…

nssctf-[SWPUCTF 2022 新生赛]1z_unserialize-简单的序列化题目

1. 打开题目是一段很简单的php代码 对代码进行分析,题目中有一个__destruct析构函数,这个函数是在对象被销毁的时候触发,那那么在这里new一下就相当于销毁一个对象,$a$this->lt;和$a($this->lly);相当于是$this->lt(thi…

CSS3-新特性

1.新增选择器 1.属性选择器 2.结构伪类选择器 3.伪元素选择器(重点) 4.CSS3 盒子模型 2.CSS3滤镜filter 3.CSS3 calc 函数 4.CSS3 过渡(重点)

8月18日微语报,星期日,农历七月十五

8月18日微语报,星期日,农历七月十五,周末愉快! 一份微语报,众览天下事! 1、南昌从业者谈蔬菜涨价:天热易变质增加损耗,农户收入未明显提升。 2、委员建议“行政教学分离”&#x…

后端开发刷题 | 寻找峰值【二分法】

描述 给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。 1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于 2.假设 nums[-1] nums[n] −∞ 3.对于…

【精选】基于Java摄影约拍系统设计与实现(全网独一无二,最新定制)

目录 目录: 系统简介: 核心技术介绍 mysql技术介绍 IDEA编译器介绍 Springboot框架简介 springmvc框架简介 Mybatis技术简介 Node.js技术简介 Vue.js技术简介 系统数据库详细设计 系统功能设计 系统测试运行 模块测试 系统整体测试 测试过程 测试…

启明欣欣STM32开发板运行ThreadX

ThreadX是非常优秀的RTOS,微软收购了ThreadX后就开源了,后来又交给Eclipse基金会, 本文讲述如何在STM32上运行ThreadX,使用CubeMX来实现。本人环境如下, CM4芯片:STM32F407ZGT6,内存192KB&am…

分布式事务方案——基于两阶段提交的 XA事务

分布式事务方案——基于两阶段提交的 XA事务 在这篇文章中深入理解分布式事务中的两阶段提交(2PC),什么是2PC,2PC原理是怎样?2PC有没有什么问题?解决方案?无法解决的情况? 我们详细…

24/8/18算法笔记 目标导向强化学习

目标导向强化学习(Goal-Oriented Reinforcement Learning,简称GORL)是强化学习的一个分支,它关注于智能体如何通过与环境的交互来实现特定的目标或任务。与传统的强化学习不同,目标导向强化学习更加关注目标的设定和达…

图像数据处理13

三、空域滤波 3.1滤波器的基本概念 什么是滤波? 简单来说就是从干扰信号中提取出有用的信号 3.1.1空域滤波(Spatial Domain Filtering) 空域滤波适用于简单的滤波任务,直接对图像的像素空间进行操作。它通过对图像中的每个像…

如何选择流量与商业潜力兼备的SEO关键词?

如何选择流量与商业潜力兼备的SEO关键词? 你选择的关键词可以成就或破坏你的SEO活动。 如果你明智地选择关键词,那么你制作的内容将有可能月复一月地吸引有价值的自然搜索流量。如果你选择了错误的关键词,你的内容将只能吸引低价值的流量&a…

Java流程控制07:增强for循环

本节内容视频链接:Java流程控制10:增强for循环_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p42&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的增强for循环(‌也称为“for-each”循环)‌是…

实用好软-----电脑端好用的免费音乐下载小工具 简单 快速

目前很多很多音乐软件都是收费的。要么是试听。前段时间分享了一款嗅探工具感觉很不错。今天分享的这款小工具超小。下载只有3M大小。解压后运行窗口简单。直接输入歌曲名字即可搜索出来。然后选择下载即可 界面 测试了下还是比较好用的。而且下载很快 ,不过软件显…