使用Three.js的真实照明(阳光)?

使用Three.js的真实照明(阳光)?,three.js,lighting,Three.js,Lighting,我正在尝试使用Three.js创建一个小的第一人称游戏,但我在灯光方面遇到了问题。基本上我想模拟太阳,让它围绕着投射光线的物体旋转。我现在用的是三个方向的光,它只照亮一个方向,所以立方体的侧面保持黑/暗 我是否必须使用多个灯才能点亮所有东西?或者我可以用某种方式反射地面/物体上的光吗?是的,你必须使用多个灯光来实现这一点,假装反射光。计算真实反射光不是内置的(而且计算非常复杂/昂贵)。你有多种选择 第二个平行光可能总是在太阳的相反位置和方向 保持恒定的半球光。半球照明可以获得天空颜色、地面颜色和

我正在尝试使用Three.js创建一个小的第一人称游戏,但我在灯光方面遇到了问题。基本上我想模拟太阳,让它围绕着投射光线的物体旋转。我现在用的是三个方向的光,它只照亮一个方向,所以立方体的侧面保持黑/暗


我是否必须使用多个灯才能点亮所有东西?或者我可以用某种方式反射地面/物体上的光吗?

是的,你必须使用多个灯光来实现这一点,假装反射光。计算真实反射光不是内置的(而且计算非常复杂/昂贵)。你有多种选择

第二个平行光可能总是在太阳的相反位置和方向

保持恒定的半球光。半球照明可以获得天空颜色、地面颜色和强度,并为照明增加额外的深度

//                                    sky color ground color intensity 
hemiLight = new THREE.HemisphereLight( 0x0000ff, 0x00ff00, 0.6 ); 
这里有一个有效的例子

您可以使用不同灯光的任意组合,但要小心,这会带来性能上的折衷


还值得一提的是半lambert着色,它是通过在材质中将wrapAround属性设置为true来启用的。这给黑色带来了更好的衰减,从而减少了刺眼的光线。更多的中间色调和更少的黑色。

我使用这两种灯光的组合来创建此视频:


谢谢将wrapparound设置为true已将其修复。现在没有黑色,即使不直接在光线下,颜色仍然可见,这正是我想要的。我已经更新了原始链接:)现在只需要找出如何修复我的阴影问题。自从发布此评论后,wrapAround似乎已被删除。现在怎样才能达到这个效果呢?这太好了。源代码在任何地方都可用吗?不幸的是,还没有。我本想打开它,但就是没找到时间。如果需要的话,我可以把它挖出来。
            var hemiLight = new THREE.HemisphereLight( 0xffffff, 0xffffff, 0.6 );
            hemiLight.color.setHSV( 0.6, 0.75, 0.5 );
            hemiLight.groundColor.setHSV( 0.095, 0.5, 0.5 );
            hemiLight.position.set( 0, 500, 0 );
            scene.add( hemiLight );

            var dirLight = new THREE.DirectionalLight( 0xffffff, 1 );
            dirLight.position.set( -1, 0.75, 1 );
            dirLight.position.multiplyScalar( 50);
            dirLight.name = "dirlight";
            // dirLight.shadowCameraVisible = true;

            scene.add( dirLight );

            dirLight.castShadow = true;
            dirLight.shadowMapWidth = dirLight.shadowMapHeight = 1024*2;

            var d = 300;

            dirLight.shadowCameraLeft = -d;
            dirLight.shadowCameraRight = d;
            dirLight.shadowCameraTop = d;
            dirLight.shadowCameraBottom = -d;

            dirLight.shadowCameraFar = 3500;
            dirLight.shadowBias = -0.0001;
            dirLight.shadowDarkness = 0.35;