Reflektorfény
Használata
Tovább szaporodik a használható paraméterek száma.
- A korábban már látott color, intensity, distance, position, decay és visible attribútumok mellett meg kell adnunk a fényforrás célpontját (target). Ennek egy tárgynak (igazából Object3D leszármazott, pl. Mesh) kell lennie!
- A fénykúp nyilásszögét az angle attribútum jelenti. Alapértéke Math.PI / 3 (vagyis 60 fok).
- Szabályozhatjuk, hogy a fény intenzitása hogyan változzon a kúp középtengelyétől kifelé, a palástja felé. Ez a félárnyék (penumbra) attribútum, ami [0, 1] közötti értékeket vehet fel. A 0 az alapérték, ami azt jelenti, hogy nincs halványulás, a kúpon belül minden irányban maximális az intenzitás. Ez nem túl valósághű. A penumbra egy százalékos értéket jelent, a szögtartomány mekkora külső része legyen félárnyékos, kifelé haladva egyre sötétebb.
- A reflektorfény képes árnyékot vetni. Az ehhez kapcsolódó attribútumokat az árnyékolás résznél tárgyaljuk.
let sLight = new THREE.SpotLight( 0x00ffff, 100 );
sLight.position.set( 0, 0, 15 );
sLight.angle = Math.PI / 16;
sLight.target = cubeMesh;
scene.add( sLight );
A reflektor használata is egyszerű, de mint látni fogjuk, oda kell figyelni, hogy szép eredményt kapjunk! A fenti példa kódban például egy nagyon szűk kúp tartomány (11,25 fok!) kerül definiálásra!
Feladatok
Pontfény helyett reflektorfényt használjunk! Ha a fenti reflektor forráskód példát másoljuk be a kódba, az eredmény kiábrándító lesz! Ronda, villog, az átlók mentén időnként csíkok jelennek meg, valamint időnként teljesen eltűnik a kocka! A fő baj a Lambert anyagjellemzővel van. Ez csak a határoló síkidomok csúcspontjaiban értékeli ki a megvilágítási egyenleteket, a háromszögek belső pontjai ezek interpolációjával állnak elő. Vagyis amikor minden csúcspont a reflektor kúpján kívül kerül, fekete lesz minden. |
![]() |
Lambert helyett használjunk Phong anyagjellemzőt! material = new THREE.MeshPhongMaterial( { color: 0xffffff, wireframe: false } );
Ez már szebb! Viszont furcsa, hogy a kúpon belül minden egyformán megvilágítódik, azon kívül meg hirtelen nem látszik semmi! |
![]() |
Állítsunk a reflektor félárnyék értékén! sLight.penumbra = 0.8;
|
![]() |