灯光(light)

发布时间 2023-04-10 16:30:32作者: escapist
镜面眩光:光源产生的效果
 
AmbientLight  环境光  ==> 不会产生阴影
光来自四面八方,场景中所有的物体任何地方都能够被照射到 真实世界中不是那么符合逻辑,但是却很有用
就是类似日常的 太阳光经过各种物体到处反射或者二次反射
基本上所有的地方你都能够看见。 但是光到处反射在threejs中实时渲染起来太困难。
 

DirectionalLight  平行光 类似于太阳

 

默认position是(0, 1, 0),所以是方向从上往下照射的 可以改变位置和照射的方向

 

默认target 可以添加进产经中 然后可以移动方向

 

和光的距离没什么关系,就算你把平行光放在 物体里面也是有效的

 

方向:平行光的位置 和 target连线所指向的方向

 

它只是一个方向,但是对于 产生的阴影形状大小就有关了

 

light.shadow.camera.top / bottom / left / right / far / near 都只是和阴影 有关。
 

HemisphereLight  半球光

半球光 和环境光很像 在固定的方向光来自任何地方,也是无限大的
照射的范围没有大小限制,天空和地面发出的光共同作用  
方向是 position 到 原点的方向

 

PointLight

点光源, 类似于电灯泡, 向四周发光 没有target,支持阴影
distance 距离限制
decay 沿着光照距离衰减
 

RectAreaLight

平面光源,不支持阴影 只支持 Standard 和physical 2种材质 也没有 target
castShadow 和shadow都不能设置
只能设置宽和高
也可以使用 lookAt 改变方向也可以rotation来旋转
灯光都可以使用lookAt 方法旋转
position 和 lookAt 执行的顺序很重要
 

SpotLight

聚光灯 配合target使用方向 默认是 原点 类似手电筒照向远点,地面如果足够光滑,会倒影出点光源
也有target的 不能用旋转和lookAt来 实现。 试试看????
target属性得到的是一个 Object3D,但是并不存在于场景中
所以对这种对象设置 position是没有用的 只有加进场景中就可以进行 position操作了
为什么不用 三维向量 这就不知道了
参数:
angle 默认角度为 Math.PI / 3 应该不超过 PI / 2
也是有相机的,类似于透视相机 相机参数设置只有 远近(far / near)和角度 平行光是 正交相机
distance 距离限制,如果距离不够的话 阴影可能显示不全,跟 far有点类似,但是 far是照相机的属性
angle 角度 Pi / 3
penumbra 属性半影衰减 0-1 手电筒中间越亮,旁边越暗,照射出来的阴影也是这样
decay 属性 光照距离的衰减 默认为1 当为2时是现实世界的衰减情况 这个renderer渲染器需要开启physicallyCorrectLights 属性
 
在三维中 如果要实现围绕着一个轴旋转 另外2个轴 分别做 sin 和 cos 运动即可
light.color = new Color('#fff')
 

灯光的性能

灯光的数量将直接影响性能 大概最大50个就会有性能问题
尽量使用 小花费的 灯
min: 环境光 半球光
middle: 平行关 点光源
max: 聚光灯 平面光源
 

Baking

如果你需要很多灯光才能实现的效果,在three中多个灯光共同作用修改不太好,这时
可以试试这个 一般使用3d软件来实现,在texture级别就修改了
缺点是:不能移动光线 因为将在纹理内部baking
如果灯光修改了,并不会跟着产生效果
 
灯光help用于定位
 
灯光帮助需要手动更新
window.requestAnimationFrame(() => {
spotHelp.update() 比如更新照射位置
})
 
如果你需要复制一个向量的各个值,但是又不能改变这个向量
help.position.copy(Verctor3(..)) 灯光的位置
旋转最好不要使用 ratation,因为会有 order 问题,使用另外一个旋转