Viditeľnosť
Viditeľnosť Ak sa v scéne nachádza viacero objektov, nie všetky z nich, resp. nie všetky ich časti musia byť viditeľné. Cieľom algoritmov pre riešenie viditeľnosti je nájdenie tých objektov alebo ich častí, ktoré sú viditeľné z miesta pozorovateľa. Niekedy môže byť cieľom algoritmu nájsť aj zakryté časti, ktoré sa môžu zobraziť iným spôsobom ako viditeľné časti, napr. čiarkovanou čiarou a pod.
Algoritmy pre viditeľnosť Podľa výstupu, ktorý poskytujú, sa algoritmy pre viditeľnosť delia do dvoch skupín: 1. Líniové algoritmy (HLE – hidden line elimination) – ich výstupom je súbor úsečiek, predstavujúcich viditeľné hrany alebo ich časti. Úsečky sú dané koncovými bodmi, a preto je možné výsledný útvar ľubovoľne škálovať a zobrazovať v rôznych rozlíšeniach. Tento algoritmus môže vracať aj zakryté hrany a časti hrán. 2. Rastrové algoritmy (HSE – hidden surface elimination) – tieto algoritmy pracujú v rastri. Výsledkom je obraz, t.j. množina pixelov, kde každý pixel obsahuje farbu niektorej viditeľnej plochy alebo pozadia. Takéto algoritmy vykresľujú aj tieňované plochy, ale výsledný obraz má pevnú veľkosť.
Algoritmy pre viditeľnosť Algoritmy môžeme rozdeliť, podľa toho, či primárne pracujú s objektami v scéne alebo priamo s jednotlivými pixelmi: 1. Objektovo orientované algoritmy – algoritmus postupne prechádza všetky objekty a zisťuje, ktoré ich časti sú viditeľné. Robí to tak, že vyhodnocuje vzájomnú polohu so všetkými ostatnými objektami. Ak je v scéne n objektov, zložitosť takéhoto algoritmu je n2. Ak je objektov veľa, tento postup prestáva byť efektívny, preto sa v praxi používa len zriedka. 2. Obrazovo orientované algoritmy – tieto algoritmy postupne prechádzajú všetkými pixelmi obrazu a hľadajú objekt, ktorý je v danom pixeli vidieť, čiže je najbližšie k pozorovateľovi. Ak n je počet objektov a p je počet pixelov obrazu, tak zložitosť takéhoto algoritmu je n.p.
Odvrátené plochy Takmer všetky algoritmy pre viditeľnosť zisťujú, či plocha, ktorou sa budú zaoberať, nie je odvrátená od pozorovateľa. Takéto plochy sú určite neviditeľné. Odvrátenosť plochy sa určuje na základe jej vonkajšej normály: Ak táto normála zviera s polohovým vektorom pozorovateľa ostrý uhol, tak je plocha privrátená. Ak je uhol medzi vektorom pozorovateľa a normálovým vektorom tupý alebo pravý, tak je plocha odvrátená. Uhol normálového vektora n a vektora pozorovateľa v určíme zo skalárneho súčinu. Platí: n.v=|n|.|v|.cos Z toho dostaneme: cos=n.v/(|n|.|v|) Ak je cos>0, tak uhol je ostrý, v opačnom prípade je pravý alebo tupý. pozorovateľ n1 n2 privrátená strana odvrátená strana
Hrany a viditeľnosť Z hľadiska viditeľnosti rozlišujeme v objekte tri typy hrán: predná hrana je hrana, ktorá susedí s dvomi privrátenými plochami zadná hrana susedí s dvomi odvrátenými plochami obrysová hrana susedí s jednou privrátenou a jednou odvrátenou plochou obrysová hrana predná hrana zadná hrana
Líniové algoritmy Robertsov algoritmus Predpokladajme, že máme v scéne n mnohostenov Mi, i=1...n. Postupne budeme testovať všetky ich hrany a zisťovať, aká je ich viditeľnosť. 1. Rozdeľ hrany na zadné, obrysové a predné, zadnými sa už nezaoberaj 2. Vytvor zoznam V potenciálne viditeľných hrán. 3. Opakuj pre všetky obrysové a predné hrany Hj: 1. Pridaj hranu Hj do zoznamu V 2. Opakuj pre všetky mnohosteny Mi: 1. Opakuj pre všetky hrany Hk zo zoznamu V: 1. Vyber hranu Hk zo zoznamu 2. Zisti, či mnohosten Mi zakrýva hranu Hk 3. Ak sú na Hk nejaké nezakryté úseky, zaraď ich do zoznamu V, inak sa už hranou nezaoberaj 3. Vykresli všetky hrany zo zoznamu V a vyprázdni ho
Líniové algoritmy M3 M2 M1 A B C D E Popíšeme si priebeh algoritmu pre hranu AB 1. AB sa uloží do zoznamu V 2. Testujeme mnohosten M1: 1. Vyberieme AB z V 2. M1 hranu AB nezakrýva, vložíme AB do V, V={AB} 3. Testujeme mnohosten M2: 2. M2 hranu AB zakrýva, ostanú viditeľné úseky AD, EB, ktoré sa pridajú do V, V={AD,EB} 4. Testujeme mnohosten M3: 1. Vyberieme AD z V, M3 AD zakrýva, viditeľný je úsek CD 2. Vyberieme EB z V, M3 EB nezakrýva 3. Vložíme CD a EB do V, V={CD,EB} 5. Vykreslíme CD a EB, vyprázdnime V
Líniové algoritmy V praktickej implementácii pracujeme najčastejšie s priemetmi telies, pričom si pamätáme aj pôvodné priestorové umiestnenie objektov, resp. ich hrán. Stačí, ak pri danej hrane skúmame, či ju pretínajú obrysové hrany (resp. ich priemety) telies, ktoré ležia bližšie k pozorovateľovi. Len obrysové hrany môžu mať vplyv na zmenu viditeľnosti skúmaného telesa.
Rastrové algoritmy 1. Pamäť hĺbky (z-buffer) Jedná sa o výrazne najpoužívanejšiu metódu, ktorá síce kladie vysoké nároky na pamäť, ale zároveň pracuje veľmi rýchlo. Základom metódy z-buffer je dvojrozmerné pole, ktorého rozmery sa rovnajú veľkosti obrazu, ktorý ideme vykresliť. Pracuje sa s priemetmi objektov. Do jedného bodu 2D obrazu sa môže premietnuť niekoľko bodov rôznych objektov. Zapamätá sa farba toho bodu, ktorý pôvodne ležal najbližšie k pozorovateľovi.
Rastrové algoritmy Algoritmus z-buffer zapíšeme takto: Vytvor dvojrozmerné pole F s rozmermi obrazu pre ukladanie farieb bodov Vytvor dvojrozmerné pole Z s rozmermi obrazu pre ukladanie hĺbky (z-ovej súradnice) Zapíš do každého bodu F farbu pozadia a do každého bodu Z - Opakuj pre všetky plochy v scéne: Opakuj pre všetky body (xi,yi,zi) plochy: Ak je prvok Z[xi,yi]<zi, tak: Z[xi,yi]=zi do F[xi,yi] ulož farbu bodu (xi,yi,zi) //bod (xi,yi,zi) danej plochy je bližšie k pozorovateľovi ako //posledný zapamätaný bod
Rastrové algoritmy 2. Riadková pamäť hĺbky (scanline z-buffer) V tomto prípade nemáme vytvorený pamäťový priestor vo veľkosti celého obrazu, ale spracovávame vždy len jeden riadok, v ktorom určujeme viditeľnosť jednotlivých objektov, resp. ich plôch. Po vyriešení viditeľnosti daný riadok vykreslíme. Tento postup je výhodnejší vzhľadom na pamäť, ale keďže sa každá plocha spracováva viackrát, časové nároky sa zvyšujú.
Rastrové algoritmy Algoritmus scanline z-buffer: Vytvor jednorozmerné polia F a Z s dĺžkou jedného riadka obrazu Pre každý riadok obrazu so súradnicou y=yi opakuj: Naplň pole F farbou pozadia a pole Z hodnotou - Pre každú plochu opakuj: Pre všetky body plochy (xi,yi,zi), ktoré ležia v danom riadku obrazu, opakuj: Ak je prvok Z[xi]<zi, tak: Z[xi]=zi do F[xi] ulož farbu bodu (xi,yi,zi) Vykresli riadok
Rastrové algoritmy 3. Maliarov algoritmus Tento algoritmus pracuje podobne ako maliar, ktorý najprv vykresľuje pozadie a postupne ho prekresľuje objektami, ktoré sú v popredí. Algoritmus najskôr vykresľuje plochy, ktoré sú najviac vzadu a postupne ich prekrýva plochami, ktoré sú bližšie k pozorovateľovi.
Rastrové algoritmy Podstatou maliarovho algoritmu je teda usporiadanie plôch podľa vzdialenosti od pozorovateľa, teda v podstate podľa z-ovej súradnice. 1. Usporiadame plochy podľa minimálnej z-ovej súradnice zmin. Toto usporiadanie nám uľahčí prácu, ale takýto zoznam ešte nemôžeme vykresliť, pretože plocha v menšou súradnicou zmin môže prekryť plochu, ktorá má túto súradnicu vyššiu. z pohľad zhora pohľad spredu
Rastrové algoritmy 2. Testujeme vzájomné polohy plôch. Začneme od prvej plochy v zozname, teda tej, ktorá má najmenšiu súradnicu zmin. Označme ju P1 a jej najmenšiu a najväčšiu z-ovú súradnicu z1min a z1max. Testujeme jej polohu vzhľadom na nasledujúcu plochu P2 so z-ovými súradnicami z2min a z2max. Ak je splnená niektorá z nasledujúcich podmienok, tak plocha P1 je jednoznačne za plochou P2: I. z1max<z2min V tomto prípade je plocha P1 celá za plochou P2 a teda aj za ostatnými plochami a môže sa rovno vykresliť. z P1 P2 z1max z2min
Rastrové algoritmy II. Priemety plôch P1 a P2 sa neprekrývajú. z P2 P1 III. Všetky vrcholy P1 ležia v polpriestore určenom plochou P2, ktorý je odvrátený od pozorovateľa. z P1 P2 z P1 P2
Rastrové algoritmy IV. Všetky vrcholy plochy P2 ležia v polpriestore určenom plochou P1, ktorý je privrátený v pozorovateľovi. z P1 P2 Ak je splnená podmienka I, plocha P1 sa rovno vykreslí. Ak sú splnené podmienky II, III, IV, tak plocha P1 je za plochou P2, ale musí sa otestovať vzhľadom na ostatné plochy. Až keď sa ukáže, že je za všetkými ostatnými, môže sa vykresliť. Ak sa ukáže, že plocha P1 nie je tá, ktorá je za všetkými ostatnými, musíme nájsť inú plochu, ktorá má túto vlastnosť. Po jej vykreslení sa môžeme znovu vrátiť k ploche P1 a testovať ju vzhľadom na ostatné nevykreslené plochy.
Rastrové algoritmy Maliarov algoritmus má tú nevýhodu, že na základe uvedených testov sa nemusí dať vždy jednoznačne určiť poradie plôch. V takom prípade si môžeme pomôcť tým, že rozdelíme plochy na menšie časti, alebo sa uspokojíme s chybami pri určovaní viditeľnosti, ktoré pri veľkom množstve plôch malej veľkosti nemusia byť veľmi závažné.
Rastrové algoritmy 4. Warnockov algoritmus delenia okna Tento algoritmus je založený na rekurzívnom delení okna a určovaní viditeľnosti v jeho menších častiach. Zápis algoritmu pre okno so súradnicami xmin, ymin, xmax, ymax môže vyzerať takto: Funkcia Vykresli(x1,y1,x2,y2) A. Ak do obdĺžnika daného súradnicami x1,y1,x2,y2 nezasahuje žiadny objekt, vyplň ho farbou pozadia. B. Ak do obdĺžnika zasahuje len jedna plocha, vyplň časť obdĺžnika farbou plochy a zvyšok farbou pozadia. C. Ak do obdĺžnika zasahuje viac plôch, ale jedna z nich prekrýva všetky ostatné, vyplň časť obdĺžnika farbou danej plochy a zvyšok farbou pozadia. D. Ak je situácia v okne zložitejšia, rozdeľ obdĺžnik na 4 rovnaké časti (rezmi cez stred) a vykonaj funkciu Vykresli pre tieto 4 časti. Vykresli(xmin,ymin,xmax,ymax)
Rastrové algoritmy Príklad: Vykreslime Warnockovým algoritmom nasledujúci obrázok: A B C D B A D B C