【Three.js入门】灯光与阴影、平行光阴影属性、聚光灯的属性和应用

news2024/11/24 5:00:58

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端
📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招)
🚀未来打算: 为中国的工业软件事业效力n年
🥇推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2&Vue3项目实战 🥝Node.js 🍒Three.js
🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享&商务合作,快加入进来吧

Three.js 系列文章目录

Three.js 专栏参考链接
Three.js 入门案例程序人生——与足球共舞的火柴人
Three.js 入门(一)创建第一个场景和物体(轨道控制器、坐标轴辅助器…)
Three.js 入门(二)处理动画、尺寸自适应、双击进入/退出全屏
Three.js 入门(三)图形用户界面GUI、BufferGeometry创建矩形、随机生成三角形
Three.js 入门(四)纹理及其常用属性、透明纹理、环境遮挡贴图与强度

文章目录

  • Three.js 系列文章目录
    • 一、灯光与阴影的关系与设置
    • 二、平行光阴影属性
      • 1、设置阴影模糊度
      • 2、阴影贴图
      • 3、平行光投射相机的属性
    • 三、聚光灯的属性和应用


【使用 Three.js 实现的效果】

一、灯光与阴影的关系与设置

灯光阴影:

  • 材质要满足能够对光照有反应
  • 设置渲染器开启阴影计算 renderer.shadowMap.enabled = true
  • 设置光照投射阴影 directionalLight.castShadow = true
  • 设置物体投射阴影 sphere.castShadow = true
  • 设置物体接收阴影 plane.receiveShadow = true

下面的解释与上面的灯光阴影相对应:

.shadowMap 它包含阴影贴图的引用

.castShadow 如果设置为 true 该平行光会产生动态阴影

.castShadow 对象是否被渲染到阴影贴图中

.receiveShadow 材质是否接收阴影

我们先创建一个球体和一个平面,为球体阴影到平面上做准备。之后以上的四步也是缺一不可的(渲染器阴影计算,光照投射阴影,球体投射阴影,平面接收阴影)

// 创建一个球
const sphereGeometry = new THREE.SphereBufferGeometry(1, 20, 20)
// 设置材质
const material = new THREE.MeshStandardMaterial()
// 结合实体和材质
const sphere = new THREE.Mesh(sphereGeometry, material)

// 打开球体的投射阴影
sphere.castShadow = true

// 添加到场景中
scene.add(sphere)

// 创建平面
const planeGeometry = new THREE.PlaneBufferGeometry(10, 10)
const plane = new THREE.Mesh(planeGeometry, material)
plane.position.set(0, -1, 0)
// 正面旋转 90°,调整平面的位置
plane.rotation.x = -Math.PI / 2

// 开启平面接收阴影
plane.receiveShadow = true

scene.add(plane)

// 环境光:均匀的照亮场景中的所有物体
const light = new THREE.AmbientLight(0xffffff, 0.9)
scene.add(light)

// 平行光:方向从一个平行光位置 position 到 target 位置
const directionLight = new THREE.DirectionalLight(0xffffff, 0.95)
// 设置光的位置
directionLight.position.set(10, 10, 10)

// 开启光照投射阴影
directionLight.castShadow = true

scene.add(directionLight)

// 初始化渲染器
const renderer = new THREE.WebGLRenderer()
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight)

// 开启场景中的阴影贴图
renderer.shadowMap.enabled = true

// 将 webgl 渲染的 canvas 内容添加到 body
document.body.appendChild(renderer.domElement)
......

在这里插入图片描述


二、平行光阴影属性

1、设置阴影模糊度

.radius 将此值设置为大于 1 的值将模糊阴影的边缘。较高的值会在阴影中产生不必要的条带效果。

// 设置阴影贴图模糊度
directionLight.shadow.radius = 20

在这里插入图片描述


2、阴影贴图

.mapSize 一个 Vector2 定义阴影贴图的宽度和高度。较高的值会以计算时间为代价提供更好地阴影质量。但值必须是 2 的幂,默认值是(512, 512)

// 设置阴影贴图的分辨率
directionLight.shadow.mapSize.set(2048, 2048)

在这里插入图片描述


3、平行光投射相机的属性

近端,远端,上下左右。当我们改变近端的值时,阴影的大小会相应的发生改变

// 设置平行光投射相机的属性
directionLight.shadow.camera.near = 18.2
directionLight.shadow.camera.far = 500
directionLight.shadow.camera.top = 5
directionLight.shadow.camera.bottom = -5
directionLight.shadow.camera.left = -5
directionLight.shadow.camera.right = 5

