8

私はこのようなもので本当に新しいです。PointerLockControls で飛び回ることができるシンプルな 3D シーンを作成したいのですが、ある種の懐中電灯も必要です。そのため、スポット ライトはカメラと同じ方向を向く必要があります。

カメラを追跡するようにスポットライトを作成しましたが、そのターゲットは 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;

あなたの場合の最善の解決策は、PointLight代わりに a を使用し、次のパターンを使用することです。

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

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

これで銃はデフォルトでカメラに追従し、銃に沿ってスポットライトが点灯します。何らかの理由で銃が回転している場合 (弾丸をそらしたり、地面を這うなど)、スポットライトも回転します。THREE は素晴らしいソフトウェアです。:-)

スポット ライトをカメラに取り付けて、カメラと同じ方向に向け、中心から離して配置しない場合、ライト コーンは常に円形に見えます。多くのアプリケーションでは、投影で形状が動的に変化するほうがクールでリアルに見えます。小さなオフセットで十分です (上記の例のように、テストしていませんが)。

于 2016-04-19T19:16:53.427 に答える