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.

 

Transzlacio /eltolas/

A legegyszerubb muvelet, az az elmozdulasi tengely iranynak megfeleloen hozzaadjuk vagy kivonjuk az elmozdulas erteket a csucspontok azonos koordinatajabol.


 


Pl.

A(0,0,0) + V(1,0,0) = A (1,0,0)

 

Rotacio /elforgatas/

 

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)

Y = yt

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?

 

BackFace Culling Face /hatlap eldobas/

 

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.

 

 

 

 

 

 

 

Perspektiva

 

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.