three.js (灯光)

灯光的类型
1.环境光(AmbientLight)
●环境光会均匀的照亮场景中的所有物体
●环境光不能用来投射阴影,因为它没有方向。
2.平行光(DirectionalLight)
●平行光是沿着特定方向发射的光。这种光的表现像是无限远,从它发出的光线都是平行的。常常用平行光来模拟太阳光 的效果; 太阳足够远,因此我们可以认为太阳的位置是无限远,所以我们认为从太阳发出的光线也都是平行的。
●平行光可以投射阴影
3.点光源(PointLight)
●从一个点向各个方向发射的光源。
●一个常见的例子是模拟一个灯泡发出的光。
●该光源可以投射阴影
4.聚光灯(SpotLight)
●光线从一个点沿一个方向射出,随着光线照射的变远,光线圆锥体的尺寸也逐渐增大。
●该光源可以投射阴影
灯光的公共属性和方法
构造器
Light( color : Integer, intensity : Float )
●color - (可选参数) 16进制表示光的颜色。 缺省值 0xffffff (白色)。
●intensity - (可选参数) 光照强度。 缺省值 1。
创造一个新的光源。注意,这并不是直接调用的(而是使用派生类之一)。


属性
.color : Color
●光源的颜色。如果构造的时候没有传递,默认会创建一个新的 Color 并设置为白色。

.intensity : Float
●光照的强度,或者说能量。 在 physically correct 模式下, color 和强度 的乘积被解析为以坎德拉(candela)为单位的发光强度。 默认值 - 1.0

. isLight :Boolean
●检查给定对象是否为 Light 类型的只读标志。
方法
.copy ( source : Light ) : this
●从source复制 color, intensity 的值到当前光源对象中。

.toJSON ( meta : Object ) : Object
●以JSON格式返回光数据。
●meta -- 包含有元数据的对象,例如该对象的材质、纹理或图片。 将该light对象转换为 three.js JSON Object/Scene format(three.js JSON 物体/场景格式)。


环境光(AmbientLight)
构造器
AmbientLight( color : Integer, intensity : Float )
●color - (参数可选)颜色的rgb数值。缺省值为 0xffffff。
●intensity - (参数可选)光照的强度。缺省值为 1。

const light = new THREE.AmbientLight( 0x404040 ); // 创建一个环境光
scene.add( light );//添加到场景中去


属性
.castShadow : Boolean
●这个参数在对象构造的时候就被设置成了 undefined 。因为环境光不能投射阴影。

.isAmbientLight : Boolean
●只读标志,用于检查给定对象是否为环境光类型。
平行光(DirectionalLight)
构造器
DirectionalLight( color : Integer, intensity : Float )
●color - (可选参数) 16进制表示光的颜色。 缺省值为 0xffffff (白色)。
●intensity - (可选参数) 光照的强度。缺省值为1。

// 半强度的白色定向光从顶部闪耀。
const directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );
scene.add( directionalLight );


属性
.castShadow : Boolean
●如果设置为 true 该平行光会产生动态阴影。 警告: 这样做的代价比较高而且需要一直调整到阴影看起来正确。该属性默认为 false。

.isDirectionalLight : Boolean
●用于检查给定对象是否为“平行光”类型的只读标志。

.position : Vector3
●灯光的位置
●假如这个值设置等于 Object3D.DEFAULT_UP (0, 1, 0),那么光线将会从上往下照射。

.shadow : DirectionalLightShadow
●这个 DirectionalLightShadow 对象用来计算该平行光产生的阴影。

.target : Object3D
●平行光的方向是从它的位置到目标位置。默认的目标位置为原点 (0,0,0)。
●注意: 对于目标的位置,要将其更改为除缺省值之外的任何位置,它必须被添加到 scene 场景中去。

scene.add( light.target );


●这使得属性target中的 matrixWorld 会每帧自动更新。
●它也可以设置target为场景中的其他对象(任意拥有 position 属性的对象), 示例如下:

const targetObject = new THREE.Object3D();
scene.add(targetObject);
light.target = targetObject;


完成上述操作后,平行光现在就可以追踪到目标对象了。
方法
.copy ( source : DirectionalLight ) : this
●复制 source 的值到这个平行光源对象。
点光源(PointLight)
构造器
PointLight( color : Integer, intensity : Float, distance : Number, decay : Float )
●color - (可选参数)) 十六进制光照颜色。 默认值 0xffffff (白色)。
●intensity - (可选参数) 光照强度。 默认值 1。
●distance - 这个距离表示从光源到光照强度为0的位置。 当设置为0时,光永远不会消失(距离无穷大)。默认值 0.
●decay - 沿着光照距离的衰退量。默认值 2。

