前言

之前有深入讲解过Three.js中光源,在那篇文章的最后也说了由于平面光光源的特殊性,所以会单独拿出来讲解,这篇文章会详细的讲解平面光光源的特性和实际应用该如何使用。

首先,平面光光源从一个矩形平面上均匀地发射光线,这种光源的主要应用场景是模拟明亮的窗户或者条状灯光光源,实际在开发家具建模项目中会有广泛应用。平面光光源的最大特点事不支持阴影,我们无法通过设置RectAreaLight.castShadow = true来映射让物体显示阴影,而且,平面光光源支持的材质也很有限,只有MeshStandardMaterial和MeshPhysicalMaterial两种材质。有一点需要特别说明下,查看官方文档中有 你必须在你的场景中加入 RectAreaLightUniformsLib ,并调用init() 注意事项,但是我在项目中使用发现,我不添加RectAreaLightUniformsLib也是能够正常运行的

原理说明

创建一个平面光光源很简单,官网实例如下:

 var width = 10;
var height = 10;
var intensity = 1;
var rectLight = new THREE.RectAreaLight( 0xffffff, intensity, width, height );
rectLight.position.set( 5, 5, 0 );
rectLight.lookAt( 0, 0, 0 );
scene.add( rectLight )
rectLightHelper = new THREE.RectAreaLightHelper( rectLight );
scene.add( rectLightHelper );

new THREE.RectAreaLight用于创建平面光光源构造器函数,该函数有四个变量,分别是color,intensity,width,height,以上四个参数都是可选参数,如果不传都会按照默认的值来创建平面光光源。

color:(可选参数) 十六进制数字表示的光照颜色,缺省值为 0xffffff (白色),实测中发现使用HEX格式和RGB格式都是可以的,但是RGBA格式不支持。

intensity:(可选参数) 光源强度/亮度 ,缺省值为 1,实测最小值为0,最大值不限,2为自然光亮度。

width:(可选参数) 光源宽度,缺省值为 10,只要不小于0都可以。

height:(可选参数) 光源高度,缺省值为 10,只要不小于0都可以。

rectLight.position.set( 5, 5, 0 ) 这行代码用来指示平面光光源位置,这个位置可以随意设定,只要在camera设定的范围内都可以,如果超出了我们将什么都看不到,当然这个位置最好离映射物体不能太远,因为本身平面光光源模拟的是窗口光,所有它的辐射距离很有限,位置设定离物体太远将无法映射物体。

rectLight.lookAt( 0, 0, 0 )这行代码用来指代平行光光源指向的中心位置,一般情况下会指向需要映射物体的中心位置。

rectLightHelper = new THREE.RectAreaLightHelper( rectLight )这行代码再次说明下,实测中删掉也是可以正常执行的。

应用场景说明

首先,需要说明,Three.js中的所有光源在场景中是没有任何显示的,我们是感知不到光源的,所以为了模拟现实中的光源点,比如太阳、灯泡等,我们一般会通过创建一个材质为MeshBasicMaterial的物体来替代现实中的光源。至于为什么会选择MeshBasicMaterial的材质来替代光源,后续我会专门写一篇博文来详细讲解MeshBasicMaterial这种材质。回到平面光光源,项目中模拟平面光光源通常会通过面板来指代光源,一般使用的比较多的是平面缓冲几何体PlaneBufferGeometry。

平面缓冲几何体替代平面光光源位置的时候,我们需要创建两个平面缓冲几何体,这样做是为了保证我们看到平面光光源指向的是同一个方向。

平面光光源正面平面缓冲几何体代码如下:

 var rectLightMesh = new THREE.Mesh( new THREE.PlaneBufferGeometry(), new THREE.MeshBasicMaterial( {color:'#ffffff' side: THREE.BackSide } ) );
rectLightMesh.scale.x = rectLight.width;
rectLightMesh.scale.y = rectLight.height;
rectLight.add( rectLightMesh );

上述代码中,rectLight表示已经创建好的平面光光源,rectLightMesh 表示平面光光源正面的平面缓冲几何体,正面的平面缓冲几何体我们一定要设置智能单面查看,必须设置side = THREE.BackSide,这样做是为了保证方面的平面缓冲几何体能够上色。

平面光光源反面平面缓冲几何体代码如下:

 var rectLightMeshBack = new THREE.Mesh( new THREE.PlaneBufferGeometry(), new THREE.MeshBasicMaterial( { color: 0x080808 } ) );
rectLightMesh.add( rectLightMeshBack );

上述代码中,rectLightMesh表示的是我们上一步创建的平面光光源正面缓冲几何体,rectLightMeshBack 表示是的我们创建的平面光光源反面平面缓冲几何体,这一步中我们只需要将创建的反面平面缓冲几何体添加到上一步创建的正面缓冲几何体中即可。

平面光光源实例

实例效果图如下:

实例介绍:

