J3DT_6 - Světla

Cíle kapitoly

Po přečtení této kapitoly budete schopni:

Obrázky které Java 3D renderuje ve virtuálních světech v "Yačínáme s Java 3D API" (Modul 1 tohoto tutoriálu) pozbývají vizuální detail. Chybí jim barvitost a stíny reálného světa. Tento modul představuje techniky které dodávají vizuální detail skrze stínování a texturování vizuálních objektů. Kapitola 6, Světla, vysvětluje model osvětlování a jak použít světla v Java 3D ke stínování. Kapitola 7, Texturování, ukazuje jak použít textury k přidání detailu vizuálního objektu bez nutnosti přidat více geometrie.

Java 3D stínuje vizuální objekty na základě kombinace jejich vlastností materiálu a světel ve virtuálním vesmíru. Stínování je důsledek aplikování modelu osvětlování vizuálního objektu za přítomnosti světelných zdrojů. Sekce 6.1 obsahuje přehled modelu osvětlení použitého v Java 3D rendereru a jak světlo interaguje s materiály aby se dosáhlo stínování. Každá z následujících sekcí vysvětluje vlastnosti Java 3D podstatné pro model osvětlení.

6.1 Stínování v Java 3D

Stínování vizuálních objektů v Java 3D závisí na mnoha faktorech. Tato sekce podává krátký přehled Java 3D modelu osvětlení, barevného modelu a stínovacích modelů. Více detailů o modelu osvětlení obsahuje specifikace k Java 3D API. Protože většina z osvětlovacího a stínovacího modelu Java 3D je založena na OpenGL, lze najít více informací také ze zdrojů o OpenGL.

Model osvětlení

V reálném světě jsou barvy které vnímáme kombinací fyzikálních vlastností objektu, charakteristik světelných zdrojů, relativní poloha objektu vzhledem k světelným zdrojům a úhlu ze kterého se na objekt díváme. Java 3D používá model osvětlování který se snaží aproximovat fyziku reálného světa. Zbytek této sekce obecně vysvětluje model osvětlení v Java 3D. Sekce E.2 Java 3D API specifikace obsahuje matematické rovnice pro použitý model osvětlení.

Rovnice osvětlení závisí na třech vektorech: normále povrchu (N), směru světla (L) a směru k oku pozorovatele (E). Plus na vlastnostech materiálu objektu a charakteristice světla. Obrázek 6-1 znázorňuje tři vektory pro dva vertexy kulového povrchu. Vektory každého z vertexů mohou mít různé směru v závislosti na charakteru scény. Pokud se vektory světla a oka (kamery) liší, spočítají se při renderování. Takže každý vertex koule je renderován s jiným stínem.

Fig 1-6

Model osvětlování zahrnuje tři druhy složek reálného světa: ambientní, difúzní a odleskovou. Ambientní odraz je důsledkem konstantního, slabého, ambientního světla. Difůzní odraz je normálový odraz světelného zdroje od vizuálního objektu. Zrcadlové odrazy jsou odlesky světelného zdroje od objektu v jistých situacích.

Obrázek 6-2 ukazuje koul a rovinu renderovanou v Java 3D. Na kouli lze vidět zmíněné tři druhy odrazu. Nejtmavší část koule představuje samotný ambientní odraz. Střed koule je osvětlen difúzním a ambientním světlem. Modrá koule a bílé světlo dávajímodrý difúzní odraz. Nejsvětlější část koule je výsledkem zrcadlového odrazu spolu s ambientním a difúzním odrazem.

Fig 6-2

Lokální versus nekonečné vektory kamery

Pokud každý vertex každého vizuálního objektu na scéně musí mít vektor světla, kamery a výpočet stínu, je zapotřebí významná část výpočetího výkonu pro renderování stínů těchto vertexů. Množství výpočtů lze snížit pokud je vektor světla, nebo kamery nebo obojí konstantní. Vektor světla je konstantní když použijeme směrové světlo (viz sekce 6.3.2). Vektor kamery je konstantní od základu, i když lze specifikovat proměnný vektor kamery použitím jedné z metod objektu View (viz sekce 6.7.5).

