我真的很喜欢这个东西。我想制作一个简单的3D场景,我可以用PointerLockControls飞来飞去,但我也希望有一些手电筒。因此,聚光灯应指向与相机相同的方向。
我已经开始关注相机,但它的目标是0,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
答案 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);
现在,默认情况下,枪将跟随相机,聚光灯将沿着枪照亮。如果枪由于某种原因旋转(偏转子弹或爬在地上或其他任何地方),聚光灯也会旋转。三是一个很好的软件。 : - )
如果将聚光灯安装在相机上并将其指向与相机相同的方向,并且不要将其放置在远离中心的位置,则光锥将看起来始终呈圆形。对于许多应用来说,它在投影中动态地改变形状看起来更酷,更逼真。只需要一个小的偏移量(例如我上面的例子中,虽然我没有测试过那个)。