Skip navigation

Csillogó (spekuláris) megvilágítás Phong árnyalással

Jellemzői és használata

A spekuláris megvilágítási komponenssel csillogó, fényt visszatükröző felületű objektumok modellezésére van lehetőség. Az ambiens, diffúz és spekuláris komponensek együttesen adják a Phong megvilágítási modellt, amit a MeshPhongMaterial objektummal reprezentálhatunk Three.js-ben.

A spekuláris megvilágítási komponens esetén az számít, hogy a kamera nézeti iránya hogyan helyezkedik el a fény felszínről való visszatükröződésének irányától. Ha a tárgy jó fényvisszaverő képességgel rendelkezik (pl. fémes tárgyak, tükör, stb.), akkor ha a kamera a vetítési iránya a visszatükröződés irányának közelében van, akkor a fényforrás visszatükrözött színét látjuk, nem a tárgyét. Ahogy ez a szög növekszik, egyre inkább a tárgy diffúz megvilágított színe jelenik meg. Matt objektumok esetén a visszaverődés irányában lévő kamera sem fogja a fény színét látni, mert a fény a felszínen több irányban szóródik.

A specular attribútummal a csillogás színét, a shininess attribútummal pedig a csillogás mértékét adhatjuk meg [0, 100] tartományban (matt-fényes). A shininess 0 értéke megszünteti a csillogó hatást. A specular alapértéke 0x111111 (erősen sötétszürke), a shininess 30. Ez matt-szerű hatást kelt. Erősebb csillogást magasabb intenzitásúra állított spekuláris színnel (pl. 0xffffff fehér) érhetünk el.

Ha a metal attribútumot igazra állítjuk, akkor kicsit másként számolódik a szín, hogy fémszerűbb hatást kapjunk. Nagy különbséget nem igen fogunk észrevenni.

A Phong árnyalás azt jelenti, hogy a megvilágítási egyenleteket a síkidom minden belső képpontjában is kiértékeli, nem csak a csúcspontokban. A beesési szög számításához szükséges normálvektor irányt a csúcspontok normálvektorainak interpolációjával számítja ki. Számításigényesebb, mint a diffúz-Lambert modell, de látványosabb is.

Használata

let material = new THREE.MeshPhongMaterial( {
color: 0xa0adaf,
shininess: 80,
specular: 0x111111,
side: THREE.FrontSide,
wireframe: false
} );

Dokumentáció interaktív példával

Feladatok

Próbáljuk ki a Learning Three.js könyv 3.2 példaprogramját!

  • Link: https://www.smartjava.org/ltjs/chapter-03/02-point-light.html.
  • Egy térben mozgó pontszerű fényforrást látunk, amely megvilágítja a három másik objektumot.
  • Változtassuk az ambiens színt is!
    • Ha az intensity paramétert 0-ra állítjuk, akkor csak az ambiens fény hatását látjuk!
  • Figyeljük meg, hogy a síklap objektum megvilágítása nem helyes!
    • A fény a sarkok közelébe érve fényes hatást fejt ki, de onnan távolodva nem világítja meg a belső pontokat!
    • A probléma az, hogy a megvilágítási egyenletek csak a síkidomok csúcspontjaiban értékelődnek ki, a belső pontok ezek interpolált színértékét kapják. A síklapot pedig két háromszögből (irányonként 1 sáv) rakták össze, vagyis csak a négy sarokpontban lesz korrekt megvilágítás!
      • let planeGeometry = new THREE.PlaneGeometry(60, 20, 1, 1);
    • Megoldás: a síklap létrehozásakor sűrítsük meg a sávok számát, pl.:
      • let planeGeometry = new THREE.PlaneGeometry(60, 20, 30, 10);
  • Tanulság
    • A Gourad árnyalás esetén akkor kapunk szép megvilágítási eredményt, ha a felszínháló pontjai elég sűrűn helyezkednek el.
    • De inkább használjunk per-fragent árnyalással dolgozó anyagjellemzőt. Az r144 verzió óta a Three.js anyagjellemző objektumai eleve ilyenek.

Javított példaprogram verziók

Modellezés paraméterei

  • Talaj anyagjellemzők: sárga szín (0xffff00), vörös spekuláris szín (0xff0000), magas csillogási érték (80).
  • Pontfény jellemzők: fehéres szín (0xccffcc), talajhoz közeli elhelyezkedés (3, 5, 3).
  • Ambiens fény: sötétszürke (0x404040).

Feladat

  • Változtassunk a planeMaterial.shininess paraméter értékén! Próbáljuk ki a 0, 20, 40, 80, 100 értékeket!