ThreeJS学习:光

前言

现实世界中,之所以我们能用眼睛看到物体,是因为有太阳、白炽灯等各种灯光的照射,等该功能照射到物体上,物体将灯光反射到我们的眼睛里,我们的大脑里才能呈现物体的影响。如果没有光,我们看到的将是漆黑一片。同时光的亮度、光的颜色、光的来源、光的位置等等一系列因素,都会影响到我们对物体的观察。
虚拟的世界也一样,可以通过对光的设置,来修改物体呈现的效果。

如果不设置光,则物体呈现的是黑色一片。


效果

光有几种不同的分类,主要包括环境光、平行光、点光以及聚光灯几种。

一、环境光

环境光,整个环境的光;即在某一个空间内,所有的位置都在发光,且光的强度都一样。
在ThreeJS中,我们通过AmbientLight来设置环境光。

  // 第一个参数是光线的颜色,第二个参数是光线的强度
  const ambientLight = new THREE.AmbientLight(0xFF_FF_FF, 1000);
  scene.add(ambientLight);
效果

开发中,我们一般将环境光设为白色,并设置一定的强度。
请注意,MeshBasicMaterial的材质,不受光线的影响。

二、平行光

平行光,从某一个方向平行射进来的光;光照射到哪个方向,哪个方向的面就呈现亮色;反正照射不到的方向,呈现暗色。

现实世界中,太阳光可以近似的看成平行光,太阳光照射到哪里,哪里就是白天;反之则是黑夜。这才有了白天黑夜之分。

在ThreeJS中,通过DirectionalLight设置方向光;

// 创建方向光,第一个参数是光的颜色,第二个参数是光的强度
const directionalLight = new THREE.DirectionalLight(0xff_ff_ff, 10);
// 设置光源的方向:通过光源position属性和目标指向对象的position属性计算
directionalLight.position.set(100, 40, 0);
// 方向光指向对象网格模型mesh,可以不设置,默认的位置是0,0,0
directionalLight.target = mesh;
// 光源添加到场景中
scene.add(directionalLight);

// 可通过辅助观察对象,观察光源的位置
const dirLightHelper = new THREE.DirectionalLightHelper(
    directionalLight,
    5,
    0xFF_00_00,
  );
scene.add(dirLightHelper);
效果

三、点光

点光,从某一个点向四周发散光芒,物体离这个点越近光越强,反之越远光越弱。

就像现实生活中的圆形灯泡,灯泡的光芒向房间内四散,离灯泡越近灯光越亮,离灯泡越远灯泡越暗。

在ThreeJS中,使用PointLight来设置点光;

// 创建点光
const pointLight = new THREE.PointLight(0xff_ff_ff, 2000);
// 设置点光的位置
pointLight.position.set(120, 120, 120);
// 设置光源不随距离衰减,0.0表示不随距离衰减(点光照射到的位置,光的强度相同)
pointLight.decay = 1.2;
// 设置光线可达到的距离,超过这个距离,不会有光线
pointLight.distance = 200;
// 将点光添加到场景中
scene.add(pointLight);

// 可通过辅助观察对象,观察光源的位置
const pointLightHelper = new THREE.PointLightHelper(
    pointLight,
    10,
    0xff_00_00,
  );
scene.add(pointLightHelper);
效果

四、聚光灯

聚光灯,从某一个点,从一定的角度发出光芒,光线只局限于这个角度所在的区域内。离发光点越近越亮,离发光点越远越暗。

现实生活中,舞台所用的聚光灯、家里常备的手电筒。

聚光灯

在ThreeJS中,使用SpotLight来创建聚光灯

// 创建聚光灯
const spotLight = new THREE.SpotLight(0xFF_FF_FF, 2000);
// 设置聚光灯的位置
spotLight.position.set(100, 100, 0);
//  设置光源不随距离衰减,0.0表示不随距离衰减(点光照射到的位置,光的强度相同)
spotLight.decay = 1.2;
// 设置聚光灯发散的角度,超出这个角度的范围,没有光线
spotLight.angle = Math.PI / 3;
// 设置聚光灯可达到的距离,超过这个距离,不会有光线
spotLight.distance = 120;

// 可通过辅助观察对象,观察光源的位置
const spotLightHelper = new THREE.SpotLightHelper(spotLight, 10);
scene.add(spotLightHelper);
效果

五、源代码

demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Three.js学习:https://www.threejs3d.com/[https://www.threejs...
    萝卜土豆泥阅读 362评论 0 0
  • threejs中光源有很多种,但是常见的光源只有4种: 环境光(AmbientLight ) 点光源(pointL...
    论宅阅读 5,361评论 0 0
  • WebGL and Threejs: Lightig 什么是webgl和threejs? webgl是一个在浏览器...
    行陌路阅读 6,214评论 0 2
  • WebGL and Threejs: Lightig 什么是webgl和threejs? webgl是一个在浏览器...
    不决书阅读 946评论 0 0
  • Threejs 为什么? webGL太难用,太复杂! 但是现代浏览器都支持 WebGL 这样我们就不必使用 Fla...
    强某某阅读 6,513评论 1 21

友情链接更多精彩内容