babylon101| 07. Lights(光线)

灯光的使用会影响网格(mesh)的显示方式,包括光照和颜色。所有的网格都允许光通过,除非阴影生成被激活。默认允许的灯光数量是4个,但是可以增加

  • 灯光的类型

有四种类型的灯可以与一系列的照明属性一起使用

1.The Point Light 点光源

点光源是由世界空间中一个独特的点定义的光,光从这个点向各个方向发射,点光源的一个很好的例子是标准灯泡,构造方法如下:

var light = new BABYLON.PointLight("pointLight", new BABYLON.Vector3(1, 10, 1), scene);

64590df85a568193c873cb31b3711a9f0b3.jpg

2.The Directional Light 定向光

方向光是由方向来定义的,光从任意地点以指定的方向发出,并且有无限的范围。定向光的一个例子是,当一颗距离较远的行星被来自其太阳的平行光线照亮时,向下的光会照亮物体的顶部,构造方法如下:

var light = new BABYLON.DirectionalLight("DirectionalLight", new BABYLON.Vector3(0, -1, 0), scene);

3c1f3aad3fd25d50235edf07e23e3756cd7.jpg

3.The Spot Light 聚集光

聚光灯由位置、方向、角度和指数定义,这些值定义了一个光锥,从这个位置开始,向这个方向发射。以弧度表示的角度定义了聚光灯的锥形光束的大小(照度场),指数定义了光线随距离(到达)的衰减速度,构造方法如下:

var light = new BABYLON.SpotLight("spotLight", new BABYLON.Vector3(0, 30, -10), new BABYLON.Vector3(0, -1, 0), Math.PI / 3, 2, scene);

a10650c2aacac7b92a0350924dfcbd9b8c9.jpg

4.The Hemispheric Light 半球光

半球光是模拟环境光的一种简单方法,半球光的定义是一个方向,通常是“向上”朝向天空,然而,只有通过设置颜色属性才能达到完整的效果,构造方法如下:

var light = new BABYLON.HemisphericLight("HemiLight", new BABYLON.Vector3(0, 1, 0), scene);

f63065944f88df7e5542e459d90afdebf7e.jpg

ps: 白色半球光与黑色底色是一种有用的照明方法

var light = new BABYLON.HemisphericLight("hemiLight", new BABYLON.Vector3(-1, 1, 0), scene);
light.diffuse = new BABYLON.Color3(1, 1, 1);
light.specular = new BABYLON.Color3(1, 1, 1);
light.groundColor = new BABYLON.Color3(0, 0, 0);
  • 颜色属性

有三种灯光的属性能影响颜色, diffuse 和  specular 适用于所有灯光,而 groundColor 仅仅对半球光有效,diffuse光给予物体基本的颜色,Specular光在物体上产生高光颜色

  • Limitations  灯光的限制

babylonjs允许创建和注册任意数量的灯光,但是要知道一个标准材质只能处理一个定义的数量的同时灯光(默认情况下这个值等于4,这意味着场景灯光列表的前4个被激活的灯光),可以用以下代码更改这个数量:

var material = new BABYLON.StandardMaterial("mat", scene);
material.maxSimultaneousLights = 6;
  • On, Off or dimmer 开启、关闭、调节灯光强度
light.setEnabled(false);//关闭灯光
light.setEnabled(true);//开启灯光
light0.intensity = 0.5;//设置强度为0.5
light1.intensity = 2.4;//设置强度为2.4
light.range = 100;//设置灯光的照射距离
  • Choosing Meshes to Light 选择性照射mesh灯光

通常情况下,灯光会使得所以的mesh都被照亮,但也有两种方法,可以使得一些mesh不被灯光影响

1. 将mesh加入到 excludedMeshes 数组中

2. 将mesh加入到 includedOnlyMeshes 数组中

light0.excludedMeshes.push(spheres[7], spheres[18]);	
light1.includedOnlyMeshes.push(spheres[7], spheres[18])	
  • Lighting Normals 照明法线

光线对网格的反应取决于为每个网格顶点设置的法线值,如下图所示,箭头表示光照法线的方向。这幅图展示了两个平面和两个灯。一盏是聚光灯,另一盏是点光源。每个平面的正面是法线指向你时你看到的,背面是相反的一面,灯光只影响正面而不影响背面。

10081ba074f923cfe9e2c0316adee9cd03c.jpg

  • Lightmaps 灯光贴图

在运行时计算复杂的照明代价昂贵。为了节省计算量,可以使用lightmaps将计算出的光照存储在一个纹理中,该纹理将应用于给定的网格

var lightmap = new BABYLON.Texture("lightmap.png", scene);
var material = new BABYLON.StandardMaterial("material", scene);
material.lightmapTexture = lightmap;
  • Projection Texture 投影贴图

在某些情况下,从纹理而不是常量颜色来定义光的漫反射颜色(漫反射为对象提供基本颜色)会更好。想象一下,你正在试图模拟大教堂内部的灯光效果。穿过彩色玻璃的光线将投射到地面上。这同样适用于投影仪发出的光或者你在迪斯科舞厅看到的灯光效果。为了支持这个特性,你可以依赖灯光的projectionTexture属性。到目前为止,这只得到了聚光灯的支持。

var spotLight = new BABYLON.SpotLight("spot02", new BABYLON.Vector3(30, 40, 30),
new BABYLON.Vector3(-1, -2, -1), 1.1, 16, scene);
spotLight.projectionTexture = new BABYLON.Texture("textures/stainedGlass.png", scene);

d9b08797f566e695ebf6df6cd7107fc7841.jpg

为了控制投影方向和范围,还可以依赖以下属性:

  1. projectionTextureLightNear :近距离纹理投影,如果一个平面在光空间的范围之前,则没有纹理投影
  2. projectionTextureLightFar :远程纹理投影,如果一个平面在光空间的范围之前,则没有纹理投影
  3. projectionTextureUpDirection :帮助定义朝向光的方向并与向上的方向对齐的光空间

参考资料: https://doc.babylonjs.com/babylon101/lights

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值