three.js 源码注释(四十四)Light/DirectionalLight.js
/**
*
* DirectionalLight方法 根据设置灯光的颜属性color, 强度属性intensity创建平行光光源。
* DirectionalLight 对象的功能函数采用定义构造的函数原型对象来实现。
* NOTE: SpotLight类型灯光实现了阴影,但是需要在场景中使用MeshLambertMaterial或者MeshPhongMaterial
* Example:
* var light = new THREE.SpotLight(0xff0000,1,100,Math.PI /2,5); //创建灯光对象
* light.position.set(50,50,30); //设置位置
* light.castShadow = true; //开启阴影
* light.shadowMapWidth = 1024; //阴影贴图宽度设置为1024像素
* light.shadowMapHeight = 1024; //阴影贴图高度设置为1024像素
* light.shadowCameraNear = 500; //阴影的平截头体区域near属性
* light.shadowCameraFar = 4000; //阴影的平截头体区域far属性
* light.shadowCameraFov = 30; //阴影的平截头体区域fov属性
* scene.add(lignt); //加入场景
*/
// <summary>DirectionalLight</summary>
// <param name="color" type="THREE.Color">灯光的颜色属性
// <param name="intensity" type="Number">灯光的强度,默认是1
// <returns type="DirectionalLight">返回DirectionalLight,平行光光源.</returns>
THREE.DirectionalLight = function ( color, intensity ) { THREE.Light.call( this, color ); //调用Light对象的call方法,将原本属于Light的方法交给当前对象DirectionalLight来使用.
this.position.set( 0, 1, 0 ); //灯光的位置属性初始化为,0,1,0
this.target = new THREE.Object3D(); //创建一个目标点对象,目标点对象是一个Object3D对象. this.intensity = ( intensity !== undefined ) ? intensity : 1; //灯光的颜色属性,如果不指定,初始化为1.(光线的密度,默认为1。因为RGB的三个值均在0~255之间,不能反映出光照的强度变化,光照越强,物体表面就更明亮。) this.castShadow = false; //布尔值,默认为false,如果设置为true,对于所有表面都会逐像元地计算其在光照方向上是否被遮挡,这会消耗大量的计算。
this.onlyShadow = false; //布尔值,控制是否只产生阴影而不“照亮”物体,默认为false。这种模式也许有什么特殊应用吧。 this.shadowCameraNear = 50; //shadowCameraNear属性,正交投影立方体近端,定义一个范围(正交投影立方体),不计算在范围之外的物体的阴影,near默认是50
this.shadowCameraFar = 5000; //shadowCameraFar属性,正交投影立方体远端,定义一个范围(正交投影立方体),不计算在范围之外的物体的阴影,far默认是5000 this.shadowCameraLeft = - 500; //shadowCameraLeft属性,正交投影立方体左端,定义一个范围(正交投影立方体),不计算在范围之外的物体的阴影,left默认是500
this.shadowCameraRight = 500; //shadowCameraRight属性,正交投影立方体右端,定义一个范围(正交投影立方体),不计算在范围之外的物体的阴影,right默认是500
this.shadowCameraTop = 500; //shadowCameraTop属性,正交投影立方体上端,定义一个范围(正交投影立方体),不计算在范围之外的物体的阴影,top默认是500
this.shadowCameraBottom = - 500; //shadowCameraBottom属性,正交投影立方体下端,定义一个范围(正交投影立方体),不计算在范围之外的物体的阴影,Bottom默认是500 this.shadowCameraVisible = false; //shadowCameraVisible设置为true,会在场景中显示灯光的框架,方便调试 this.shadowBias = 0; //阴影贴图的偏移,
this.shadowDarkness = 0.5; //阴影对物体亮度的影响,默认是0.5 this.shadowMapWidth = 512; //阴影贴图宽度,单位像素,默认512
this.shadowMapHeight = 512; //阴影贴图高度,单位像素,默认512 /*对于平行光,WebGL可以使用级联阴影贴图(或成为平行分割阴影贴图)有很好的阴影质量,特别是远距离观看。
级联阴影通过分割可视区域逐步部分变大,并使用相同的大小,在每个阴影贴图。结果是物体接近观看者将比更远的物体获得更多的阴影贴图像素。
对于平行光阴影的质量和性能,阴影的距离是非常重要的。就像阴影级联数,阴影距离可以在质量设置中设置,很容易降低阴影范围,以减少硬件性能消耗。
在阴影距离结束处,阴影将淡出,更远的物体将没有阴影。大多数情况下在场景中更远地方的阴影不会引人注目!*/ this.shadowCascade = false; //阴影级联 this.shadowCascadeOffset = new THREE.Vector3( 0, 0, - 1000 ); //阴影级联偏移距离
this.shadowCascadeCount = 2; //当使用2个阴影级联时,整个阴影距离内,默认被分为两块,靠近观察者较小的块和远处较大的块 this.shadowCascadeBias = [ 0, 0, 0 ]; //阴影级联偏移数组
this.shadowCascadeWidth = [ 512, 512, 512 ]; //阴影级联宽度数组
this.shadowCascadeHeight = [ 512, 512, 512 ]; //阴影级联高度数组 this.shadowCascadeNearZ = [ - 1.000, 0.990, 0.998 ]; //阴影级联近处
this.shadowCascadeFarZ = [ 0.990, 0.998, 1.000 ]; //阴影级联远处 this.shadowCascadeArray = []; //阴影级联数组 //TODO: 下面这些完全没弄明白,以后补上详细的注释 this.shadowMap = null; //指定阴影贴图,WebGLRenderTarget对象,这里好像很复杂,完全没弄明白,以后补上详细的注释.
this.shadowMapSize = null; //阴影图的大小,注意,这里应符合OpenGL中对纹理的要求(2的n次方+2n)
this.shadowCamera = null; //阴影贴图相机,THREE.PerspectiveCamera对象,
this.shadowMatrix = null; //阴影贴图矩阵 }; /**
*下面是DirectionalLight对象提供的功能函数定义,一部分通过prototype继承自Light方法
**/
THREE.DirectionalLight.prototype = Object.create( THREE.Light.prototype ); //DirectionalLight对象从THREE.Light的原型继承所有属性方法 /*clone方法
*clone方法克隆DirectionalLight对象
*/
// <summary>clone</summary>
// <returns type="SpotLight">返回克隆的DirectionalLight对象</returns>
THREE.DirectionalLight.prototype.clone = function () { var light = new THREE.DirectionalLight();
THREE.Light.prototype.clone.call( this, light ); //调用THREE.Light.clone方法,克隆平行光对象
//复制当前灯光对象的属性
light.target = this.target.clone();
light.intensity = this.intensity;
light.castShadow = this.castShadow;
light.onlyShadow = this.onlyShadow; //
light.shadowCameraNear = this.shadowCameraNear;
light.shadowCameraFar = this.shadowCameraFar; light.shadowCameraLeft = this.shadowCameraLeft;
light.shadowCameraRight = this.shadowCameraRight;
light.shadowCameraTop = this.shadowCameraTop;
light.shadowCameraBottom = this.shadowCameraBottom; light.shadowCameraVisible = this.shadowCameraVisible; light.shadowBias = this.shadowBias;
light.shadowDarkness = this.shadowDarkness; light.shadowMapWidth = this.shadowMapWidth;
light.shadowMapHeight = this.shadowMapHeight; //
light.shadowCascade = this.shadowCascade; light.shadowCascadeOffset.copy( this.shadowCascadeOffset );
light.shadowCascadeCount = this.shadowCascadeCount; light.shadowCascadeBias = this.shadowCascadeBias.slice( 0 );
light.shadowCascadeWidth = this.shadowCascadeWidth.slice( 0 );
light.shadowCascadeHeight = this.shadowCascadeHeight.slice( 0 ); light.shadowCascadeNearZ = this.shadowCascadeNearZ.slice( 0 );
light.shadowCascadeFarZ = this.shadowCascadeFarZ.slice( 0 ); return light; //返回克隆的平行光的对象 };
three.js 源码注释(四十四)Light/DirectionalLight.js的更多相关文章
- Vue.js 源码分析(二十四) 高级应用 自定义指令详解
除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令. 官网介绍的比较抽象,显得很高大上,我个人对自定义指令的理解是:当自定义指令作用在一些DOM元素或组件上 ...
- Android源码分析(十四)----如何使用SharedPreferencce保存数据
一:SharedPreference如何使用 此文章只是提供一种数据保存的方式, 具体使用场景请根据需求情况自行调整. EditText添加saveData点击事件, 保存数据. diff --git ...
- ABP源码分析三十四:ABP.Web.Mvc
ABP.Web.Mvc模块主要完成两个任务: 第一,通过自定义的AbpController抽象基类封装ABP核心模块中的功能,以便利的方式提供给我们创建controller使用. 第二,一些常见的基础 ...
- jQuery 源码解析(二十四) DOM操作模块 包裹元素 详解
本节说一下DOM操作模块里的包裹元素子模块,该模块可将当前匹配的元素替换指定的DOM元素,有如下方法: wrap(html) ;在每个匹配元素的外层添加一层DOM元素 ...
- ABP源码分析二十四:Notification
NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...
- hbase源码系列(十四)Compact和Split
先上一张图讲一下Compaction和Split的关系,这样会比较直观一些. Compaction把多个MemStore flush出来的StoreFile合并成一个文件,而Split则是把过大的文件 ...
- Spring源码分析(十四)从bean的实例中获取对象
摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 在getBean方法中,getObjectForBeanlnstance ...
- spark 源码分析之十四 -- broadcast 是如何实现的?
本篇文章主要剖析broadcast 的实现机制. BroadcastManager初始化 BroadcastManager初始化方法源码如下: TorrentBroadcastFactory的继承关系 ...
- Java入门系列之集合HashMap源码分析(十四)
前言 我们知道在Java 8中对于HashMap引入了红黑树从而提高操作性能,由于在上一节我们已经通过图解方式分析了红黑树原理,所以在接下来我们将更多精力投入到解析原理而不是算法本身,HashMap在 ...
- Vue.js 源码分析(二十八) 高级应用 transition组件 详解
transition组件可以给任何元素和组件添加进入/离开过渡,但只能给单个组件实行过渡效果(多个元素可以用transition-group组件,下一节再讲),调用该内置组件时,可以传入如下特性: n ...
随机推荐
- python---sys
简介 sys模块用于提供对python解释器的相关操作 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.modules 返回系统导入的模块字段,key是模块名,value是模块 ...
- 数据库&数据仓库
数据仓库的定义: 世界公认的数据仓库概念创始人W.H.Inmon在<数据仓库>(Building the Data Warehouse)一书中对数据仓库的定义是:数据仓库就是面向主题的.集 ...
- 标准库函数atoi的实现
标准库函数atoi用于将字符串类型的数据转换为整形数据:在转换过程中要考虑空指针.空字符串"".正负号,溢出等情况 这里是将字符串str转换为32位整型,其正数的最值为0x7FFF ...
- 【学】CSS3基础实例2 - box-shadow, border-radius 圆形图标以及内部旋转
首先要说一下,transition属性ie9是不支持的,从ie10才开始支持 例子是当鼠标移上div后,它会旋转180度. 要点: 用圆角制作圆形盒子,border-radius设置成50%: 用bo ...
- 关于http协议详解
Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前 ...
- UITapGestureRecognizer响应顺序是怎么样的
一个scrollview上有几个按钮在scrollview上add 了一个单击事件 singletap = [[UITapGestureRecognizer alloc] initWithTarget ...
- RNN神经网络和英中机器翻译的实现
本文系qitta的文章翻译而成,由renzhe0009实现.转载请注明以上信息,谢谢合作. 本文主要讲解以recurrent neural network为主,以及使用Chainer和自然语言处理其中 ...
- 树莓派_360wifi2_佳能MP236打印机
入手树莓派后一直没时间弄,设想用360wifi做无线网卡,也一直不得解,今天成功写下经验 本人刷的是官方系统,版本为3.12.28,首先更新系统内核,参考以下网址: http://groenholdt ...
- ORACLE 常用函数 日期/时间函数
---------------------------------------------日期/时间函数----------------------------------------------- ...
- [原创] ubuntu下安装scrapy报错 error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
Ubuntu14.04在virtualenv下安装scrapy报错,Failed building wheel for cffi,lxml,cryptography 等. error: command ...