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)
- 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.
- 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:
- nincs tárgyak rendezése, összehasonlítása, metszéspontok számítása
- poligonokként végezhető el, "poligonok összeadása",
- nem csak poligonokra jó,
- nagy helyigény, de lehet sávonként haladni,
- könnyű implementálni,
- könnyű egy újabb tárgy képét hozzávenni és utána elvenni (maszkolás)
- 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:
- rendezzük a poligonokat legtávolabbi z-koordinátájuk szerint
- vágjuk szét az átfedő poligonokat (ha szükséges)
- 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
|