深入理解three.js中光源
前言:
Three.js 是一个封装了 WebGL 接口的非常好的库,简化了 WebGL 很多细节,降低了学习成本,是当前前端开发者完成3D绘图的得力工具,那么今天我就给大家详细讲解下 Three.js 中各种光源的区别和引用场景。
为了更加直观的展示不同光源的特性,我特意做了一个 demo 通过动画来区别不同类型光源的特性,demo 中会展示点光源,环境光源,平行光源,半球光源,聚光灯光源五中光源的特性,为了能够直观体验光源移动过程中物体受光源的影响和光源位置,所以在光源的相同位置增加了一个白色的球体来指示光源的位置,demo中物体材质统一使用 MeshLambertMaterial 材质,demo 效果图如下:

预览地址:深入理解Three.js中光源
1、点光源 PointLight
点光源从一个点向各个方向发射,实际情况中可以理解为灯泡发出的光,可以将物体的阴影投射出,光源开启阴影通过设置 castShadow = true。一个简单的创建点光源的代码如下:
var light = new THREE.PointLight( '#ff0000', 1, 100, 2 );
light.position.set( 50, 50, 50 );
light.castShadow = true;
scene.add( light );
上述代码中 new THREE.PointLight() 用于创建点光源,该方法中有四个变量,依次是 color , intensity ,distance ,decay 。
color :(可选参数)) 十六进制光照颜色。 缺省值 0xffffff (白色),不支持 rgba 格式颜色。
intensity :(可选参数) 光照强度。 缺省值 1,值越大光照越强,实测最小值为0,最大值不限。
distance :这个距离表示从光源到光照强度为0的位置。 当设置为0时,光永远不会消失(距离无穷大)。缺省值 0,可以设置任意非负数。
decay :沿着光照距离的衰退量。缺省值 1。 模拟现实世界光衰减只需要设置 decay 值为2便可。

2、环境光源 AmbientLight
环境光会均匀的照亮场景中的所有物体,该光源无法投影物体的阴影,因为环境光源是没有方向的,一个简单的创建环境光源的代码如下:
var light = new THREE.AmbientLight( '#404040', 1 );
scene.add( light );
上述代码中 new THREE.AmbientLight() 用于创建环境光源,环境光源比较简单,创建方法中只需要两个变量,依次是 color , intensity。
color :(可选参数)) 十六进制光照颜色。 缺省值 0xffffff (白色),不支持 rgba 格式颜色。
intensity :(可选参数) 光照强度。 缺省值 1,值越大光照越强,实测最小值为0,最大值不限。

3、平行光源 DirectionalLight
平行光是沿着特定方向发射的光,这种光的表现像是无限远,从它发出的光线都是平行的,常常用平行光来模拟太阳光的效果, 太阳足够远,因此我们可以认为太阳的位置是无限远,所以我们认为从太阳发出的光线也都是平行的,平行光源可以映射物体的阴影,通过设置castShadow = true 来实现,一个创建平行光源的代码如下:
var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );
scene.add( directionalLight );
上述代码中 new THREE.DirectionalLight() 用于创建平行光源,创建方法中只需要两个变量,依次是 color , intensity。
color :(可选参数)) 十六进制光照颜色。 缺省值 0xffffff (白色),不支持 rgba 格式颜色。
intensity :(可选参数) 光照强度。 缺省值 1,值越大光照越强,实测最小值为0,最大值不限。

4、半球光源 HemisphereLight
半球光源直接放置于场景之上,光照颜色从天空光线颜色颜色渐变到地面光线颜色,半球光不能投射阴影,一个创建半球光源的简单代码如下:
var light = new THREE.HemisphereLight( '#ffffbb', '#080820', 1 );
scene.add( light );
上述代码中 new THREE.HemisphereLight() 用于创建点光源,该方法中有四个变量,依次是 color , groundColor,intensity。
color :(可选参数)) 十六进制光照颜色。 缺省值 0xffffff (白色),不支持 rgba 格式颜色。
groundColor: (可选参数) 地面发出光线的颜色。 缺省值 0xffffff(白色),不支持 rgba 格式颜色。
intensity:(可选参数) 光照强度。 缺省值 1,值越大光照越强,实测最小值为0,最大值不限。

5、聚光灯光源 SpotLight
聚光灯是从一个方向上的一个点发出,沿着一个圆锥体,它离光越远,它的尺寸就越大,聚光灯光源可以映射物体的阴影,通过设置 castShadow = true 来实现,一个创建聚光灯光源的代码如下:
var spotLight = new THREE.SpotLight( '#ffffff', 1, 100, Math.PI / 4, 0.1, 0.1 );
spotLight.position.set( 100, 1000, 100 ); spotLight.castShadow = true; spotLight.shadow.mapSize.width = 1024;
spotLight.shadow.mapSize.height = 1024; spotLight.shadow.camera.near = 500;
spotLight.shadow.camera.far = 4000;
spotLight.shadow.camera.fov = 30; scene.add( spotLight );
上述代码中 new THREE.SpotLight() 用于创建点光源,该方法中有四个变量,依次是 color , intensity ,distance ,angle ,penumbra,decay。
color :(可选参数)) 十六进制光照颜色。 缺省值 0xffffff (白色),不支持 rgba 格式颜色。
intensity :(可选参数) 光照强度。 缺省值 1,值越大光照越强,实测最小值为0,最大值不限。
distance :这个距离表示从光源到光照强度为0的位置。 当设置为0时,光永远不会消失(距离无穷大)。缺省值 0,可以设置任意非负数。
angle:光线散射角度,最大为Math.PI/2。
penumbra:聚光锥的半影衰减百分比。在0和1之间的值。默认为0。
decay :沿着光照距离的衰退量。缺省值 1。 模拟现实世界光衰减只需要设置 decay 值为2便可。

