Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.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 立体几何背后的光_Javascript_Three.js - Fatal编程技术网

Javascript 立体几何背后的光

Javascript 立体几何背后的光,javascript,three.js,Javascript,Three.js,我正在创建一个集成了ThreeJs的HTML文件,基本上我已经创建了4个球体,其中一个投射光线,另外3个球体在墙上旋转。当球体在墙后面时,它们不应该反射光线,我该怎么解决这个问题呢 我已经尝试将围绕墙旋转的球体的材质更改为Lambert和Phong,将castShadow设置为true,将ReceiveShadow设置为False (函数onLoad(){ 摄像机、场景、渲染器、轨道控制; init(); 制作动画(); 函数init(){ 摄像头=新的三个透视摄像头(70,window.in

我正在创建一个集成了ThreeJs的HTML文件,基本上我已经创建了4个球体,其中一个投射光线,另外3个球体在墙上旋转。当球体在墙后面时,它们不应该反射光线,我该怎么解决这个问题呢

我已经尝试将围绕墙旋转的球体的材质更改为Lambert和Phong,将castShadow设置为true,将ReceiveShadow设置为False

(函数onLoad(){
摄像机、场景、渲染器、轨道控制;
init();
制作动画();
函数init(){
摄像头=新的三个透视摄像头(70,window.innerWidth/window.innerHeight,11000);
摄像机位置设置(0,30,-100);
场景=新的三个。场景();
scene.background=新的三种颜色(0xffffff);
场景。添加(摄影机);
轨道控制=新的三个轨道控制(摄像机);
escena=场景;
esferaLuz=新的三个球体缓冲几何体(0.5,16,16);
luzUno=新的三点聚光灯(0xFFFFFF,1);
luzUno.angle=Math.PI/12;
卢祖诺半影=0.05;
luzUno.decay=2;
鲁祖诺。位置。设置(-30,40,-5);
mtLuzUno=新的3.MeshBasicMaterial({color:0xFFFFFF});
mallaLuzUno=新的三网格(esferaLuz,mtLuzUno);
添加(mallaLuzUno);
添加(卢祖诺);
luzUno.castShadow=true;
luzUno.shadow.mapSize.width=1024;
luzUno.shadow.mapSize.height=1024;
luzUno.shadow.camera.near=10;
luzUno.shadow.camera.far=200;
luzMap=新的三点光源助手(luzUno);
添加(luzMap);
sombraMap=新的3.CameraHelper(luzUno.shadow.camera);
添加(sombraMap);
var luzAmbiente=新的三个环境光(0xffffff,0.1);
添加(luzAmbiente);
geometriaPlana=新的三立方测量法(100,100,2,2);
mtPlano=new THREE.MeshLambertMaterial({color:0x000000});
mtPlano.transparent=false;
mtPlano.depthWrite=true;
mallaPlano=新的三网格(GeometricalAplana,mtPlano);
mallaPlano.rotation.x=-0.5*Math.PI;
mallaPlano.position.x=15;
mallaPlano.position.y=0;
mallaPlano.position.z=0;
mallaPlano.receiveShadow=true;
添加(mallaPlano);
objEsfera=新的三种球墨法(51000);
mtObjEsfera=新的三点网格材质({颜色:0xFFFFFF,镜面反射:0xFFFFFF,光泽度:1024});
mallaObjEsfera3=新的三网格(objEsfera,mtObjEsfera);
mallaObjEsfera3.position.set(20,0,0);
mallaObjEsfera3.castShadow=true;
mallaObjEsfera3.receiveShadow=false;
添加(mallaObjEsfera3);
objEsfera=新的三种球墨法(51000);
mtObjEsfera=新的三网格材质({颜色:0xF90E0E,镜面反射:0xF90E0E,光泽度:512});
mallaObjEsfera2=新的三网格(objEsfera,mtObjEsfera);
mallaObjEsfera2.position.set(5,0,0);
mallaObjEsfera2.castShadow=true;
mallaObjEsfera2.receiveShadow=false;
添加(mallaObjEsfera2);
objEsfera=新的三种球墨法(51000);
mtObjEsfera=新的三个.MeshLambertMaterial({color:0xF2E406});
mallaObjEsfera=新的三点网格(objEsfera,mtObjEsfera);
mallaObjEsfera.position.set(-10,0,0);
mallaObjEsfera.castShadow=true;
mallaObjEsfera.receiveShadow=false;
添加(mallaObjEsfera);
renderer=new THREE.WebGLRenderer({antialas:true});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setClearColor(0xeeee);
renderer.shadowMap.enabled=true;
renderer.shadowMap.renderReverseSided=false;
renderer.sortObjects=false
renderer.shadowMap.type=THREE.PCFSoftShadowMap;
renderer.setSize(window.innerWidth、window.innerHeight);
document.body.appendChild(renderer.doElement);
renderer.gammaInput=true;
renderer.gammaOutput=true;
window.onresize=函数(){
renderer.setSize(window.innerWidth、window.innerHeight);
camera.aspect=window.innerWidth/window.innerHeight;
camera.updateProjectMatrix();
}
}
函数animate(){
请求动画帧(动画);
orbitControls.update();
render();
}
函数render(){
渲染器。渲染(场景、摄影机);
}
})();

实现预期效果的一种方法是使用阴影。因此,您必须为球体和地面设置
Object3D.castShadow
Object3D.receiveShadow
true
,如以下示例所示:

还要记住,
three.js
目前还不支持选择性照明。这个问题已经在github上讨论过了:

假设场景中的所有对象都应用了照明材质,则无法定义哪些光源应影响哪些对象

three.js R103