3D
alapok:
Ez a cikk azoknak lehet hasznos akik szeretnek
megerteni hogy is mukodnek a 3D-s programok. Egeszen az alapoktol megprobalom
bemutatni a lenyeget.
Tulajdonkeppen egy Szoftveres render egyseget
fogunk megvalositani.
Minimalis melysegig megyek csak bele a
matematikai kepletekbe, inkabb csak leirom oket es a hasznalatukat. /akit
jobban erdekel az persze utana nezhet pl. a wikipedian/.
A sorrendben igyekszem ugy haladni ahogy
felepul a kimeneti kep, mas sorrendben haladva mas eredmenyt kapunk!
Csapjunkj bele:
1.
3D vilag es objektumok
Vegyunk egy X,Y,Z tengelyu koordinatarendszert
ez a vilagunk alapja.
Gyakorlai okobol az objektumok altalaban
haromszogekbol epulnek fel.
/Negyszogbol nem ninden alak epitheto fel szepen pl. kor/
Ezert most tegyunk bele egy haromszoget a
vilagunkba.
A,B,C a haromszog csucspontjai.
Ezek a koordinatarendszer x,y,z pontjain helyeykednek el.
Pl.
A(0,0,0) + V(1,0,0) = A’ (1,0,0)
Ez kicsit nehezebb dio , de az alabbi keplet segitsegevel ez is
megoldodik.
Forgassuk el a harom tengely menten 180 fokkal.
xan=180 yan=180 zan=180
Matematikailag:
xan,yan,zan = elforgatasi szogek a 3 tengely menten
x,y,z = a haromszog egy csucsanak
koordinatai a terben
Minden csucsponton elvegezve a muveletet
megkapjuk a haromszogunk uj helyzetet.
A(x,y), B(x,y), C(x,y)
xt = X * cos(Zan) - Y * sin(Zan)
yt = X * sin(Zan) + Y * cos(Zan)
X = xt
Y = yt
yt = Y * cos(Xan) - Z * sin(Xan)
zt = Y * sin(Xan) + Z * cos(Xan)
Z = zt
xt = X * cos(Yan) - Z * sin(Yan)
zt = X * sin(Yan) + Z * cos(Yan)
X = xt
Z = zt
A’(x,y), B’(x,y), C’(x,y)
Fontos megemliteni hogy a ket muvelet elvegzesenek sorrendje nem mindegy!
Ha elobb eltoljuk es utana forgatjuk, olyan
lesz mintha a mi helyzetunk valtozna,
ellenkezo esetben pedig a targy fog
mozogni.
Ezzel mar tetszoleges helyzetbol tudjuk
szemlelni vilagunkat.
Egy gyors pelda hogy lassuk gyakorlatban is.
Inditsuk el a Feladat1-et, mellekeve van a
forraskod is vb-ben.
Most mar meg tudunk jeleniteni es mozgatni
drotvazas targyakat, azonban mivel atlatszoak,
a hatso oldaluk is mejelenik, mit lehet tenni
hogy ezt elkeruljuk?
Azt szeretnek hogy csak azok a haromszogek
rajzolodjanak ki , amiket szembol latunk, amik
hattal vannak nekunk azok nem.
Ezt a csucspontok korbejarasi iranyaval
donthetjuk el ami lehet az oramutatoval megegyezo es ellentetes iranyu.
Mi az ellenkezo iranyut vesszuk lathatonak, de
lehetne forditva is.
Fontos hogy a modellek eszerint keszuljenek!
A kovetkezo keplet szerint ha n negativ akkor hattal van nekunk igy nem kell kirajzolni.
n = (A.Y - C.Y) * (B.X - A.X) - (A.X - C.X) * (B.Y - A.Y)
Ezzel az eljarassal nem csak valosagosabb lesz
a megjelenites, de jelentos idot is sporolhatunk
Mivel csak kb feleannyi haromszoget kell
kirajzolni.
Fontos hogy csak zart, egyszerubb
alakzatok eseten alkalmazhato hibamentesen.
A valosaghu abrazolasmodhoz elengedthetetlen a
perspektivikus vetulet, vagyis hogy a tavolabbi dolgok kisebbnek
latszanak.Enelkul nem tudjuk erzekelni a teret megfeleloen.
Ehhez a mar 2D re vetitett adatokon kell
valtoztatast vegezni, kozvetlenul a kirajzolas elott.
Gyakorlatilag elosztjuk a pontjaink X es Y
ertekeket a hozza tartozo Z tavolsag adattal.
A z erteket egy allandoval szorozva
beallithatjuk a kivant hatast.
A’(x, y) = A(x/z, y/z)
B’(x, y) = B(x/z, y/z)
C’(x, y) = C(x/z, y/z)
Tehat a pontunk minel tavolabb lesz, annal
kozelebb fog esni az origo-hoz, vagyis kepernyonk kozepehez.
A ket kepen ugyanazt a kockat latjuk perspektivikusan es anelkul.
Ezzel a drotvazas modellezest mar szepen meg
tudjuk valositani.
A kovetkezo reszzben kitoltjuk a poligonokat.