免责声明: 我是three.js的新手,也是3D的世界。我也不想用不必要的代码弄乱这个问题,所以如果有一些会受益,请告诉我。
我有一个带有3个聚光灯的模型,两个从侧面渲染阴影,一个从前面(与相机相同的位置)照亮对象。
当我在使用侧面聚光灯时,两者都将shadowCameraVisible
设置为true以进行调试,而且一切都很顺利。
只要我在两者上将shadowCameraVisible
设置为false,阴影就不再正确呈现。
问题中的对象包含两个MeshLambertMaterials
,其边被定义为THREE.DoubleSide
,并且如果side设置为THREE.FrontSide
,则破碎的阴影类似于对象的显示。
任何人都可以想到为什么阴影会以这种方式被打破?为什么shadowCameraVisible
的价值改变了什么?
更新
我现在已经读过the material.side
parameter is ignored for shadows,因此这可能是导致它的原因。但这仍然无法解释为什么在material.side
时会忽略shadowCameraVisible=true
!
更新2: 这里有一些可能相关的代码。
3D模型有两个面,定义如下:
var material1 = new THREE.MeshLambertMaterial({
color: 0xff0000,
side: THREE.DoubleSide,
shading: THREE.FlatShading,
colors: THREE.FaceColors,
vertexColors: THREE.FaceColors,
blending: THREE.NormalBlending
});
var material2 = new THREE.MeshLambertMaterial({
image: 'miscimage.jpg',
side: THREE.DoubleSide,
shading: THREE.FlatShading,
colors: THREE.FaceColors,
vertexColors: THREE.FaceColors,
blending: THREE.NormalBlending
});
var materials = [materials1, materials2];
mesh
定义为:
var mesh = new THREE.Mesh(
geometry,
new THREE.MeshFaceMaterial(materials)
);
mesh.receiveShadow = true;
mesh.castShadow = true;
两个亮点:
var spotlight1 = new THREE.SpotLight(0xffffff);
spotlight1.position.set(-160, 300, -60);
spotlight1.shadowDarkness = 0.4;
spotlight1.intensity = 2;
spotlight1.castShadow = true;
scene.add(spotlight1);
var spotlight2 = new THREE.SpotLight(0xffffff);
spotlight2.position.set(160, 300, -60);
spotlight2.shadowDarkness = 0.4;
spotlight2.intensity = 2;
spotlight2.castShadow = true;
scene.add(spotlight2);
如上所述,当其中一个聚光灯有shadowCameraVisible=true
时,阴影看起来就像是第一个图像,当它没有设置时(即默认为false
),你会得到阴影第二张图片。这使得看起来好像shadowCameraVisible=true
导致阴影尊重对象的THREE.DoubleSide
侧面设置,而shadowCameraVisible=false
则不会。{/ p>
更新3:
事实上,如果我将其中一个摄像机留给shadowCameraVisible=true
,然后进入three.js本身,并在THREE.CameraHelper
函数内并注释掉所有对addLine
的调用,则阴影会起作用很好,你看不到相机(当然)。需要进一步调查才能找出THREE.CameraHelper
内允许阴影起作用的内容。