threejs学习笔记(2)


demo地址:http://www.adanghome.com/js_demo/32/


今天练习的主题是光源。


1)从官方文档上来看,光源的总类有Light、AmbientLight、AreaLight、DirectionalLight、HemisphereLight、PointLight、SpotLight这几种;


2)light和mesh相比,有相似的地方,都是通过scene.add添加进来的,但也有区别。mesh在任何时候都可以被add进来和remove出去。但light比较奇怪,在init render之前添加进来的light,可以被正常显示,但如果已经init render之后,被动态添加进来则不会产生任何效果。查了一圈之后,在github上查到了作者的回答,如下:https://github.com/mrdoob/three.js/issues/598


原来是因为材质的渲染成本相当高,所以作者希望让开发者自己决定“在什么时候重新渲染材质”,所以作者留了个material.needsUpdate = true; 让开发者手动添加这段代码,而不是让threejs自动重渲染材质。我在demo里就是添加了这段代码,才可以动态添加光源的。


另外,在remove光源时,可以不用手动再添加这段代码了,只在add时添加及可;


3)光源可以叠加,可以同时开启几个光源;


4) 如果不加任何光源,则mesh会显示成黑色,不管原来物体本身的颜色如何;


5)如果只添加ambientLight,则mesh颜色完全随ambientLight的颜色,不管原来物体本身的颜色如何。


ambientLight很简单,只有一个参数,即环境光的颜色。


6) 如果只添加pointLight,则mesh颜色会混合光源颜色和mesh本身颜色;


7)areaLight是镜面光,以一个平面向某个角度射出光线。接收两个参数:颜色和光线强度。强度的范围是从0~1的浮点数。另外,还要调整镜面的坐标、长宽和旋转角度。可惜的是我调试了半天也没调好参数,一直没办法让光线照到我的物体上,看不出有什么效果 T_T。这个留着以后todo吧。


8)directionalLight是平行光,一般用于模拟太阳光线这种“很远的地方投射过来的光源”。接收两个参数:颜色和强度。它需要设置一下position,从(0,0,0)到这个position的向量即是平行光的方向。


9)hemisphereLight是半球光,接收三个参数:顶部颜色、底部颜色和光线强度。目前还不知道半球光用在什么场合的。


10) pointLight是点光源,接收三个参数:颜色、强度和距离。


11)spotLight是聚光灯。接收五个参数:颜色、强度、距离、角度和说明。官方的例子只使用到了颜色这个参数,不清楚其它几个,特别是角度和说明这两个参数的作用。另外,官方的例子还用到了spotLight.castShadow = true; spotLight.shadowMapWidth = 1024; spotLight.shadowMapHeight = 1024; spotLight.shadowCameraNear = 500; spotLight.shadowCameraFar = 4000; spotLight.shadowCameraFov = 30;等参数,也不清楚具体的作用是什么,至少在我的demo里没看出效果。


不少东西还没摸清,缺实践,回头再研究吧。



原文地址:https://www.cnblogs.com/cly84920/p/4426440.html