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

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

https://www.bilibili.com/video/BV1hD4y1h7pi?t=1.4

【使用 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)
......

de2ff999d6a14af0ac644663f43875b7.png

二、平行光阴影属性

1、设置阴影模糊度

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

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

583c4331a8454bec9f41fa2d49532abb.png

2、阴影贴图

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

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

657e370353dc46d39986fce632cdf748.png

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

33293990f9254782a39f363da4c33037.png

三、聚光灯的属性和应用

聚光灯(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)

de815f3bc69b4b9bb24aaab49fae1b6a.png

733964b1c4d54e618f819a4c4c051484.png

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

a6b7abe759924519ac441a1022eb8623.png

// 设置从光源发出光的最大距离
spotLight.distance = 0
gui
    .add(spotLight, 'distance')
    .min(0)
    .max(30)
    .step(0.01)

be586da7237d4940b808a95596f140d8.png

// 聚光锥的半影衰减百分比
spotLight.penumbra = 0
gui
    .add(spotLight, 'penumbra')
    .min(0)
    .max(1)
    .step(0.01)

e945ce2505854faea2dffd7fe60bfe89.png

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

86e74c3ed6764078bcd7fe1df06e0e3e.png

45fc82a82c6542bdb2ff4986377d8db3.png

相关文章
|
11月前
|
JavaScript 前端开发
如何减少Node.js应用中的全局变量?
如何减少Node.js应用中的全局变量?
648 165
|
8月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
294 0
|
7月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
401 3
|
12月前
|
前端开发 搜索推荐 JavaScript
如何通过DIY.JS快速构建出一个DIY手机壳、T恤的应用?
DIY.JS 是一款基于原生 Canvas 的业务级图形库,专注于商品定制的图形交互功能,帮助开发者轻松实现个性化设计。适用于 T 恤、手机壳等多种商品场景。它自带丰富功能,无需从零构建,快速集成到项目中。通过创建舞台、添加模型、定义 DIY 区域和添加素材四个步骤即可完成基础用法。支持在线演示体验,文档详细,易上手。
554 57
|
8月前
|
资源调度 负载均衡 JavaScript
使用PM2工具部署Vue.js应用于服务器
以上步骤完成之后,你就成功利⽤ PM⼆工具将 Vuejs 应⽰程序部署至服 务 器,并且配合反向代理实现了高效稳定访问及负载均衡功能。
352 0
|
11月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
276 3
|
12月前
|
存储 JavaScript 前端开发
|
JSON JavaScript 前端开发
菜鸟之路Day23一一JavaScript 入门
本文介绍了 JavaScript 的基础内容,包括 JS 的引入方式、基础语法、数据类型、运算符、类型转换、函数、对象(如 Array、String、自定义对象、JSON、BOM 和 DOM)、事件监听,以及 Vue 框架的初步使用。重点讲解了内部和外部脚本的引入、变量声明(var、let、const)、常见输出语句、数组与字符串的操作方法、DOM 操作及事件绑定,并通过实例展示了 Vue 的双向数据绑定和常用指令(v-bind、v-model、v-on、v-if、v-for 等)。
441 7
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章

下一篇
开通oss服务