WebGL 入门-光源和投影

神说:“要有光”,就有了光。

Three.js内置了多种光源可以直接调用:

  • AmbientLight(环境光)
  • AreaLight(区域光)
  • DirectionalLight(平行光)
  • HemisphereLight(半球光)
  • PointLight(点光源)
  • SpotLight(聚光灯)

首先我们设置好基础的环境:

    我的第一个WebGL程序

   

   

   

WebGL 入门-光源和投影_第1张图片

现在运行页面,我们只能看到蓝色的背景和一块黑色的几何体,因为我们还没有加入灯光,所以一切的物体都是黑色的。立方体和地面的材质均为MeshLambertMaterial(类似纸张,可以均匀反射接收到的光线)。

AmbientLight(环境光)

环境光是一种无处不在的光,就好像现实世界中的空气。环境光的光线来自任何方向,因此,当你仅为场景指定环境光时,所有的物体无论向量如何,都将表现为同样的明暗程度。 

环境光的构造函数THREE.AmbientLight只有一个参数——16进制的颜色值。

AmbientLight( hex )

var light = new THREE.AmbientLight(0xff0000);

scene.add( light );

给场景添加红色的环境光后,立方体和地面都显示为红色:

WebGL 入门-光源和投影_第2张图片

DirectionalLight(平行光)

平行光是一组具有方向的没有衰减的平行光线,它类似太阳光:虽然遥远但打在物体上的光都来自同一个方向。

环境光的构造函数THREE.DirectionalLight有两个参数——16进制的颜色值和光线的强度(默认为1)。

DirectionalLight(hex, intensity)

var light = new THREE.DirectionalLight(0xffffff, 0.5);

light.position.set(100, 150, 50);

scene.add(light);

WebGL 入门-光源和投影_第3张图片

我们在右上方定义了一个强度为50%的平行光,方向为右上角到原点,所以立方体和地面都暗暗的显示出了原本的颜色。

PointLight(点光源)

点光源的光线来自同一点,并向外发射。就好像蜡烛发出的光和萤火虫发出的光。

点光源的构造函数THREE. PointLight有三个参数,比平行光多了一个距离参数,光会从光源经过distance的距离一路衰减为0。

PointLight(hex, intensity, distance)

var light = new THREE.PointLight(0xffffff, 1, 300);

light.position.set(50, 50, 50);

scene.add(light);

WebGL 入门-光源和投影_第4张图片

以上是几个比较常用的光源,看过4个示例后,有没有发现有点不对劲?怎么没有阴影?

投影

Three.js的光源默认不会导致物体间的投影,打开投影需要执行以下几步:

打开渲染器的地图阴影: renderer.shadowMapEnabled = true;

启用光线的投影:light.castShadow = true;

把模型设置为生成投影:mesh.castShadow = true;

把模型设置为接收阴影:mesh.receiveShadow= true;

WebGL 入门-光源和投影_第5张图片

完整的代码如下:

    我的第一个WebGL程序

   

   

   

 

你可能感兴趣的:(html5)