Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Three.js-为什么阴影只显示在一个小区域_Javascript_Three.js_Model - Fatal编程技术网

Javascript Three.js-为什么阴影只显示在一个小区域

Javascript Three.js-为什么阴影只显示在一个小区域,javascript,three.js,model,Javascript,Three.js,Model,我导入了一个模型,发现阴影只显示在一个小区域(图片中的绿色区域)。如何让所有对象显示其阴影 这是我的密码 light=新的三方向灯(0xffffff); 光。位置。设置(1,1,1); light.castShadow=true; light.shadow.camera.near=0.01;//和照相机一样 light.shadow.camera.far=1000;//和照相机一样 light.shadow.camera.fov=50;//和照相机一样 light.shadow.mapSize

我导入了一个模型,发现阴影只显示在一个小区域(图片中的绿色区域)。如何让所有对象显示其阴影

这是我的密码

light=新的三方向灯(0xffffff);
光。位置。设置(1,1,1);
light.castShadow=true;
light.shadow.camera.near=0.01;//和照相机一样
light.shadow.camera.far=1000;//和照相机一样
light.shadow.camera.fov=50;//和照相机一样
light.shadow.mapSize.width=2048;
light.shadow.mapSize.height=2048;
场景。添加(灯光);
谢谢

编辑:

我添加了
gui
来更改
light.shadow.camera.top
/
light.shadow.camera.bottom
/
light.shadow.camera.left
/
light.shadow.camera.right
,但什么也没发生

var gui=new dat.gui();
添加(light.shadow.camera,'top').min(1).max(100000).onChange(函数(值){
light.shadow.camera.bottom=-值;
light.shadow.camera.left=值;
light.shadow.camera.right=-值;
});

以下是我用来设置阴影贴图尺寸和覆盖区域的函数:

//sz is the size in world units that the shadow should cover. (area)
// mapSize is the width,height of the texture to be used for shadowmap (resolution)
    var setShadowSize=(light1, sz, mapSz)=>{
        light1.shadow.camera.left = sz;
        light1.shadow.camera.bottom = sz;
        light1.shadow.camera.right = -sz;
        light1.shadow.camera.top = -sz;
        if(mapSz){
            light1.shadow.mapSize.set(mapSz,mapSz)
        }
    }
    setShadowSize(myLight,15.0,1024);

这是因为平行光使用正交摄影机绘制阴影贴图来投射阴影。如果此摄影机的视图外有对象,则无法计算其阴影,并将产生您在绿色框外看到的效果。如果要扩展此摄影机覆盖的区域,可以修改此阴影摄影机的
.left.right.top.bottom
属性以覆盖整个场景。我在下面的例子中使用了一个100个单位的盒子

var side = 100;
light.shadow.camera.top = side;
light.shadow.camera.bottom = -side;
light.shadow.camera.left = side;
light.shadow.camera.right = -side;

。。。但是你可以根据需要改变尺寸。请记住,
.fov
在示例代码中不起任何作用,因为正交摄影机不使用“视野”属性。

好吧,如果您能给我看一个代码的实例,那就太好了,因为我之前已经为中的一个项目修复了这个问题

如前所述,可以通过更改light.shadow.camera.left、right、bottom和top属性来解决此问题,但是我们可能无法看到阴影的有效面积,因此我们可能非常接近于解决它,但根本无法解决。我的建议是暂时使用辅助工具,以便通过以下方式查看灯光的有效阴影区域:

var shadowHelper = new THREE.CameraHelper( light.shadow.camera );
scene.add( shadowHelper );

您还可以查看我在引用的链接中使用的所有代码。

您好,谢谢您的回复。我尝试更改
灯光.阴影.摄像头.顶部
/
灯光.阴影.摄像头.底部
/
灯光.阴影.摄像头.左侧
/
灯光.阴影.摄像头.右侧
,但什么也没有发生:(我已编辑了我的问题。在将其添加到GUI之前,请先尝试直接更改值。否则,您同时添加的更改太多,您将不知道哪个部分正在破坏它。您好,我已在我的问题中添加了完整的代码。我使用
new THREE.CameraHelper(light.shadow.camera)
并发现比例太小。您能告诉我如何修复它吗?谢谢!!@Tiffany我想我在这里发现了问题,请尝试不定义GUI小部件内部的light.shadow.camera.left、right、bottom和top的值,请在使用scene.add(light)将灯光调用到场景之前定义它们,我打赌这会解决你的问题。(如果是的话,我会编辑我的答案)它是有效的!但看起来很好。这是答案。哦,你是对的。它看起来很奇怪,你在舞台上有多少平行光(投射阴影)?也许我应该在stackoverflow上提出一个问题。
CameraHelper
真的帮了我很大的忙。谢谢!