Mezi objekty bez efektů

I když je model osvětlování založený na fyzice reálného světa, není nijak komplexní. Je vidět chybějící stín který má koule vrhat na rovinu pod ní. Co už není tak zřejmé, chybí i světlo odražené od koule na rovinu. Také chybí světlo odražené od roviny směrem ke kouli.

Často je těžké obsáhnout složitost výpočtu světla. je to podobně těžké jako výpočet chování každé kapky vody ve sprše. Kapky stékají z hlavice různými směry. POkud narazí na nějaký objekt, výsledná srážka vytvoří více malých kapek které se rozutečou různými směry. Tento proces se mnohokrát opakuje, dokud kapka nesteče do odpadu. Složitost inerakce světla s vizuálními objekty je podobného rázu. Existují ale některé rozdíly mezi chováním vody a světla, třeba že světlo nemá žádnou adhezi (čili neulpívá na vizuálních objektech) a gravitační efekt je také zanedbatelný.

ABy se snížila složitost výpočtu, zvažuje model osvětlení pouze jeden vizuální objekt za jednotu času. Výsledkem je že model osvětlování nerenderuje stíny a odrazy mezi objekty. Oba dva efekty vyžadují zvážit relativní polohu všech objektů navzájem v čase renderování. Mnohem více výpočtů ale zahrnuje renderování scény s efekty mezi jednotlivými objekty. Java 3D a ostatní renderovací systémy pracující v reálném čase tyto efekty mezi objekty ignorují. Některé z těchto efektů lze však do scény přidat je-li to nezbytné. Sekce 6.7 diksutuje o složitosti stínů a technik produkujících stíny v Java 3D programech.

Barevný model

Barvený model není založený na fyzice reálného světa. Java 3D vytváří barvy světel a materiálů jako kombinaci červené, zelené a modré. Bílá barva, ať už světla nebo materiálu, je kombinací všech tří složek s maximální intenzitou. Každé světlo produkuje jednu barvu specifikovanou RGB modelem. Model osvětlování je aplikovaný na každou barvnou složku RGB modelu. například červený balón pod modrým světlem nebude viditelný, protože modré světlo se nebude odrážet od červeného objektu. V realitě je barva kombinací mnoha vlnových délek světla, ne jen tří. RGB barvený model je schopný eprezentovat mnoho (miliony) barev, ale ne všechny.

Vliv světel

V Java 3D se část scény ve které jsou vizuální objekty osvětleny nějakým světelným zdrojem nazývá oblast vlivu. Nejjednodušší oblast vlivu světelného zdroje používá objekt Bounds a metodu setInfluencingBounds pro světelný zdroj. Pokud se oblast vlivu světelného zdroje protíná s oblastí vizuálního objektu, použije se toto světlo ke stínování celého objektu. Oblast vlivu světla určuje které objekty osvětlit, ale ne které části objektů se mají osvětlit. Sekce 6.2.2 tento koncept vysvětluje podrobněji. Sekce 6.6 představuje alternativní metody ke kontrolování vlivu světel.

Model stínování

Model osvětlení stínuje (termín stínovat znamená počítat barvenou hodnotu pro každý pixel na renderované scéně. V tomto kontextu stínování nemá nic společného s stíny) každý vertex vizuálního objektu každého světla. Stínování vertexu tvořen je součtem jednotlivých jednotlivch světelných zdrojů vertexu. Zbytek vizuálního objektu je stínován na základě stínu vertexů. Model stínování vizuálního objektu, specifikovaný jako atribut objektu Appearance s nadtřídou NodeComponent, určuje jak se bude stínovat zbytek vizuálního objektu.

