shadowCameraVisible = false时出现阴影渲染问题

时间:2015-07-16 12:23:30

标签: javascript 3d three.js

免责声明: 我是three.js的新手,也是3D的世界。我也不想用不必要的代码弄乱这个问题,所以如果有一些会受益,请告诉我。

我有一个带有3个聚光灯的模型,两个从侧面渲染阴影,一个从前面(与相机相同的位置)照亮对象。

当我在使用侧面聚光灯时,两者都将shadowCameraVisible设置为true以进行调试,而且一切都很顺利。

只要我在两者上将shadowCameraVisible设置为false,阴影就不再正确呈现。 Working shadows with shadowCameraVisible = true Broken shadows with 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内允许阴影起作用的内容。

0 个答案:

没有答案