Látható felület meghatározása
  Kétváltozós függvények ábrázolása

A látható felszín meghatározására szolgáló általános algoritmusok

Látható felszín algoritmusok

LÁTHATÓ FELÜLET MEGHATÁROZÁSA


Adott 3D tárgyak egy halmaza, és egy projekció specifikációja. Mely vonalak és felületek lesznek láthatóak? (Melyek lesznek takarva?)

nehéz feladat (időigényes)

Kétféle megközelítés:

1. for minden képpontra do
    begin
     határozzuk meg azt a tárgyat, amelyet a nézőpontból a 
     képponton keresztül húzott egyenes a legközelebb metsz; 
     rajzoljuk ki a képpontot a megfelelő színben
    end
          
szükséges idő: O(np)           n: tárgyak száma
  p: képpontok száma
2. for minden tárgyra do
    begin
     határozzuk meg a tárgynak azokat a részeit, amelyek 
     nincsenek takarásban saját maga vagy más tárgyak miatt;
     a kiválasztott részeket rajzoljuk ki a megfelelő színben
end
szükséges idő: O(n2)

Kétváltozós fügvények ábrázolása

(plotterrel)

y = f (x,z)


Tegyük fel, hogy f-et egy m x n-es Y mátrixszal közelíthetjük.

Drótvázas rajzot készíthetünk szakaszonként lineáris görbéket előállítva x és z irányban is.

Keressünk olyan algoritmust, amely a takart vonalakat nem rajzolja ki:

1. Ha csak az x-tengellyel párhuzamos egyenesek menti értékeket kötjük össze:

