8

我对这东西真的很陌生。我想制作一个简单的 3D 场景,我可以在其中使用 PointerLockControls 飞来飞去,但我也想要某种手电筒。所以聚光灯应该指向与相机相同的方向。

我已经使聚光灯跟随相机,但它的目标绑定到 0,0,0。

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

谢谢你。

4

3 回答 3

13

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

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

由于 SpotLight 的 .target 需要是一个对象(而不是一个位置),我发现将手电筒直接放在相机后面,然后将其对准相机心理上更容易。因此,光线通过相机照射并照亮了它前面的东西。

如果您想要手电筒靠近胸部(身体中央)而不是一侧关闭的手电筒效果,这种方法很好。

于 2013-06-20T15:02:48.133 回答
13

SpotLight目标是一个,而Object3D不是一个Vector3

spotlight.target = myObject;

在您的情况下,最好的解决方案是使用 a 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

通常不需要将相机添加为场景的子节点,但在这种情况下需要添加,因为灯光是作为相机的子节点添加的。

三.js r.69

于 2013-05-09T13:59:16.340 回答
2

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

例如,您可以执行以下操作:

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

现在枪会默认跟随相机,聚光灯会沿着枪点亮。如果枪因某种原因旋转(偏转子弹或在地面上爬行或其他),聚光灯也会旋转。三是一款不错的软件。:-)

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

于 2016-04-19T19:16:53.427 回答