灯光(light)

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

DirectionalLight  平行光 类似于太阳

默认position是(0, 1, 0),所以是方向从上往下照射的 可以改变位置和照射的方向, 设置旋转没有效果

默认target 可以添加进场景中,最新版可以不添加。 然后可以移动方向

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

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

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

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

light.lookAt() 没有效果

 

HemisphereLight  半球光

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

 

PointLight

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

RectAreaLight

它是平行光和漫射光的混合体
平面光源,不支持阴影 只支持 Standard 和physical 2种材质 也没有 target
castShadow 和shadow都不能设置
只能设置宽和高
position和 lookAt的顺序 不同,效果也不同
也可以使用 lookAt来简化 改变方向。也可以rotation来旋转

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个就会有性能问题
GPU需要计算,比如:面到光的距离
尽量使用 小花费的 灯
min: 环境光 半球光
middle: 平行关 点光源
max: 聚光灯 平面光源
 

Baking

如果你需要很多灯光才能实现的效果,在three中多个灯光共同作用修改不太好,这时
可以试试这个 一般使用3d软件来实现,在texture级别就修改了(将光烘焙到纹理中)
缺点是:不能移动光线 因为将在纹理内部baking
如果灯光修改了,并不会跟着产生效果
 
灯光help用于定位
 
灯光修改位置,帮助需要手动更新
 
聚光灯的 target 中途有可能修改了
window.requestAnimationFrame(() => {
   spotHelp.update() 比如更新照射位置
})
 
平面光帮助需要 手动 赋值位置和旋转
如果你需要复制一个向量的各个值,但是又不能改变这个向量
help.position.copy(Verctor3(..)) 灯光的位置
旋转最好不要使用 ratation,因为会有 order 问题,使用另外一个旋转
 
posted @ 2023-04-10 16:21  escapist  阅读(119)  评论(0编辑  收藏  举报