ColoringAttributes specifikuje model stínování vizuálních objektů pomocí jedné z konstant SHADE_GOURAUD, SHADE_FLAT, FASTEST, NICEST. Pro více informací o třídě Coloring Attributes se podívejte do sekce 2.6.3. Zapamatujte si že barevná sada v objektu ColoringAttributes není pro stínování nikdy použita.

v Gouraudově stínování je každý pixel stínován hodnotou která je odvozena trilineární interpolací hodnoty stínování každého vertexu polygonu. V plošném stínování je všem pixelů polygonu přiřazena hodnota stínování jen z jednoho vertexu polygonu (výběr vertexu polygonu závisí na implementaci a nemůže být určen ani kontrolován). Následující obrázek ukazuje jednu kouli s plošným stínováním a jednu s Gouraudovým stínováním. Výhoda plošného stínování je jeho rychlost při sofwarovém renderování (při použití grafického hardware se rozdíl mezi časem potřebným pro plošné a Gouraudovo stínování může lišit v závislosti na povaze hardware. Na některém hardware může být Gouraudovo stínování rychlejší než plošné stínování). Gouraudovo stínování má výhodu že vypadá lépe.

Fig 6-3

Poslední bod předtím než se přesuneme k příkladu; světelné zdroje nejsou vizuálními objekty. I když je světlo umístěno v zorném poli, není renderováno.

6.2 Recept na osvětlování vizuálních objektů

Je nutné provést mnoho kroků nezbytných k zapnutí osvětlování vizuálních objektů v virtuálním vesmíru. Po vytvoření a nastavení světel se navíc musí každé světlo vložit do grafu scény a mít nastavenu oblast vlivu. Každý objekt který má být stínován musí mít povrchové normály a materiál.

  1. Specifikace světelného zdroje
    1. nastavení oblasti vlivu
    2. vložení do grafu scény
  2. Vizuální objekt
    1. normály
    2. vlastnosti materiálů

Pokud chybí jen jedna položka ze seznamu, osvětlování nebude fungovat. Přítomnost objektu Material spolu s Appearance v definici vizuálního objektu zapne model osvětlování pro tento objekt. Bez objektu Material bude sice vizuální objekt barevný, ale nebude stínován ani pomocí ColoringAttributes ani pomocí barev vertexu objektu Geometry. Pokud není přítomný ani jeden z nich, tak výsledný objekt bude bílý. Níže je uvedena výjimka která je vyhozena pokud má vizuální objekt specifikovaný Material ale chybí mu povrchové normály.

	javax.media.j3d.IllegalRenderingStateException: Cannot do lighting without
	specifying normals in geometry object

