将SpotLight指向与摄像头three.js(手电筒)相同的方向

时间:2013-05-09 07:44:25

标签: javascript camera three.js

我真的很喜欢这个东西。我想制作一个简单的3D场景,我可以用PointerLockControls飞来飞去,但我也希望有一些手电筒。因此,聚光灯应指向与相机相同的方向。

我已经开始关注相机,但它的目标是0,0,0。

实现这一目标的最佳方法是什么?

谢谢。

3 个答案:

答案 0 :(得分:12)

SpotLight目标是Object3D,而不是Vector3

spotlight.target = myObject;

在您的情况下,最佳解决方案是使用PointLight代替,并使用此模式:

scene.add( camera );
camera.add( pointLight );

如果您仍想使用聚光灯,请执行以下操作:

scene.add( camera );
camera.add( spotLight.target );
spotLight.target.position.set( 0, 0, -1 );
spotLight.position.copy( camera.position ); // and reset spotlight position if camera moves

通常不需要将摄像机添加为场景的孩子,但在这种情况下需要将摄像机作为孩子添加。

three.js r.69

答案 1 :(得分:10)

我有同样的问题,我解决了如下:

flashlight = new THREE.SpotLight(0xffffff,4,40);
camera.add(flashlight);
flashlight.position.set(0,0,1);
flashlight.target = camera;

由于SpotLight的.target需要是一个对象(而不是一个位置),我发现简单地将手电筒直接放在后面相机上,然后将它瞄准 at < / em>相机。因此,光线照在相机上,照亮前方的东西。

如果手电筒靠近胸部(身体的中央)而不是一侧的手电筒,那么这种方法很好。

答案 2 :(得分:2)

受WestLangley上述解决方案的启发,我发现 spotlight.target 聚光灯本身可以作为孩子添加到同一个对象,无论是相机还是其他物体,如汽车或枪支。然后它们相对于父对象定位,因此不需要将位置从一个对象复制到另一个对象。

例如,你可以这样做:

scene.add(camera);
camera.add(gun);
gun.position.set(-30,-30,0);
gun.add(spotlight);
spotlight.position.set(0,0,30);
gun.add(spotlight.target);
spotlight.target.position.set(0,0,31);

现在,默认情况下,枪将跟随相机,聚光灯将沿着枪照亮。如果枪由于某种原因旋转(偏转子弹或爬在地上或其他任何地方),聚光灯也会旋转。三是一个很好的软件。 : - )

如果将聚光灯安装在相机上并将其指向与相机相同的方向,并且不要将其放置在远离中心的位置,则光锥将看起来始终呈圆形。对于许多应用来说,它在投影中动态地改变形状看起来更酷,更逼真。只需要一个小的偏移量(例如我上面的例子中,虽然我没有测试过那个)。