Three.js (二) 光源、投影、光晕

光源

  • 光的通用属性
    • fex:光的颜色,用16进制颜色表示(如0x00FF00)
    • intensity:光的强度,默认为1
    • castShadow:是否启用阴影 默认为false
      环境光与半球光不能投射阴影。
      产生投影的光线需配置投影区域属性限制投影范围(节省性能)
  • 每种光都有辅助线,将光源作为参数传入辅助线构造函数即可生成实例
var helper = new THREE.HemisphereLightHelper(hemiLight);
scene.add(helper);
环境光

THREE.AmbientLight( fex )
环境光是经过多次反射而来的光,无处不在,会照射到场景内的任何一个物体的任何一面,且具有相同的明暗程度,因此不会产生阴影。(这是因为,反射光可以从各个方向进入您的眼睛)

点光源

PointLight( fex, intensity, distance, decay )
由这种光源放出的光线来自同一点,且方向辐射自四面八方,光强度可随着距离衰减。例如萤火虫放出的光。

  • distance:光强衰减为0处到光源的距离。 默认情况下,这个值为0,表示光源强度不衰减。
  • decay: 沿着光照距离的强度衰退速度,默认为1。
  • 阴影边界属性
    阴影区域类似透视投影相机的视野,为一个锥体
    • light.shadow.camera.near 默认值:50
    • light.shadow.camera.far 默认值:5000
    • light.shadow.camera.fov 默认值:50
  • position: 光的位置,默认为(0,1,0)
平行光

DirectionalLight( hex, intensity )
平行光又称为方向光,是一组来自无限远处的没有衰减的平行光线,类似太阳光的效果(太阳是如此遥远,所有的阳光照射到物体上都几乎来自同一个角度)。

平行光的方向总是为从光的位置position照向target的一个向量(因此对平行光实例做旋转没有效果),其效果只与方向有关,与离物体的远近无关,其位置仅用于决定方向。

  • position: 光的位置,默认为(0,1,0),仅用于配合target决定光的方向,与离物体的远近无关。如位置从(0,0,100),(0,0,50),(0,0,1)分别照向(0,0,0)时, 效果完全一致。
  • target: 目标位置,默认为原点(0,0,0)
    注意: 对于目标的位置,要将其更改为除缺省值之外的任何位置,必须被添加到 scene 场景中去,这使得属性target中的 matrixWorld 会每帧自动更新。
    可以是一个已有对象,也可以新建一个Object3D实例。
var targetObject =  new THREE.Object3D(); 
targetObject.position.set(8, 0, 5);
scene.add(targetObject); 
light.target = targetObject;
  • 阴影边界属性
    因光线都是平行的,阴影区域类似正投影相机的视野
    • shadow.camera.near:(0.5)投影近点。表示距离光源的哪一个位置开始生成阴影。
    • shadow.camera.far:(500)投影远点。表示到距离光源的哪一个位置可以生成阴影。
    • shadow.camera.left:(-5)投影左边界。
    • shadow.camera.right:(5)投影右边界。
    • shadow.camera.top:(5)投影上边界。
    • shadow.camera.bottom:(-5)投影下边界。
聚光灯

THREE.SpotLight( color, intensity, distance, angle, penumbra, decay )
从一个方向上的一个点发出,覆盖一个圆锥体范围,它离光越远,它的尺寸就越大。

  • distance:光强衰减为0处到光源的距离。 默认情况下,这个值为0,表示光源强度不衰减。
  • angle:光线散射角度,最大为Math.PI/2
  • penumbra:聚光锥的半影衰减百分比。在0和1之间的值。默认为0。
  • decay: 沿着光照距离的强度衰退速度,默认为1。
  • position:同点光源
  • target:同平行光
  • 阴影区域属性:同点光源
半球光

HemisphereLight( skyColor , groundColor , intensity )
光源具有上下两种不同的颜色,从天空光线颜色颜色渐变到地面光线颜色。 通常用于模拟户外光照,比起THREE.DirectionalLight模拟太阳光+THREE.AmbientLight为场景提供基础色的方案,HemisphereLight更为自然(因为在户外,并不是所有的光源都来自上方,很多是来自大气散射和地面以及其他物体的反射)。

  • position: 同平行光仅用于设置方向,具体位置无意义。但无法设置target
  • visible:设为 ture(默认值),光源就会打开。

投影

投影需要以下配置

  1. 为渲染器开启投影 renderer.shadowMap.enabled = true;
  2. 存在允许投影的光源 light.castShadow = true;
  3. 存在允许投影的物体 cube.castShadow = true;
  4. 存在允许显示投影的物体 floor.receiveShadow= true;

可以配置渲染器的shadowMap.type属性变更投影样式

  • THREE.BasicShadowMap:普通阴影映射
  • THREE.PCFShadowMap:柔化边缘的阴影映射(默认)
  • THREE.PCFSoftShadowMap:柔化边缘的软阴影映射

配置以下属性限制阴影质量,默认值为512,512

  • light.shadow.mapSize.width
  • light.shadow.mapSize.height

开启投影辅助线

scene.add(new THREE.CameraHelper( light.shadow.camera ))

光晕

LensflareElement( texture : Texture, size : Float, distance : Float, color : Color )

  • texture - 用于光晕的THREE.Texture(贴图)
  • size - (可选)光晕尺寸(单位为像素)
  • distance - (可选)和光源的距离值在0到1之间(值为0时在光源的位置)
  • color - (可选)光晕的(Color)颜色(需使用THREE.Color封装,不能直接使用16进制颜色)
  1. 要使用光晕,首先需要设置渲染器允许透明
  2. 光晕必须和一个已有光源绑定
  3. 同一光源的其他光晕/光斑可以通过.add(texture,size,distance,blendingType)添加到已有光晕上
var renderer = new THREE.WebGLRenderer({
  alpha: true
});
var loader = new THREE.TextureLoader()
var textureFlare0 = loader.load("./lensflare/lensflare0.png");
var textureFlare3 = loader.load("./lensflare/lensflare3.png");
var flareColor = new THREE.Color(0xffaacc);
var lensFlare = new THREE.LensFlare(textureFlare0, 170, 0.0, THREE.AdditiveBlending,
  flareColor);
lensFlare.add(textureFlare3, 60/2, 0.6, THREE.AdditiveBlending);
lensFlare.add(textureFlare3, 70/2, 0.7, THREE.AdditiveBlending);
lensFlare.add(textureFlare3, 120/2, 0.9, THREE.AdditiveBlending);
lensFlare.add(textureFlare3, 70/2, 1.0, THREE.AdditiveBlending);
lensFlare.position.copy(light.position);
scene.add(lensFlare);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 作为3D技术的发展趋势,浏览器端3D技术越来越被一些技术公司重视。由此,Threejs非常注重3D渲染效果的真实性...
    sakatayui酱阅读 1,728评论 0 1
  • 转载自VR设计云课堂[https://www.jianshu.com/u/c7ffdc4b379e]Unity S...
    水月凡阅读 999评论 0 0
  • SpotLight 聚光灯光源。这种光从一个点向一个方向发出,沿着一个圆锥,光照越远它的尺寸就越大。这种光照可以产...
    斯特凡1899阅读 834评论 0 0
  • 一、四大光照类型1.环境光(Ambient Light) 一个物体即使没有直接被光源照射,但是只要有光线通过其他物...
    CarlDonitz阅读 1,448评论 0 0
  • 草莓果俏,食客爱它,自有之妙。 皮薄肉嫩,汁多甜美,乃水果中一王道。 只是当你将它放入口中,汁香四溢,味蕾静享美妙...
    赵佛阅读 678评论 0 2