const light = new THREE.PointLight( 0xff0000, 1, 100 );//创建一个点光源
light.position.set( 50, 50, 50 );//设置点光源的初始位置
scene.add( light );//添加到场景中去


属性
.castShadow : Boolean
●如果设置为真实光线,将投射动态阴影。
●注意:这很昂贵,需要调整才能使阴影看起来正确。
●默认值为 false。

.decay : Float
●光线沿光线距离变暗的量。默认值为 2。
●在物理正确呈现的上下文中,不应更改默认值。
.distance : Float
●如果非零,那么光强度将会从最大值当前灯光位置处按照距离线性衰减到0。 默认值为 0.0。

.power : Float
●光功率
●在 physically correct 模式中, 表示以"流明(光通量单位)"为单位的光功率。 默认值 - 4Math.PI。
●该值与 intensity 直接关联
power = intensity * 4π
●修改该值也会导致光强度的改变。

.shadow : PointLightShadow
●PointLightShadow用与计算此光照的阴影。
●此对象的摄像机被设置为 fov 为90度,aspect为1, 近裁剪面 near 为0,远裁剪面far 为500的透视摄像机 PerspectiveCamera。
方法
.copy ( source : PointLight ) : this
●将所有属性的值从源 source 复制到此点光源对象。
聚光灯(Spotlight)
构造器
SpotLight( color : Integer, intensity : Float, distance : Float, angle : Radians, penumbra : Float, decay : Float )
●color - (可选参数) 十六进制光照颜色。 默认值 0xffffff (白色)。
●intensity - (可选参数) 光照强度。 默认值 1。
●distance - 从光源发出光的最大距离,其强度根据光源的距离线性衰减。
●angle - 光线散射角度,最大为Math.PI/2。
●penumbra - 聚光锥的半影衰减百分比。在0和1之间的值。默认为0。
●decay - 沿着光照距离的衰减量。

//白色聚光灯从侧面照射,由纹理调制,投射阴影

const spotLight = new THREE.SpotLight( 0xffffff ); //创建一个聚光灯的实例
spotLight.position.set( 100, 1000, 100 );//初始化灯光的位置
spotLight.map = new THREE.TextureLoader().load( url );//创建一个纹理实例

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 );//把灯光添加到场景中


属性
.angle : Float
●从聚光灯的位置以弧度表示聚光灯的最大范围。最大不超过 Math.PI/2。默认值为 Math.PI/3。

.castShadow : Boolean
●此属性设置为 true 聚光灯将投射阴影。
● 默认值为 false

.decay : Float
●光线沿光线距离变暗的量。默认值为 2。
●在物理正确呈现的上下文中,不应更改默认值。

.distance : Float
●如果非零,那么光强度将会从最大值当前灯光位置处按照距离线性衰减到0。 默认值为 0.0。

.isSpotLight : Boolean
●用于检查给定对象是否为聚光灯类型的只读标志。

.penumbra : Float
●聚光锥的半影衰减百分比。在0和1之间的值。 默认值 — 0.0。

.position : Vector3
●光源位置
●假如这个值设置等于 Object3D.DEFAULT_UP (0, 1, 0),那么光线将会从上往下照射。

.power : Float
●光功率
●在 physically correct 模式中, 表示以"流明(光通量单位)"为单位的光功率。 默值 - 4Math.PI。
●该值与 intensity 直接关联
power = intensity * 4π
●修改该值也会导致光强度的改变。

.shadow : SpotLightShadow
●SpotLightShadow用与计算此光照的阴影。

.target : Object3D
●聚光灯的方向是从它的位置到目标位置.默认的目标位置为原点 (0,0,0)。
●注意: 对于目标的位置,要将其更改为除默认值之外的任何位置,它必须被添加到 scene 场景中去。
scene.add( light.target );
●这使得属性target中的 matrixWorld 会每帧自动更新。
●它也可以设置target为场景中的其他对象(任意拥有 position 属性的对象), 示例如下:

const targetObject = new THREE.Object3D();
scene.add(targetObject);

light.target = targetObject


完成上述操作后,聚光灯现在就可以追踪到目标对像了。

.map : Texture
●用于调制灯光颜色的纹理。、
●聚光灯颜色与此纹理的 RGB 值混合,其比率对应于其 alpha 值。使用像素值(0、0、0、1-cookie_value)再现类似 Cookie 的遮罩效果。
●注意:map:如果投射阴影:聚光灯为false,则禁用聚光灯。
方法
.copy ( source : SpotLight ) : this
●将所有属性的值从源 source 复制到此聚光灯光源对象。

猜你喜欢

转载自blog.csdn.net/w418856/article/details/130859208