如何使用 ThreeJS 将 SpotLight 添加到相机?

How to add a SpotLight to Camera with ThreeJS?

Three.js r105

我正在尝试向相机添加 SpotLight 以使其具有“手电筒”效果。虽然,一旦我将 SpotLight 添加到我的 Camera 后,灯似乎完全停止工作。我做错了什么?

奇怪,因为 LightHelper 看起来工作正常。此外,将 SpotLight 独立添加到 Scene 也可以正常工作。

一旦我将 SpotLight 附加到 Camera 上,即使是最小的光闪烁也没有丝毫

const cameraLight = new THREE.SpotLight(0xffffff, 4, 40);
cameraLight.castShadow = true;

cameraLight.shadow.bias = -0.0001;
cameraLight.shadow.mapSize.width = 512;
cameraLight.shadow.mapSize.height = 512;
cameraLight.shadow.camera.near = 0.1;
cameraLight.shadow.camera.far = 500;

var d = 32;

cameraLight.shadow.camera.left = -d;
cameraLight.shadow.camera.right = d;
cameraLight.shadow.camera.top = d;
cameraLight.shadow.camera.bottom = -d;

cameraLight.visible = true;
cameraLight.distance = 40;
cameraLight.decay = 1;
cameraLight.angle = Math.PI/2;
cameraLight.penumbra = 0.1;

camera.add( cameraLight );
cameraLight.position.set( 0, 0, 1);
cameraLight.target = camera;    

var cameraLightHelper = new THREE.PointLightHelper( cameraLight, 5, 0x00ff00 );
scene.add( cameraLightHelper );

scene.add( camera );

  • 哪种相机类型有“添加”方法?
  • PointLightHelper 接受 PointLight 作为第一个参数。

如果您使用的是 Spotlight,我推荐 you use a SpotlightHelper,而不是 PointlightHelper。

您必须确保您的 Spotlight 已添加到 Scene。请记住,一个对象只能有 一个 父对象。因此,将灯光添加到场景,然后将其添加到相机会将其从场景中移除。

// This adds spotlight to scene
scene.add(spotlight);

// This removes spotlight from scene, and adds to camera
camera.add(spotlight);

因此,如果您尚未将相机添加到场景中,则不会渲染灯光。您可以通过将一个嵌套在另一个中来解决此问题:

camera.add(spotlight);
scene.add(camera);

现在灯光是场景的“孙子”,它会渲染。只要确保您的聚光灯与相机朝向相同的方向即可。你可能让它指向后方或其他东西,你永远不会看到光锥。使用 Spotlighthelper 应该可以帮助您确定它指向的方向。

经过几个小时的努力,这是让它工作的代码

const cameraLight = new THREE.SpotLight(0xffffff, 6);
cameraLight.castShadow = true;


cameraLight.shadow.bias = -0.0001;
cameraLight.shadow.mapSize.width = 512/4 * renderer.capabilities.maxTextures; // default
cameraLight.shadow.mapSize.height = 512/4 * renderer.capabilities.maxTextures; // default
cameraLight.shadow.camera.near = 0.1; // default
cameraLight.shadow.camera.far = 500; // default

var d = 32;

cameraLight.shadow.camera.left = -d;
cameraLight.shadow.camera.right = d;
cameraLight.shadow.camera.top = d;
cameraLight.shadow.camera.bottom = -d;

cameraLight.visible = true;
cameraLight.distance = 40;
cameraLight.decay = 1;
cameraLight.angle = Math.PI/4;
cameraLight.penumbra = 0.1; 
    
camera.add( cameraLight );
cameraLight.position.set( 0, 0, 1);
scene.add( camera );
cameraLight.target = camera;

基本上是一样的..

我确实清理了我的缓存,所以这可能是问题所在?我不知道