2013-05-09 14 views
8

Jestem naprawdę nowy w tych rzeczach. Chcę stworzyć prostą scenę 3D, w której mogę latać z PointerLockControls, ale chcę też mieć jakąś latarkę. Zatem światło punktowe powinno wskazywać ten sam kierunek, co kamera.Point SpotLight w tym samym kierunku, co kamera three.js (Flashlight)

Zrobiłem reflektor, aby śledzić kamerę, ale jej cel jest ustawiony na 0,0,0.

Jaki jest najlepszy sposób, aby to osiągnąć?

Dziękuję.

Odpowiedz

12

Celem SpotLight jest Object3D, a nie Vector3.

spotlight.target = myObject; 

Najlepszym rozwiązaniem w Twoim przypadku jest użycie PointLight zamiast, i korzystać z tego wzoru:

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

Jeśli nadal chcesz korzystać z reflektora, a następnie zrobić coś takiego:

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 

Nie jest na ogół wymagane dodawanie aparatu jako dziecka sceny, ale jest to wymagane w tym przypadku, ponieważ światło jest dodawane jako dziecko aparatu.

Three.js r.69

+0

Tak, ale PointLight nie daje mi cieni. Czy istnieje sposób na ich zastosowanie w PointLight? –

+0

True, pointLights nie obsługuje cieni. Ale jeśli światło znajduje się w miejscu, w którym znajduje się kamera, i tak nie widać cienia, ponieważ przeszkadzają obiekty rzucające cienie. – WestLangley

+0

OK może zły przykład - zadanie: Chcę dwie jednostki na scenie zsynchronizowane przez node.js jako serwer, (multiplayer) i chcę mieć lampę błyskową w każdej jednostce, wskazując określony kierunek. jaki jest najlepszy sposób wysyłania takich informacji przez gniazdo? (przy okazji, gdzie jest przycisk akceptacji? :)) –

8

że ten sam problem które rozwiązany w następujący sposób:

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

Ponieważ .target reflektor potrzebuje być przedmiotem (a nie położenia) stwierdzono, że mentalnie łatwiej jest po prostu umieścić latarkę bezpośrednio za kamerą, a następnie wycelować w kamerę przy. W ten sposób światło świeci przez kamerę i rozświetla przedmioty znajdujące się przed nią.

Takie podejście jest w porządku, jeśli poszukujesz efektu latarki, w którym latarka jest trzymana blisko klatki piersiowej (centralnej względem ciała), a nie wyłączona po jednej stronie.

+0

To działa na mnie dzięki! Próbowałem znaleźć jakiś działający kod. Czy wiesz, czy reflektor może być interaktywny niezależnie od kamery? Zadałem pytanie tutaj: http://stackoverflow.com/questions/17827292/add-interactivity-to-a-spotlight-in-three-js – Paul

2

Zainspirowany rozwiązania WestLangley za wyżej, okazało się, że spotlight.target i reflektor sama może być dodany jako dzieci do tego samego obiektu, czy to jest kamera lub inny przedmiot, jak samochód lub pistoletu. Następnie są one pozycjonowane względem obiektu nadrzędnego, tak że nie ma potrzeby dalszego kopiowania pozycji z jednego obiektu do drugiego.

Można na przykład zrobić coś takiego:

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

A teraz broń będzie domyślnie śledzić kamery, a reflektor zaświeci się po pistolet. Jeśli pistolet zostanie z jakiegoś powodu obrócony (odbijanie kuli lub czołganie się po ziemi lub cokolwiek innego), reflektor również się obróci. TRZY to fajne oprogramowanie. :-)

Jeśli przymocujesz reflektor do aparatu i skieruje go w tym samym kierunku co aparat i nie umieszczaj go z dala od środka, wówczas stożek świetlny będzie wyglądać stale kołowo. W wielu zastosowaniach wygląda na chłodniej i bardziej realistycznie, ponieważ zmienia się dynamicznie w projekcji.Wystarczy małe przesunięcie (jak na przykład w powyższym przykładzie, chociaż tego nie przetestowałem).