2013-05-09 152 views
8

我真的是新东西。我想制作一个简单的3D场景,我可以在这里与PointerLockControls一起飞行,但我也想要一些手电筒。所以聚光灯应该指向与相机相同的方向。点SpotLight在相机的方向three.js(手电筒)

我已经让聚光灯跟随相机,但它的目标是绑定到0,0,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

+0

是的,但PointLight不给我阴影。有没有办法让他们与PointLight? – 2013-05-12 20:36:54

+0

确实,pointLights不支持阴影。但是,如果光线位于相机所在的位置,则无论如何您都看不到阴影,因为投射阴影的物体挡在了路上。 – WestLangley 2013-05-12 21:17:03

+0

好吧,也许坏的例子 - 任务: 我想在node.js作为服务器,(多人)同步场景中的两个单位,我想闪光灯在每个单位,指向定义的方向。通过套接字发送此类信息的最佳方式是什么? (通过接受按钮的方式?:)) – 2013-05-14 14:49:28

8

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

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

由于Spotlight的.TARGET需要是​​一个对象(而不是一个位置),我发现它精神上更容易简单地把手电筒背后将相机直接,然后瞄准它相机。因此,光线照在照相机上并照亮它前面的东西。

这个方法是好的,如果你所在的手电筒举行靠近胸部一侧(中央对身体),而不是关闭手电筒后的效果。

+0

这对我工作感谢!一直试图找到一些工作代码。你知道聚光灯是否可以独立于相机进行互动吗?我在这里问过一个问题:http://stackoverflow.com/questions/17827292/add-interactivity-to-a-spotlight-in-three-js – Paul 2013-07-24 23:08:58

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); 

而现在的枪将,默认情况下,按照摄像头,聚光灯将沿着枪亮起。如果枪因某种原因旋转(偏转子弹或在地面或其他地方爬行),聚光灯也会旋转。 THREE是一款不错的软件。 :-)

如果将聚光灯的相机,并在相同的方向将相机指向它,不定位它远离中心,则光锥看起来不断循环。对于许多应用来说,它看起来更酷更实际,它在投影中动态改变形状。一个小的偏移量就是它所需要的(例如在我上面的例子中,虽然我没有测试过那个)。