Najít chyby v osvětlování nemusí být jednoduché. Neexistuje žádné upozornění na to že světlo je mimo graf scény. Neexistuje žádné upozornění že světlo nemá nastavenou oblast vlivu. V obou případech nebude mít světelný objekt žádný vliv na vizuální objekty v grafu scény. Viuzální objekt který je správně specifikován a nastaven pro osvětlování (i s objektem Material v živém grafu scény, ale mimo oblastí vlivu všech přítomných světelných zdrojů, se vyrenderuje černě.

Je možné správně specifikovat scénu, na které je vizuální objekt s nastavenými vlastnostmi materiálu v oblasti vlivu světla vyrenderovaný černě. Při renderování hraje roli jak orientace světla, vizuálního objektu tak i směr pohledu kamery. tato kapitola pravidelně upozorňuje na problémy s renderováním. Sekce 6.3.6 a 6.5 obsahují možné programovací úskalí.

6.2.1 Příklad jednoduchého osvětlování

Jak je uvedeno výše, vytváření stínovaných scén vyžaduje správně specifikovat světelný zdroj a vizuální objekty. Doposud jsme však nediskutovali ani o třídě Light ani Material. Avšak když využijeme vlastností a základních nastavení API, můžeme zapnout osvětlování virtuálních světů. Geometrická primitiva generují normály povrchu na požádání (viz sekce 2.3.8). Základní nastavení objektu Material tvoří použitelný vizuální objekt. Základní konstruktor zdroje osvětlení vytáří použitelný zdroj osvětlení.

Použití třídy SimpleUniverse s dvěma metodami uvedenými ve výpisu kódu níže, produkuje virtuální vesmír včetně jedné koule s nastavenými základními vlastnostmi materiálu osvětlenou jedním objektem AmbientLight který tvoří zdroj světla. První metoda konstruuje objekt Material spolu s objektem Appearance pro objekt Sphere. Druhá metoda vytváří objekt BranchGroup který slouží jako kořen obsahu grafu scény, a následně vkládá do grafu scény objekty Sphere a AmbientLight. Objekt Material, který je součástí balíčku vzhledu je vložen do objektu Sphere při jeho vytváření. Objekt BoundingSphere tvoří oblast vlivu objektu AmbientLight. Obrázek grafu scény tohoto virtuálního světa můžete vidět pod ukázkou kódu.

1.	Appearance createAppearance() {
2.		Appearance a = new Appearance();
3.		Material m = new Material();
4.		a.setMaterial(m);
5.		return a;
6.	}
7.
8.	BranchGroup createScene() {
9.		BranchGroup scene = new BranchGroup();
10.		scene.addChild(new Sphere(0.5f, Sphere.GENERATE_NORMALS, createAppearance()));
11.		AmbientLight al = new AmbientLight();
12.		al.setInfluencingBounds(new BoundingSphere());
13.		scene.addChild(al);
14.		return scene;
15.	}

Řádky 3 a 4 by mohly být nahrazeny následujícím řádkem vytvářejícím anonymní objekt Material:

	a.setMaterial(new Material());

Objekty materiálu lze plně přizpůsobit použitím parametrického konstruktoru, což zjednodušuje použití anaonymních objektů (viz sekce 6.4). V konstrastu s tím vytváření anonymních objektů třídy Light ztěžuje použití objektů oblasti vlivu světla (viz sekce 6.3). Zapamatujte si že pojmenování objektu Material může usnadnit jeho sdílení mezi různými balíčky vzhledu, což se projeví ve zlepšní výkonu aplikace.

Třída SimpleUniverse poskytuje objekty VirtualUniverse a Locale spolu s pohledovým grafem scény pro graf scény jak je vidět na obrázku níže. Bez transformace je objekt Sphere a objekt BoundingSphere umístěn na počátku systému souřadnic, takže se protínají. Objekt Sphere je stínován objektem AmbientLight. Obrázek níže ukazuje výslednou vyrenderovanou scénu s bílým pozadím. Definice nastavení pozadí není součástí ukázky kódu.

fig 6-6

Koule na obrázku níže je celá šedám což je základní nastavení vlastností materiálu s ambientním světlem.

fig 6-7

Obrázek výše dokazuje že scény osvětlené jen ambientním světlem vypadají mdle. Protože je ambientní světlo jednolité, vytváří jednolitý odstín. Ambientní světlo se používá jako výplň ve scénách které neobsahují ostatní druhy světla. Přídáním směrového světla DirectionalLight kze scénu učinit zajímavější.

Vložení následujícího kódu do předchozí ukázky kódu přidá do obsahu grafu scény objekt DirectionalLight grafu scény. Opět jsou použity základní konstruktory pro zdroj světla a pro oblast vlivu je použit základní konstruktor BoundingSphere. Následující obrázek ukazuje výsledný graf scény bez objektů poskytovaných SimpleUniverse.

1.	DirectionalLight dl = new DirectionalLight();
2.	dl.setInfluencingBounds(new BoundingSphere());
3.	// úprava nastavení objektu DirectionalLight
4.	scene.addChild(dl);

fig 6-8

Následující obrázek ukazuje scénu vyprodukovanou kombinací dvou fragmentů kódu. Vliv objektu AmbientLight lze v přítomnosti směrového světla DirectionalLight rozpoznat jen stěží. Je zřejmé že k vytvoření vizuálně zajímavých scén je nezbytné si přizpůsbit objekty světla anebo vlastnosti materiálu vizuálních objektů. Tato témata jsou pokryta v sekcích 6.3 a 6.4. Další sekce je diskuzí o umístění objektů světla v grafu scény.

fig 6-9

6.2.2 Kam do grafu scény vložit světelný objekt

Vliv světelného objektu na svět není dán jen jeho pozicí v grafu scény; tak jsou ovlivněny jen oblasti vlivu odkazované světlem. Objekt oblasti je předmětem který se váže na lokální systém souřadnic grafu scény podle toho kam bylo světlo vloženo. Jako příklad si vemte následující obrázek. Ten stejný objekt BoundingSphere na který se odkazjí dva zdroje světla mají dvě rozdílné oblasti vlivu díky posunu objektem TransformGroup Počátek lokálního systému souřadnic grafu scény za objektem TransformGroup je 2 metry za počátkem systému souřadnic světa (objektu Locale) a druhou oblastí vlivu.

fig1-10

Ať už jeden nebo druhý, nebo oba, objekty světlených zdrojů v grafu scény na obrázku 6-10 ovlivňují stínování (světlo) vizuálního objektu které závisí na zda ohraničení vizuálního objektu protíná oblast vlivu světelných objektů. Definování oblasti vlivu jako jediného ohraničení však nemusí fungovat ve všch aplikacích. Sekce 6.6 představuje alternativní metody pro kontrolu vlivu světel.

6.3 Třídy osvětlování

Java 3D poskytuje pro osvětlování čtyři třídy. každá je odvozena od třídy Light. Obrázek 6-11 ukazuje hierarchii tříd pro osvětlování. Light jako abstraktní třída poskytuje metody a s nimi spojené konstanty vlastností pro manipulaci se stavem, barvou a ohraničením objektu. Stav objektu je booleovská proměnná která zapíná nebo vypína světlo. Sekce 6.3.16.3.4 obsahuje detaily každé ze tříd pro osvětlování. Sekce 6.6 představuje alternativní metody pro kontrolu vlivu světel.

Obrázek 6-11: Hierarchie tříd Java 3D API pro práci se světly

Následující referenční blok obsahuje seznam metod a konstant třídy Light. Vzpomeňte si že oblast vlivu nastavená metodou setInfluencingBounds() zapne světlo jakmile se její hranice protnou s výhledem pozorovatele.


Metody a vlastnosti třídy Light (částečný seznam)

Třída Light je abstraktní třída obsahující proměnné instance společné všem světlům. Další metody lze nalézt v referenčním bloku v sekci 6.6.

void setColor(Color3f color)

Nastavuje barvu světla.

void setEnable(boolean state)

Zapne nebo vypne světlo.

void setInfluencingBounds(Bounds bounds)

nastavuje oblast vlivu světla.

Vlastnosti třídy Light

Více informací o vlastnostech naleznete v sekci 1.8.2.

ALLOW_INFLUENCING_BOUNDS_READ | WRITE

ALLOW_STATE_READ | WRITE

ALLOW_COLOR_READ | WRITE


6.3.1 Ambientní světlo

Objekty ambientního světla mají stejnou intenzitu v kterémkoli místě a ve všech směrech(samzřejmě ale platí že vliv světelného zdroje je dán jeho oblastí vlivu. "V kterémkoli místě" znamená pod vizuálním objektem stejně jako na celém jeho povrchu). Objekty ambientního světla jsou světlo odražené ostatními vizuálními objekty. Pokud se podíváte zespodu na desku svého stolu, uvidíte ji i když na ni přímo nesvítí žádné světlo (pokud tedy nemáte lamipčku pod stolem). Světlo které ji takto osvětluje je odražené od podlahy a jiných objektů. V přirozeném prostředí s mnoha objekty se světlo odráží od mnoha objektů a vytváří tak ambientní světlo. Tento efekt simuluje v Java 3D třída AmbientLight.

Následujíc referenční blok obsahuje seznam konstruktorů třídy AmbientLight. Metody a vlastnosti této třídy pocházejí od abstraktní nadtřídy Light.


konstruktory třídy AmbientLight

Objekt této třídy použitý jako světelný zdroj poskytuje stejnou intenzitu světla v kterémkoli místě a v jakémkoli směru. Vytváří komplexní odraz mezi objekty který je přítomen v přirozených scénách.

AmbientLight()

Vytváří a inicializuje zdroj ambientního světla s následujícími hodnotami:

lightOn = true

color (1, 1, 1)

AmbientLight(Color3f color)

Vytváří a inicializuje ambientní světlo se zadaným parametrem.

AmbientLight(boolean lightOn, Color3f color)

Vytváří a inicializuje ambientní světlo se zadanými parametry.


I když se může zdát přirozené přemýšlet o ambientním světle jako o globálním, není to nezbytně pravda vzhledem k Java 3D programu. Oblast zdroje AmbientLight je kontrolována stejně jako každé jiné světlo v Java 3D. V Java 3D aplikace lze použít více objektů AmbientLight. Počet těchto objektů není omezen (i když Java 3D API neklade žádné omezení počtu světelných zdrojů, měli byste na to brát v implementaci ohled).

Jak je zmíněno v sekci 6.1 (Stínování v Java 3D), stínování vertexu je výsledkem vlivu světelných zdrojů, vlastností materiálů vizuálního objektu a jejich relativní vzdálenosti a orientace. Pro ambientní světlo se však nezvažuje geometrie objektu. Vlastnosti materiálu jsou použity pouze pro výpočet odrazu ambientního světla. Model osvětlování počítá odraz ambientního světla jako výsledek intenzity objektu AmbientLight a vlastností materiálu vizuálního objektu. Sekce 6.4 představuje vlastnosti materiálu vizuálních objektů detailněji.

6.3.2 Směrové světlo

Objekt DirectionalLight představuje zdroj velmi vzdáleného světla jakým je třeba slunce. Narozdíl od zdrojů ambientního světla ale zdroje směrového světla svítí jen jedním směrem. Pro objekty osvětlené směrovým světlem je vektor světla konstantní.

Obrázek 6-12 ukazuje dva vertexy jedné koule osvětlené zdrojem DirectionalLight. vektor světla je pro tyto dva a všechny ostatní vertexy stejný. Porovnejte obrázek 6-12 s obrázekem 6-1. Protože všechny vektory ze směrového světla jsou paralelní a světlo neslábne. Jinými slovy, intenzita směrového světla mezi jeho zdrojem a vizuálním objektem nemění.

Obrázek 6-12: Vektor světla je pro směrové světlo konstantní

Další dva referenční bloky uvádí seznam konstruktorů a metod třídy DirectionalLight.


Konstruktory třídy DirectionalLight

Objekt této třídy představuje velmi vzdálený zdroj světla s konstantním směrovým vektorem světla.

DirectionalLight()

Vytváří a inicializuje směrové světlo s těmito hodnotami:

lightOn = true

color (1, 1, 1)

direction (1, 1, 1)

DirectionalLight(Color3f color, Vector3f direction)

vytváří a inicializuje směrové světlo se zadanou barvou a směrem. Světlo je zapnuté.

DirectionalLight(boolean lightOn, Color3f color, Vector3f direction)

Vytváří a inicializuje směrové svétlo se zadaným stavem, barvou a směrem.


Následující referenční blok obsahuje seznam metod a vlastností třídy DirectionalLight které rozšiřují třídu Light.


Metody třídy DirectionalLight

Více metod je uvedeno v dokumentaci třídy Light

void setDirection(Vector3f direction)

Nastavuje směr světla

void setDirection(float x, float y, float z)

Nastavuje směr světla.

Vlastnosti třídy DirectionalLight

K vlastnostem zděděným od Light mají objekty DirectionalLight jednu navíc:

ALLOW_DIRECTION_READ | WRITE


Směrová světla se podílí jen na difúzní a zracdlové složce modelu oosvětlování. Pro difůzní a zrcadlové odrazy je významným faktorem geometrie (narozdíl od ambientních odrazů). Změna směru světelného zdroje ovlivňuje stínování vizuálních objektů. Pro výpočet difúzních a zrcadlových odlesků se používají difůzní a zrcadlové vlastnosti materiálu. Sekce 6.4 obsahuje více informací o vlastnostech materiálu vizuálních objektů.

6.3.3 Bodové světlo

Třída PointLight je knecpčním protějškem třídy DirectionalLight. Je to omni světlo jehož intenzita se mění se vzdáleností a má svou lokaci (směrové světlo nemá ždnou lokaci, jen směr). Objekty třídy PointLight představují žárovky, svíčky nebo jiné zdroje světla bez stínítek nebo čoček.

Pokles intenzity (atenuace) bodového světla je dána kvadratickou rovnicí. Rovnici můžete najít v sekci E.2 Java 3D specifikace. Obrázek 6-13 ilustruje vztah objektu třídy PointLight a koule. Všimněte si že vektory světla nejsou paralelní.

Obrázek 6-13: Pro bodové světlo nejsou vektory světla konstantní

Následujíc referenční bloky uvásdí seznam konstruktorů a metod třídy PointLight.


Konstruktory třídy PointLight

Objekt třídy PointLight definuje zdroj světla s atenuací na pvneém bodě v prostoru který rovnoměrně distribuuje světlo všemi směry směrem od zdroje světla.

PointLight()

Vytváří a inicializuje bodové světlo s následujícími hodnotami:

lightOn = true

color (1, 1, 1)

position (0, 0, 0)

attenuation (1, 0, 0)

PointLight(Color3f color, Point3f position, Point3f attenuation)

Vytváří a inicializuje bodové světlo, které je zapnuté.

PointLight(boolean, lightOn, Color3f color, Point3f position, Point3f attenuation)

Vytváří a inicializuje bodové světlo

Metody třídy PointLight

Více metod lze nalézt v dokumentaci ke třídě Light

void setAttenuation(Point3f attenuation)

Nastavuje aktuální hodnotu atenuace světla. Tři hodnoty v objektu Point3f definují konstantní, lineární a kvadratický koeficient:

atenuace = 1 / konstantní + lineární * vzdálenost + kvadratický * vzdálenost2

kde vzdálenost je hodnota měřená od zdroje světla ke stínovanému vertexu.

void setAttenuation(float constant, float linear, float quadratic)

nastavuje aktuální hodnoty atenuace světla. Viz rovnice výše.

void setPosition(Point3f position)

Nastavuje pozici světla

void setPosition(float x, float y, float z)

nastavuje pozici světla

Vlastnosti třídy PointLight

K vlastnostem zděděným od Light mají objekty DirectionalLight jednu navíc:

¨

ALLOW_POSITION_READ | WRITE

ALLOW_ATTENUATION_READ | WRITE


Stejně jako směrová světla se bodová světla podílí na modelu osvětlování jen difúzní a zrcadlovou složkou. Pro tyto odrazy hraje velkou roli geometrie vizuálního objektu. Stínování vizuálního objektu se mění v závislosti na umístění bodového světla.

Reflektorové světlo

Třída Spotlight je podtřídou třídy PointLight. Tato třída rozšiřuje bodové světlo o směr a velikost kuželu (koncentraci) světla. Objekty této třídy mohou tvořit například světelné zdroje jako je baterka, lampa a ostatní zdroje se stínítky anebo čočkami.

Intenzita světla reflektorového světla vytváří světlo které se šíří v určitém úhlu a směru od zdroje. Pokud se vertex nalézá mimo tento kužel, pak není osvětlen. Uvnitř kuželu se intenzita světla liší v závislosti na vzdálenosti a úhlu daného vertexu.