原本觉得不就设一个阴影嘛,网上这么多文章,随便看一篇就知道怎么设置了,然而我却花了整整一天才让阴影出现...web
不少博主说,在threeJS中要让阴影显示,只要知足如下几个基本条件。spa
renderer.shadowMapEnabled = true;
light.castShadow = true;
mesh.castShadow = mesh.receiveShadow = true;
然而,没学webGL直接撸THREE的初学者(我)有时候却怎么都弄不出阴影,摸索了一天以后才发现,原来除了以上基本条件,还有不少其它的条件...少有博主把这些高级条件一次性列完,不过这位博主列出的则足够全面,可是所用的threeJS版本过旧.net
如下列出我遇到过的状况:code
在点光源下的阴影都是马赛克,开启renderer.shadowMapType=THREE.PCFSoftShadowMap;
可有效减小马赛克,但不如用平行光的阴影完美。好在不多用点光源,晚一点再摸索一下orm
对于平行光,还须要设置 light.shadow.camera
下的这6个属性:near
、far
、left
、right
、top
、bottom
。使阴影在这6个面描述的范围内才能显示,不然可能只显示一部分或者不显示阴影,以下图blog
能够试试不设置这6个值,打印一下它们分别的默认值,特别小!物体挪远一点就没有阴影了。three
要说明这6个属性,还要先说light.shadow.camera
,这是一个正交摄像机(OrthographicCamera
),与光源同一位置和朝向。这6个值一块儿设置了这个摄像机的可视区域,只有在可视区域内的物体才能产生投影与被投影。这6个值的说明在threeJS文档的正交相机就有ip
题外话,最近玩手游吃鸡,里面的阴影离人物远的地方是不会显示的,只会显示人物附近10米内的阴影,估计就是这6个值设置的了吧。
这4种能够:DirectionalLight
、PointLight
、RectAreaLight
、SpotLight
文档
我也没所有试过,试过能够的有:MeshLambertMaterial
get
如:light.position.set(-40, 60, -10).normalize()
添加光源的时候通常都会给光源设置一个位置,可是若是顺手把这个位置设成单位向量了,那会出现怪异的问题:平行光下,有的物体能投阴影,有的球体却不行,当时思考了好久怎么回事。但后来发现,并非阴影失效了,应该是它致使了上面提到的阴影摄像机的范围发生了变化