我有以下问题。当我像这样使用Three.js点光源时:
var color = 0xffffff;
var intensity = 0.5;
var distance = 200;
position_x = 0;
position_y = 0;
position_z = 0;
light = new THREE.PointLight(color, intensity, distance);
light.position.set(position_x, position_y, position_z);
scene.add(light);
当有一个靠近场景灯光的“小”物体(网格)时,它会按预期工作。但是,当有一个大物体时(让我们说一个地板):
var floorTexture = new THREE.ImageUtils.loadTexture( 'floor.jpg' );
floorTexture.wrapS = floorTexture.wrapT = THREE.RepeatWrapping;
floorTexture.repeat.set( 1, 1);
var floorMaterial = new THREE.MeshBasicMaterial( { map: floorTexture, side: THREE.DoubleSide } );
var floorGeometry = new THREE.PlaneGeometry(1000, 1000, 10, 10);
var floor = new THREE.Mesh(floorGeometry, floorMaterial);
floor.position.y = -0.5;
floor.rotation.x = Math.PI / 2;
scene.add(floor);
然后灯不会显示在上面。起初我认为这是因为地板中心位置远离点光源,因此点光源无法到达它,距离设置为200(即使地板的一部分比上述距离更近)。因此我试图增加这个距离 - 没有运气。
有一种解决方法可以用小部件创建地板。然后点光源再次按预期工作,但这种方法存在问题 - 即由于要渲染大量的“楼层对象”,它会大幅降低FPS。
我的猜测是我错过了什么。我知道还有其他类型的灯光覆盖了整个场景,但我正在尝试制作一盏灯,所以我想我需要使用点光源。但我可能错了。任何帮助或提示如何使这项工作将不胜感激。
答案 0 :(得分:2)
MeshBasicMaterial
不支持灯光。使用MeshPhongMaterial
。
MeshLambertMaterial
也支持灯光,但在您的情况下,由于此处说明的原因而不建议:Three.js: What Is The Exact Difference Between Lambert and Phong?。
three.js r.66