在这里插入图片描述


三、聚光灯的属性和应用

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

相关属性:

  • color 十六进制光照颜色,缺省值 0xffffff(白色)
  • intensity (可选参数)光照强度,缺省值 1
  • distance 从光源发出光的最大距离,其强度根据光源的距离线性衰减
  • angle 光线散射角度,最大值为 Math.PI/2
  • penumbra 聚光锥的半影衰减百分比。在0和1之间的值。默认为 0
  • decay 沿着光照距离的衰减量

使用聚光灯,改变 target 的位置,通过 GUI 来查看不同距离的显示效果

......
// 聚光灯
const spotLight = new THREE.SpotLight(0xffffff, 0.5)
// 设置光的位置
spotLight.position.set(5, 5, 5)

// 设置阴影贴图模糊度
spotLight.shadow.radius = 20
// 设置阴影贴图的分辨率
spotLight.shadow.mapSize.set(4096, 4096)
// 设置目标
spotLight.target = sphere


// 设置光照投射阴影
spotLight.castShadow = true
scene.add(spotLight)

// 使用 GUI,改变球体在 x 轴的位置,查看投影效果
gui
    .add(spotLight.position, 'x')
    .min(-5)
    .max(5)
    .step(0.1)

在这里插入图片描述在这里插入图片描述


// 设置聚光灯的角度
spotLight.angle = Math.PI / 10

在这里插入图片描述


// 设置从光源发出光的最大距离
spotLight.distance = 0

gui
    .add(spotLight, 'distance')
    .min(0)
    .max(30)
    .step(0.01)

在这里插入图片描述


// 聚光锥的半影衰减百分比
spotLight.penumbra = 0

gui
    .add(spotLight, 'penumbra')
    .min(0)
    .max(1)
    .step(0.01)

在这里插入图片描述


// 设置沿着光照距离的衰减量
spotLight.decay = 0
......
gui
    .add(spotLight, 'decay')
    .min(0)
    .max(5)
    .step(0.01)
......
renderer.physicallyCorrectLights = true

在这里插入图片描述


在这里插入图片描述


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

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

相关文章

百趣代谢组学分享:针灸改善乳腺癌相关性疲劳!非靶代谢组学…

非靶代谢组学肠道菌群测序:改善乳腺癌相关性疲劳—针灸! 文章标题:Acupuncture ameliorates breast cancer-related fatigue by regulating the gut microbiota-gut-brain axis 发表期刊:Frontiers in Endocrinology 影响因子&#xff1…

HTML5 新增元素

文章目录HTML5 新增元素概述headernavarticleasidesectionfooter表单元素新增type属性值(验证型)新增type属性值(取值型)output元素addressprogressmeterfigure 和 figcaptionfieldset 和 legendascriptHTML5 新增元素 概述 HTM…

BOM对象

1、什么是BOM BOM(Browser Object Model)即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是 window。 BOM 由一系列相关的对象构成,并且每个对象都提供了很多方法与属性。 BOM 缺乏标…

B端产品-筛选功能如何设计

相信大家在设计B端产品时,最常打交道的就是列表,而列表最常用的一个功能就是搜索,别小看一个简简单单的搜索功能,其实里边的门道也是有很多的。那么如何设计一个好用的搜索栏呢?今天就与大家分享一下,自己负…

【动态规划篇】最少分割回文 编辑距离 不同的子序列

🌠作者:阿亮joy. 🎆专栏:《数据结构与算法要啸着学》 🎇座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉…

音视频技术开发周刊 | 277

每周一期,纵览音视频技术领域的干货。新闻投稿:contributelivevideostack.com。GNNear:基于近内存处理的大规模图神经网络训练加速器图神经网络(GNNs)已经成为分析非欧几里得图数据的最新算法。然而,实现高效的GNN训练是一项挑战&…

西门子1513CPU冗余组态

西门子1513R冗余配置 1、打开博图16软件,新建项目,添加新设备,在弹出的控制器目录下找到CPU 1513R-1 PN硬件,然后系统自动生成PLC_1和PLC_2; 2、打开设备组态中的网络视图,添加接口模块; 3、在…

Springboot 统计 代码执行耗时时间 ,玩法多到眼花

前言 近日群里有萌新提到关于统计代码执行时间的事: 开始 System.currentTimeMillis() 减去 结束 System.currentTimeMillis() 等于 耗时 其实我个人感觉OK的,就这样就蛮好的,很多项目都是这样用的。 简简单单的挺好。 这一篇就是 …