实例中,创建了一个平面,这个平面用来限定平面光光源的光照范围,平面上创建了三个物体,分别是一个球体,一个正方体,一个管状体。场景中添加了亮度为0.1的自然光,防止场景太黑影响视觉,也可衬托平面光光源。创建了亮度为1的平面光光源,在平面光光源位置添加了正反两面平面缓冲几何体。为了能够更好地感受到平面光光源在应用中亮度与距离的关系,因此在实例中添加了动画,用于随机移动平面光光源。

实例预览地址:深入理解three.js中平面光光源RectAreaLight

后话

希望上述讲解能够帮助到您,上述见解纯属个人理解,如果有理解不到位的或者表述有误的还请留言说明,共同学习,共同进步。

深入理解three.js中平面光光源RectAreaLight的更多相关文章

  1. 深入理解three.js中光源

    前言: Three.js 是一个封装了 WebGL 接口的非常好的库,简化了 WebGL 很多细节,降低了学习成本,是当前前端开发者完成3D绘图的得力工具,那么今天我就给大家详细讲解下 Three.j ...

  2. 理解Node.js的事件轮询

    前言 总括 : 原文地址:理解Node.js的事件轮询 Node小应用:Node-sample 智者阅读群书,亦阅历人生 正文 Node.js的两个基本概念 Node.js的第一个基本概念就是I/O操 ...

  3. 初步理解require.js模块化编程

    初步理解require.js模块化编程 一.Javascript模块化编程 目前,通行的Javascript模块规范共有两种:CommonJS和AMD. 1.commonjs 2009年,美国程序员R ...

  4. 方便大家学习的Node.js教程(一):理解Node.js

    理解Node.js 为了理解Node.js是如何工作的,首先你需要理解一些使得Javascript适用于服务器端开发的关键特性.Javascript是一门简单而又灵活的语言,这种灵活性让它能够经受住时 ...

  5. 深入理解Node.js中的垃圾回收和内存泄漏的捕获

    深入理解Node.js中的垃圾回收和内存泄漏的捕获 文章来自:http://wwsun.github.io/posts/understanding-nodejs-gc.html Jan 5, 2016 ...

  6. 深入理解Three.js中透视投影照相机PerspectiveCamera

    前言 在开始正式讲解透视摄像机前,我们先来理理three.js建模的流程.我们在开始创建一个模型的时候,首先需要创建我们模型需要的物体,这个物体可以是three.js中已经为我们封装好的,比如正方体, ...

  7. 深入理解Three.js中正交摄像机OrthographicCamera

    前言 在深入理解Three.js中透视投影照相机PerspectiveCamera那篇文章中讲解了透视投影摄像机的工作原理以及对应一些参数的解答,那篇文章中也说了会单独讲解Three.js中另一种常用 ...

  8. 深入理解Three.js中线条Line,LinLoop,LineSegments

    前言 在可视化开发中,无论是2d(canvas)开发还是3d开发,线条的绘制应用都是比较普遍的.比如绘制城市之间的迁徙图,运行轨迹图等.本文主要讲解的是Three.js中三种线条Line,LineLo ...

  9. 出去就餐并且理解Express.js的基本知识

    Going out to eat and understanding the basics of Express.js出去就餐并且理解Express.js的基本知识 原文:Going out to e ...

随机推荐

  1. Linux:oracle11.2.0dbca静默建库

    1.关闭防火墙 systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止firewall ...

  2. ASP.NET Core[源码分析篇] - WebHost

    _configureServicesDelegates的承接 在[ASP.NET Core[源码分析篇] - Startup]这篇文章中,我们得知了目前为止(UseStartup),所有的动作都是在_ ...

  3. [Spring cloud 一步步实现广告系统] 22. 广告系统回顾总结

    到目前为止,我们整个初级广告检索系统就初步开发完成了,我们来整体回顾一下我们的广告系统. 整个广告系统编码结构如下: mscx-ad 父模块 主要是为了方便我们项目的统一管理 mscx-ad-db 这 ...

  4. Hive 窗口分析函数

    1.窗口函数 1.LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值 第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值 ...

  5. static用法总结:

    这是我的第一篇随笔! 1.当1.cpp和2.cpp都定义了同一个全局时链接会报错,变量名冲突.需要将其中一个设置为static控制其作用域为只在一个源文件内部. 2.函数名也是全局的,故static的 ...

  6. ajax中的后台返回数据data的意义

  7. 一篇文章让你马上入门Hibernate

    在前面我们学完了Struts2,接下来我们就要去学习第二个框架Hibernate. 那什么是Hibernate? Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对 ...

  8. Nginx总结(二)基于ip的虚拟主机配置

    前面讲了如何安装配置Nginx,大家可以去这里看看nginx系列文章:https://www.cnblogs.com/zhangweizhong/category/1529997.html 今天要说的 ...

  9. 《HelloGitHub》第 41 期

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...

  10. 学习js都学习什么?

    前言:js(javaScript)是面向对象(OOP)的编程语言,目前不仅仅是客户端语言了,基予node可以做服务器端程序,那我们学习js都学习什么? 学习js,我们学习它的几部分组成 1.ECMAS ...