6、平面光光源 RectAreaLight
平面光光源比较特殊,后续会单独进行说明。


深入理解three.js中光源的更多相关文章
- 深入理解Node.js中的垃圾回收和内存泄漏的捕获
深入理解Node.js中的垃圾回收和内存泄漏的捕获 文章来自:http://wwsun.github.io/posts/understanding-nodejs-gc.html Jan 5, 2016 ...
- 深入理解Three.js中透视投影照相机PerspectiveCamera
前言 在开始正式讲解透视摄像机前,我们先来理理three.js建模的流程.我们在开始创建一个模型的时候,首先需要创建我们模型需要的物体,这个物体可以是three.js中已经为我们封装好的,比如正方体, ...
- 深入理解Three.js中正交摄像机OrthographicCamera
前言 在深入理解Three.js中透视投影照相机PerspectiveCamera那篇文章中讲解了透视投影摄像机的工作原理以及对应一些参数的解答,那篇文章中也说了会单独讲解Three.js中另一种常用 ...
- 深入理解Three.js中线条Line,LinLoop,LineSegments
前言 在可视化开发中,无论是2d(canvas)开发还是3d开发,线条的绘制应用都是比较普遍的.比如绘制城市之间的迁徙图,运行轨迹图等.本文主要讲解的是Three.js中三种线条Line,LineLo ...
- 深入理解 React JS 中的 setState
此文主要探讨了 React JS 中的 setState 背后的机制,供深入学习 React 研究之用. 在课程 React.js入门基础与案例开发 中,有些同学会发现 React JS 中的 set ...
- 从两个角度理解为什么 JS 中没有函数重载
函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表(参数个数.类型.顺序)的函数,这组函数被称为重载函数.重载函数通常用来声明一组功能相似的函数,这样做减少了函数名的数量,避免了名字空 ...
- 深入理解 Node.js 中 EventEmitter源码分析(3.0.0版本)
events模块对外提供了一个 EventEmitter 对象,即:events.EventEmitter. EventEmitter 是NodeJS的核心模块events中的类,用于对NodeJS中 ...
- 理解 Node.js 中 Stream(流)
Stream(流) 是 Node.js 中处理流式数据的抽象接口. stream 模块用于构建实现了流接口的对象. Node.js 提供了多种流对象. 例如,对 HTTP 服务器的request请求和 ...
- 理解 backbone.js 中的 bind 和 bindAll 方法,关于如何在方法中指定其中的 this,包含apply方法的说明[转载]
转载自:http://gxxsite.com/content/view/id/132.html 在backbone.js的学习过程中,被bind和bindAll弄得有点晕,这里包括underscore ...
随机推荐
- Vsftp服务器配置文件详解
vsftp软件是我们常见的FTP服务器搭建软件,所有的配置都是基于vsftpd.conf这个配置文件的.vsftpd.conf里面主要包括安全配置,传输,用户还有权限等相关的选项.现在我们讲解下关于V ...
- 大陆争霸[SDOI2010]带限制最短路
只要你有无限个自爆机器人,你就能为所欲为 斯普林·布拉泽 [题目描述] 略 一句话题意: 杰森国有 \(N\) 个城市,由 \(M\) 条单向道 路连接.杰森国的首都是城市 \(N\).你只需摧毁杰森 ...
- 通过Blazor使用C#开发SPA单页面应用程序(4) - Ant Design Button
前面学习了Blazor的特点.环境搭建及基础知识,现在我们尝试的做个实际的组件. Ant Design是蚂蚁金服是基于Ant Design设计体系的 UI 组件库,主要用于研发企业级中后台产品.目前官 ...
- 逻辑回归(Logistic Regression)详解,公式推导及代码实现
逻辑回归(Logistic Regression) 什么是逻辑回归: 逻辑回归(Logistic Regression)是一种基于概率的模式识别算法,虽然名字中带"回归",但实际上 ...
- springboot的异步调用
package com.handsight.platform.fras.aapp; import java.util.Locale; import org.slf4j.Logger; import o ...
- HBase 系列(七)——HBase 过滤器详解
一.HBase过滤器简介 Hbase 提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predic ...
- 【乘风破浪】Android系统启动流程整理
前言 对于一个Android应用层开发者来说,了解Android系统的启动流程对理解Android系统有很大的帮助.这其中包含了大量的细节,而且前面很多步骤包含了C/C++实现的native层逻辑,作 ...
- python学习——高阶函数
递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.使用递归函数的优点是逻辑简单清晰,缺点就是过深的调用会导致栈溢出.但是针对尾递归优化的语言可以通过尾递归防 ...
- vux-scroller实现移动端上拉加载功能
本文将讲述vue-cli+vux-scroller实现移动端的上拉加载功能: 纠错声明:网上查阅资料看到很多人都将vux和vuex弄混,在这里我们先解释一下,vuex是vue框架自带的组件,是数据状态 ...
- JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)
前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...