基于Java( jsp+servlet+javabean)+SQL sever 2017实现(Web)高校选课管理系统【100010058】

一、需求分析 开发意义: 随着信息技术不断向深入发展,越来越多的学校开始着手信息化建设。其中学生选课、成绩信息化管理就是其中重要的一块内容。学生选课与成绩信息规模大、项目条数多、信息量庞大,传统的人工管理方式显然已经无法满足要求…

买不到的数目(蓝桥杯C/C++A组真题详解)

题目详细: 题目思路: 对于这个题有一个定理 如果 a,b 均是正整数且互质,那么由 axby,x≥0,y≥0 不能凑出的最大数是 : a*b-a-b 具体的证明过程这里就不赘述 感兴趣的同学可以自行查找 这里就提供一种思…

rk3568 | rk平台GPIO冲突检测小技巧

上一篇我们讲解了如何编写gpio驱动,但是实际操作中,经常发现gpio引脚被占用的情况发生,那么本篇文章就详细讲解rxw平台下如何快速定位gpio复用问题以及如何解决。 一、GPIO寄存器查找 要想查看某个GPIO引脚可以配置的功能以及地址信息&…

Http协议基础

Http 是什么? Http 作为 WWW 的重要组成部分被提出 (World Wide Web) 而当时的 WWW 是为了帮助研究者更好的进行知识共享 基本理念:文档之间的相互关联形成超文本,最终连成相互参阅的 WWW Http (Hyper Text Transfer Protocol) 用于定义文…

QUIC的优势与缺陷

被寄予厚望的下一代互联网传输协议,QUIC究竟有哪些优点呢? 总结如下: 多路复用:QUIC升华了HTTP/2中的多路复用技术,实现了基于互相独立的多流(多通道)数据传输,从根本上解决了TCP存在…

基于C语言学生信息教务管理系统编程设计

一.实现功能 1.从键盘添加学生信息 2.从文件添加学生信息 3.显示学生信息到屏幕 4.显示学生信息到文件 5.删除学生信息 6.插入学生信息 7.查找学生信息 8.成绩排名 二、相关代码 #include<stdio.h> #include<stdlib.h> //使用malloc函数以及exit函数 #include<…

力扣(LeetCode)1759. 统计同构子字符串的数目(C++)

题目描述 双指针数学 根据同构字符串的定义&#xff0c;还有示例&#xff0c;发现同构子字符串的数量&#xff0c;只和字母相同的区间有关。如abbcccaa&#xff0c;有 444 个影响答案的区间&#xff0c;直观切分为a bb ccc aa&#xff0c;用空格划分区间。遍历的任务就是维护这…

灵动岛前端Ui

一、前言 灵动岛&#xff08;Dynamic Island &#xff09;是什么&#xff1f; 灵动岛&#xff0c;是苹果公司iPhone 14 Pro系列 [2] 交互UI&#xff0c;让虚拟软件和硬件的交互变得更为流畅。当有来电、短信等通知时&#xff0c;灵动岛会变化它的形态&#xff0c;以便让用户能…

【大数据】M1 mac win docker安装kafka+mysql+canal

文章目录kafkadocker-compose创建kafka容器启动以后&#xff0c;访问容器&#xff0c;并且发送消息测试问题Exception in thread "main" kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state: CONNECTINGmysqldocker…

LAPS本地管理员密码之使用PowerShell查看和重置密码

目录 一、PowerShell策略设置 二、引入AdmPwd.PS模块 三、查看密码 四、强制重置密码 文章主要介绍在部署了LAPS后&#xff0c;怎么使用PowerShell查看和管理域内本地管理员密码。需要注意的是被操作的电脑需要加域&#xff0c;所有操作都在域内环境下进行。 LAPS介绍 LAP…

Spring Boot 知识总结

Spring Boot 知识总结 一、Spring Boot基础 1.1 什么是Spring Spring是一个开源框架&#xff0c;2003年兴起的一个Java轻量级开发框架&#xff0c;作者&#xff1a;Rod Johnson。 Spring是为了解决企业级应用开发的复杂性而创建的&#xff0c;简化开发。 Spring是如何简化…

LeetCode 每日一题——1759. 统计同构子字符串的数目

1.题目描述 1759. 统计同构子字符串的数目 难度中等43 给你一个字符串 s &#xff0c;返回 s 中 同构子字符串 的数目。由于答案可能很大&#xff0c;只需返回对 109 7 取余 后的结果。 同构字符串 的定义为&#xff1a;如果一个字符串中的所有字符都相同&#xff0c;那么…