Haladjunk elölről hátra (a távolabbi vonalak irányába, ekkor csak arra kell vigyázni, hogy a már megrajzolt látható felületeket ne "keresztezzük".
Elegendő az eddig rajzolt vonalak "sziluettjét" őrizni; csak az látható az új vonalból, ami ez alatt vagy fölött van.
Tároljuk minden törésponthoz a maximális és minimális y értékét az eddig rajzolt vonalaknak (sziluett) - horizont-vonal algoritmus, és az új vonal y értékeinek megfelelően módosítsuk.

Ha az új vonal valamely szakaszának mindkét végpontja láthatatlan, akkor a szakasz sem látszik.
A részlegesen takart szakaszoknál metszéspontot kell számolni.
2. Ha csak a z-tengellyel párhuzamos egyenesek menti értékeket kötjük össze:






            
      hasonló algoritmus


Drótvázas rajz konstans x- és z-menti görbékből


Nem lehet egyszerűen egymásra rakni a két képet





Először a vonalakat, amelyek közel párhuzamosak a vetítési síkkal, azokat ugyanolyan sorrendben rajzoljuk, mint korábban (közelről távolra haladva), de az erre merőleges irányú vonalakat szakaszonként rajzoljuk (közelről távolra haladva) ugyanazt a sziluettet használva.


(ezek az eljárások csak akkor használhatók, ha a rajzolandó vonalak x = konstans
vagy z = konstans menti értékekből állnak)

A látható felszín meghatározására szolgáló általános algoritmusok:

Nehéz probléma: pl. tárgyak vetületei takarják-e egymást? Mely tárgy marad látható?

Pontokra:

Adott P1 = ( x1 ,y1 ,z1 ) és P2 = ( x2 ,y2 ,z2 );
Takarja-e egyik a másikat?

Ha ugyanazon a vetítési sugáron vannak, akkor a közelebbi takarja a másikat;
Különben nem takarják egymást

Mélységbeli összehasonlítás

(helye: a normalizálási trafó után, ekkor)

  1. parallel vetítésnél: a vetítési sugarak párhuzamosak a z-tengellyel, ekkor P1 és P2 ugyanazon a vetítési sugáron van, ha x1 = x2 és y1 = y2.
  2. perspektív vetítésnél: a vetítési sugarak COV-ből indulnak ki, ekkor P1 és P2 ugyanazon a vetítési sugáron van, ha

perspektív vetítésnél használjuk azt a trafót, amivel a perspektív kanonikus térfogatot átvittük parallel kanonikus térfogatba (mint a 3D tárgyak vágásánál).

Ekkor a vetítési sugarak már párhuzamosak a z-tengellyel. A megfelelő trafó mátrixa:


Ez egyesíthető a normalizálási trafóval:

M · Nper

És utána elvégezhető a vágás (homogén koordinátákkal) stb.

Tárgyak kiterjedése, határoló téglalapok, testek

Határoló-téglalap teszt:

ha a határoló téglalapok nem fedik egymást, akkor a vetületek sem fedik egymást
(különben további vizsgálat szükséges)

1-dimenziós kiterjedés (határidő intervallum):


          
használható annak eldöntésekor, hogy a két tárgy takarja-e egymást

minmax-teszt:

a kiterjedés minimális és maximális értékeinek összehasonlításával döntjük el a takarást

kiterjedés meghatározása: a tárgy (csúcs)pontjai koordinátáinak min. és max. értékeiből

Hátsó lapok kiválogatása

Tfh.: a tárgy poligon határú síklapokkal határolt és a síklapoknak a tárgyból kifelé mutató normálisai adottak.

Ekkor azok a lapok, amelyek normálisai a "megfigyelőtől"  ellentétes irányba mutatnak, nem láthatóak

azonosításuk:

 n : normális (nx ,ny ,nz )
 v : COV-ből a poligon tetsz. pontjába mutat
ha      n · v < 0 előre néz
  > 0 hátra néz
  = 0 csak az éle látszik


speciálisan: ha perspektív trafó vagy ortografikus vetítés az (x,y) síkra, akkor

nz  < 0   hátra néz
> 0   előre néz
= 0   csak az éle látszik

Térbeli partícionálás

Észrevétel: nem minden tárgynak van minden vetítési sugárral metszéspontja
(pl. távol vannak, más irány) osszuk fel (partícionáljuk) a képernyőt





meghatározzuk, hogy mely tárgyak vetülete van benne a megfelelő részben (partícióban) és csak azokkal keresünk metszéspontokat
(ez jó módszer, ha a tárgyak vetületei egyenletesen oszlanak el a teljes képernyőn, különben különböző méretű partíciókat érdemes készíteni: kisebb partíciók ott, ahol több tárgy vetülete van)

Hierarchikus struktúrák alkalmazása

pl.

ha a vetítési sugár nem metszi az épületet, akkor az emeleteit és az emeletek lakásait sem (tehát nem kell vizsgálni azokat)

Látható felszín algoritmusok

Z - buffer vagy mélység - buffer algoritmus
                        (kép alapú)

F: kép-buffer (képpontok tárolására)
kezdeti értéke: háttérszín
Z: mélység-buffer (minden pontban a megfelelő z-érték),
kezdeti értéke: 0 (hátsó vágási sík)

pásztázás közben F-be és Z-be bekerül az új pont, ha nincs messzebb, mint az eddigi z-érték.

tulajdonságai:

  1. nincs tárgyak rendezése, összehasonlítása, metszéspontok számítása
  2. poligonokként végezhető el, "poligonok összeadása",
  3. nem csak poligonokra jó,
  4. nagy helyigény, de lehet sávonként haladni,
  5. könnyű implementálni,
  6. könnyű egy újabb tárgy képét hozzávenni és utána elvenni (maszkolás)
  7. a z-értékek felhasználhatók terület és térfogat számításra
Lista-prioritás algoritmusok

meghatározzák a tárgyaknak azt a sorrendjét, ami a kép kirajzolásához kell.

pl.:

ha z-irányban nincs átfedés, akkor a tárgyakat növekvő z-értékük szerint kell rendeznünk (és utána megjeleníteni: távolról közelre haladva)

néha még akkor is lehet ilyen sorrendet megadni, ha z-irányban van átfedés

néha nem:





ekkor szétvágjuk a tárgyakat és a darabokat rendezzük sorba

1. Mélység szerint rendező algoritmus

lépések:

  1. rendezzük a poligonokat legtávolabbi z-koordinátájuk szerint
  2. vágjuk szét az átfedő poligonokat (ha szükséges)
  3. pásztázzunk minden poligont hátulról előre haladva

Ha minden poligon egy síkkal párhuzamos, akkor a 2. lépés kimaradhat festő algoritmus

tfh.:  P poligon legtávolabbi z-koordinátája szerint a lista végén van.
Pásztázás előtt össze kell hasonlítani a lista azon Q elemeivel, amelyeknek z irányú kiterjedése átfedi P z-irányú kiterjedését, és meg kell vizsgálni, hogy

P átfedi-e Q-t?

1. ha P és Q x-kiterjedései nem átfedőek, akkor nem;

különben
2. ha P és Q y-kiterjedései nem átfedőek, akkor nem;

különben
3. ha COV-ből nézve P a Q másik oldalán van, akkor nem;

különben
4. ha COV-ből nézve Q teljesen P-nek ugyanazon az oldalán van, akkor nem;

különben
5. ha P és Q (x,y)-síkra való vetületei nem átfedőek, akkor nem

különben (hátha Q-t kell előbb rajzolni):

3' ha COV-ből nézve Q a P sík másik oldalán van,
akkor P Q csere

4' ha COV-ből nézve P teljesen Q-nak ugyanazon az oldalán van,
akkor P Q csere

különben P-t vagy Q-t fel kell darabolni a másik síkkal és a darabokat beilleszteni a listába

végtelen ciklus lenne, ezért jelöljük meg azokat a poligonokat, amiket egyszer már a lista végére raktunk és ha újra előjönnek, akkor daraboljunk

2. Bináris tér-partícionáló fa algoritmus

ötlet: ha van olyan sík, amely a tárgyakat (teljes egészükben) két féltérbe osztja, akkor a COV-t tartalmazó féltér tárgyait nem takarhatják el a másik féltér tárgyai

BSP fa: csomópontok - poligonok (darabjai)
bal oldalra: azok a poligonok, amelyek elöl vannak
(később kell rajzolni),
jobb oldalra: azok a poligonok, amelyek hátul vannak
(korábban kell rajzolni)

a csomóponthoz tartozó poligon síkjával darabolhatjuk a többi poligont és azok darabjaival folytathatjuk a fát

Pásztázó vonal algoritmus látható felszín meghatározására
      (hasonló a poligonok kitöltését végző algoritmushoz)


most több poligon lehet
ÉT (élek táblázata):
a poligonok nem vízszintes éleit tartalmazza (a vízszinteseket kihagyjuk)
rendezve -  az élek kisebbik y-koordinátája szerint,
ezen belül az élek meredeksége szerint
egy elem részei:
 - a kisebb y-koordinátájú csúcspont x-koordinátája
 - a másik csúcspont y-koordinátája
- x növekménye:
 - poligon azonosító
PT (poligonok táblázata):
egy elem részei:
- azonosító
- együtthatók (Ax + By + Cz + D = O sík-egyenlete)
- árnyalati/színezési információ
- ki-be jelző (kezdeti érték: ki)


ÉT: AB PT: ABC
AC DEF
FD
FE
CB
DE


AÉT (aktív élek táblázata):
indul  balról jobbra, alulról felfelé haladva
 AB, AC ABC "be"-kapcsolva
AB-től AC-ig minden színezhető
AB, AC, FD, FE
ABC DEF
be ki be ki
AB, DE, CB, FE
ABC
be ki
DEF
be ki
síkok egyenletéből dönthető el, hogy melyik van közelebb



ha a poligonokat felvágjuk a metszeteik mentén, akkor nem kell minden pontban megvizsgálni a poligonok sorrendjét, elegendő csak ha egy "takaró" poligon véget ér.

Terület-osztó algoritmus látható felszín meghatározására

"oszd meg és uralkodj" elv:
ha egy területen könnyen eldönthető, hogy melyik poligon jeleníthető meg, akkor azt rajzoljuk ki, különben osszuk fel a területet és alkalmazzuk ugyanezt az eljárást a rész-területekre

4 lehetőség egy poligon és egy téglalap alakú terület között:

tartalmazó poligon
metsző poligon
tartalmazott poligon
idegen poligon

Mikor dönthető el könnyen, hogy mi rajzolható?

1. minden poligon idegen a területtől (háttér)
2. egyetlen metsző vagy tartalmazott poligon (háttér+pásztázással poligon)
3. egyetlen tartalmazó poligon (poligon színével rajz)
4. van olyan tartalmazó poligon, amelyik a többi előtt van.




Vissza a lap tetejére