« Előző oldal- - - ^Tartalom^



3D GRAFIKA: (GM 6-tól)

A GM egy 2-dimenziós és izometrikus (olyan alakzatok, amelyek felül és oldalt látszanak) játékok készítésére alkalmas program. Ezen kívül van még néhány lehetőség 3-dimenziós grafika készítésére. Mindenekelőtt azonban néhány dolgot meg kell értenünk.

- Áttérés 3D-re:

A 3D mód használatához először a GM-t kell 3D módba állítani. Később vissza lehet kapcsolni 2D módba. A következő két függvény létezik erre:
d3d_start() - a 3D mód használatának kezdése.
d3d_end() - a 3D mód használatának befejezése.

Jegyezzük meg, hogy minden 3D-ben használatos függvény d3d_-vel kezdődik.

A 3D mód kezdése a következő változásokat eredményezi. Mindenekelőtt bekapcsolódik a rejtett felszín eltávolítás (egy 16 bites z-buffer használatával). Ez azt jelenti, hogy minden képpont a képernyőn a legkisebb z-értékkel (=mélység érték) rajzolódik ki. Előre nem látható, hogy az azonos mélységi szintű tárgyakkal mi történik, és ez csúnya hatásokat eredményezhet. Bizonyosodjunk meg arról, hogy azok a példányok nincsenek azonos mélységi szinten, amelyek átfedésbe kerülhetnek egymással!

Másodszor, a normális kivetítés felcserélődik egy térszerűvel. Ez a következőt jelenti. Normális esetben a példányok mérete a képernyőn független a mélységüktől, míg egy térszerűen megjelenített példány nagyobb mélysége kisebb méretű megjelenést eredményez. Amikor a mélység 0, az egyenlő a régi mérettel (hacsak meg nem változtatjuk a kivetítést; lásd lentebb). A nézőpont a kamera számára a szoba fölötti távolságon helyeződik el. (Ez a távolság egyenlő a szoba szélességével, ami egy elfogadható alap kivetítést ad.) Csak a kamera előtti példányok rajzolódnak ki. Ezért ne használjunk 0-nál kisebb mélységű példányokat (vagy legalább ne legyen kisebb, mint -w, ahol w a szoba vagy a nézet szélessége).

Harmadszor, a függőleges y-koordináta megváltozik. Míg normálisan a (0,0) helyzet a nézet bal felső részén van, addig 3D módban a bal alsó részen.

A következő függvényekkel a rejtett felszín eltávolítás és a térszerű kivetítés kapcsolható ki és be:
d3d_set_hidden(eng) - a rejtett felszín eltávolítás engedélyezése (true) vagy tiltása (false).
d3d_set_perspective(eng) - a térszerű kivetítés engedélyezése (true) vagy tiltása (false).

- Könnyű rajzolni:

A 3D módba való átkapcsolás után a GM ugyanúgy használható, mint azelőtt (a fejezet elején lévő megjegyzésekben leírtak kivételével). Csak a tárgyak jelennek meg eltérő méretben a mélységi beállításuk alapján. A nézetek is ugyanúgy használhatók. Egy kiegészítő függvény lehet hasznos. Ha számos dolog rajzolását határozzuk meg egy kódban, előfordulhat, hogy meg akarjuk változtatni a mélység értékét a primitívek között. Erre a következő függvény használható:
d3d_set_depth(melyseg) - a rajzoláshoz használt mélység beállítása.

Jegyezzük meg, hogy abban a pillanatban egy új példány kirajzolódik, a mélység pedig újra beállítódik annak a példánynak a mélységére.

- Sokszögek rajzolása 3D-ben:

A régi módszer szerinti rajzolással az a gond, hogy egy kép vagy sokszög mindig xy-síkban fekszik, vagyis az összes sarok azonos mélységi szinten van. Valódi 3D-nél azt akarjuk, hogy a csúcsok mélysége eltérő legyen. Mostantól z-koordinátáról fogunk beszélni mélység helyett, így (x,y,z)-ként határozzuk meg a koordinátákat. Ehhez különleges változatai vannak a fejlettebb rajzolófüggvényeknek:
d3d_primitive_begin(fajta) - a jelölt fajtájú (pr_pointlist, pr_linelist, pr_linestrip, pr_trianglelist, pr_trianglestrip, pr_trianglefan) primitív kezdése.
d3d_vertex(x,y,z) - csúcspont adása a primitívhez, a már beállított színt és alfaértéket használva.
d3d_vertex_color(x,y,z,szin,alfa) - csúcspont adása a primitívhez, saját színnel és alfaértékkel. Ez lehetővé teszi egyenletesen változó szín- és alfaértékű primitívek létrehozását.
d3d_primitive_end() - a primitív meghatározásának vége. Ez a függvény ki is rajzolja azt.

Például tetraéder (háromoldalú piramis) rajzolásához, ami a z=0 síklapon áll és a teteje z=200-nál, a következő kód használható:
{
d3d_primitive_begin(pr_trianglelist);
d3d_vertex(100,100,0);
d3d_vertex(100,200,0);
d3d_vertex(150,150,200);
d3d_vertex(100,200,0);
d3d_vertex(200,200,0);
d3d_vertex(150,150,200);
d3d_vertex(200,200,0);
d3d_vertex(100,100,0);
d3d_vertex(150,150,200);
d3d_vertex(100,100,0);
d3d_vertex(100,200,0);
d3d_vertex(200,200,0);
d3d_primitive_end();
}

Ha ezt használjuk, akkor valószínűleg csak egy háromszöget látunk a képernyőn, mert a tetraéder teteje a nézőpont mögött lesz. Ezenkívül csak egy színt használva nehéz megkülönböztetni a különböző oldalakat. Az alábbiakban láthatunk módszereket a nézőpont megváltoztatására. Színeket hozzárendelni a csúcspontok közötti draw_set_color(szin) függvény hívása előtt lehet.

Textúrázott sokszögeket is lehet használni 3D-ben. Ez pontosan úgy működik, ahogy a fejlettebb rajzolási függvényeknél le van írva, de most az alapfüggvények 3D-s változatára van szükség. Egyvalamivel kell tisztában lenni. Egy textúrában a (0,0) hely a bal fölső sarok. De gyakran, kivetítések használatakor a bal alsó sarok a (0,0). Ezesetben függőlegesen tükrözni kell a textúrát.

d3d_primitive_begin_texture(fajta,texid) - a jelölt fajtájú 3D primitív kezdése a megadott textúrával.
d3d_vertex_texture(x,y,z,xtex,ytex) - csúcspont (x,y,z) adása a primitívhez az xtex,ytex helyre a textúrában, keverve a már beállított színnel és alfaértékkel.
d3d_vertex_texture_color(x,y,z,xtex,ytex,szin,alfa) - csúcspont (x,y,z) adása a primitívhez az xtex,ytex helyre a textúrában, keverve a megadott színnel és alfaértékkel.
d3d_primitive_end() - a primitív meghatározásának vége. Ez a függvény ki is rajzolja azt.

Így például a következő kód használható egy háttérkép kirajzolására:
{
var ttt;
ttt = background_get_texture(hatter);
d3d_primitive_begin_texture(pr_trianglefan,ttt);
d3d_vertex_texture(0,480,0,0,0);
d3d_vertex_texture(640,480,0,1,0);
d3d_vertex_texture(640,480,1000,1,1);
d3d_vertex_texture(0,480,1000,0,1);
d3d_primitive_end();
}

Egy háromszögnek van elő és hátoldala. Az az előoldal, ahol a csúcspontok az óramutató járásával ellentétes rend szerint vannak meghatározva. Normálisan mindkét oldal kirajzolódik, de egy zárt alakzat készítésekor ez felesleges, mert a hátsó része soha nem látszik. Ilyen esetben bekapcsolható a hátsó rész kiszedése. Ez a kirajzolási idő felét megtakarítja, de ránk hagyja a sokszögeink pontos meghatározásának feladatát. A következő függvény létezik:
d3d_set_culling(kiv) - a hátsó rész kiszedésének kezdése (true) vagy befejezése (false).

- Alap formák rajzolása:

Számos függvény létezik alap formák (pl. kockák és falak) rajzolására. Jegyezzük meg, hogy ezek az alakok a hátsó rész kiszedés bekapcsolt állapota esetén működnek megfelelően.

d3d_draw_block(x1,y1,z1,x2,y2,z2,texid,vism,fism) - egy kocka rajzolása az éppen használt színnel, a jelölt szemközti sarkokkal, a jelölt textúrával. Ha nem használunk textúrát, akkor a texid értékének a -1-et adjuk. A vism jelzi, hogy hányszor kell megismételni a textúrát az oldalak vízszintes széle mentén. A fism ugyanez a függőleges szélekkel.
d3d_draw_cylinder(x1,y1,z1,x2,y2,z2,texid,vism,fism,zart,lepesek) - egy függőlegesen álló henger rajzolása az éppen használt színnel, a jelölt foglalatba, a jelölt textúrát használva. Ha nem használunk textúrát, akkor a texid értékének a -1-et adjuk A vism jelzi, hogy hányszor kell megismételni a textúrát az oldalak vízszintes széle mentén. A fism ugyanez a függőleges szélekkel. A zart jelzi, hogy a henger zárt legyen-e a tetejénél és az aljánál. A lepesek paraméter azt jelzi, hogy mennyi forgatási lépés használt. Egy jellemző érték a 24.
d3d_draw_cone(x1,y1,z1,x2,y2,z2,texid,vism,fism,zart,lepesek) - egy függőlegesen álló kúp rajzolása az éppen használt színnel, a jelölt foglalatba, a jelölt textúrát használva. Ha nem használunk textúrát, akkor a texid értékének a -1-et adjuk A vism jelzi, hogy hányszor kell megismételni a textúrát az oldalak vízszintes széle mentén. A fism ugyanez a függőleges szélekkel. A zart jelzi, hogy a henger zárt legyen-e a tetejénél és az aljánál. A lepesek paraméter azt jelzi, hogy mennyi forgatási lépés használt. Egy jellemző érték a 24. GM 6.1-től.
d3d_draw_ellipsoid(x1,y1,z1,x2,y2,z2,texid,vism,fism,lepesek) - egy ellipszoid (tojás alakú test) rajzolása az éppen használt színnel, a jelölt foglalatba, a jelölt textúrát használva. Ha nem használunk textúrát, akkor a texid értékének a -1-et adjuk A vism jelzi, hogy hányszor kell megismételni a textúrát az oldalak vízszintes széle mentén. A fism ugyanez a függőleges szélekkel. A zart jelzi, hogy a henger zárt legyen-e a tetejénél és az aljánál. A lepesek paraméter azt jelzi, hogy mennyi forgatási lépés használt. Egy jellemző érték a 24.
d3d_draw_wall(x1,y1,z1,x2,y2,z2,texid,vism,fism) - egy függőleges fal rajzolása az éppen használt színnel, az adott sarkokkal, használva a jelölt textúrát. Ha nem használunk textúrát, akkor a texid értékének a -1-et adjuk A vism jelzi, hogy hányszor kell megismételni a textúrát az oldalak vízszintes széle mentén. A fism ugyanez a függőleges szélekkel.
d3d_draw_floor(x1,y1,z1,x2,y2,z2,texid,vism,fism) - egy (megdöntött) padlózat rajzolása az éppen használt színnel, az adott sarkokkal, használva a jelölt textúrát. Ha nem használunk textúrát, akkor a texid értékének a -1-et adjuk A vism jelzi, hogy hányszor kell megismételni a textúrát az oldalak vízszintes széle mentén. A fism ugyanez a függőleges szélekkel.

A következő kód két kockát rajzol:
{
var ttt;
ttt = background_get_texture(hatter);
d3d_draw_block(20,20,20,80,40,200,ttt,1,1);
d3d_draw_block(200,300,-10,240,340,100,ttt,1,1);
}

- A világ megtekintése:

Alapértelmezés szerint a negatív z-tengely mentén nézünk a szoba közepe felé. A 3D játékokban gyakran meg akarjuk változtatni, hogy merre nézünk. Például egy első személyű lövöldözős játékban (first person shooter=FPS) gyakran meg kell változtatni, hogy a kamera merre irányuljon. A grafikát tekintve be kell állítani a megfelelő kivetítést. Két függvény létezik a nézés irányának megváltoztatására.
d3d_set_projection(xinnen,yinnen,zinnen,xide,yide,zide,xfel,yfel,zfel) - a nézés irányának meghatározása. Megadható az a pont ahonnan, és az, amerre nézünk, valamint a fölfelé vektor.

Ehhez a függvényhez szükséges némi magyarázat. A kivetítés beállításához először arra a helyre van szükség, ahonnan nézünk. Ez van megjelölve az (xinnen,yinnen,zinnen) paraméterekkel. Ezután meg kell határozni azt az irányt, amerre nézünk. Ez a második pont az (xide,yide,zide) paraméterekkel van megadva. Végül el kell forgatni a kamerát a nézőpontból arra, amerre nézünk. Ennek meghatározására kell adni egy fölfelé vektort, amely irány az utolsó három (xfel,yfel,zfel) paraméterrel van megadva. Például az xy-sík mentén való kitekintésre egy első személyű lövöldözős játékban használható a következő kód:
{
d3d_set_projection(100,100,10,200,100,10,0,0,1);
}

Ezzel a (100,100) pontból nézünk a (200,100) pontba, 10-zel a sík felett. Hogy ezt némileg bonyolultabbá tegyük, egy tárgy példányát rendeljük hozzá a szobához, ami majd meghatározza a kamera helyzetét. Lesz egy pillanatnyi (x,y) helye és egy iránya (és talán sebessége). Ezt meg lehet határozni mint kamerát, a következő kóddal:
{
with (obj_camera)
d3d_set_projection(x,y,10,
x+cos(direction*pi/180),y-sin(direction*pi/180),10,
0,0,1);
}

Ez talán egy kissé bonyolultnak néz ki. Az (x,y) kamerahelyzetből nézünk, 10-zel a föld felett. Egy pont meghatározásához a helyes irányban szükségünk van egy kis számtanra. Ez a pont a következő három paraméterrel van jelölve. Végül használjuk a föl vektort, ahogy fentebb már említettük.

Egy fontos megjegyzés! Mikor a GM elkezd rajzolni egy szobát, visszaállítja a nézőpontot az alapértelmezett helyre. Így az első dolog beállítani a kívánt kivetítést, mikor kirajzolódik a látvány. Ennek a rajzolás eseményben kell történnie!

Az előbbi függvénynek van egy bővített változata is:
d3d_set_projection_ext(xinnen,yinnen,zinnen,xide,yide,zide,xfel,yfel,zfel,szog,fekves,zkozel,ztavol) - a már leírtakon kívül itt megadható a látómezőt meghatározó szög, a fekvés aránya a nézet vízszintes és függőleges mérete között, valamint a közeli és távoli levágó síkok.
Az újabb paraméterek a következőképpen működnek. A kamera helyzete, a nézés iránya és a föl vektor meghatározásán túl beállítható a kamera lencséjének szélessége is. Ezt nevezzük látómezőnek. Egy ésszerű érték a 45 fok, és ez van alapértelmezettnek is beállítva. De ha akarjuk, akkor megváltoztathatjuk. A következő, hogy meg lehet határozni a fekvés arányát a nézet vízszintes és függőleges mérete között. Normális esetben a szoba vagy a nézet arányához hasonlóan akarjuk használni, pl. 640/480. Végül megadhatók a közeli és távoli levágó síkok. A zkozel értéknél közelebb lévő tárgyak nem rajzolódnak ki, ahogyan a ztavol értékénél távolabbiak sem. Fontos ezen paraméterek ésszerű értékre való állítása, mert befolyásolják a z-összahasonlítások pontosságát. Túl nagy határérték esetén a pontosság rosszabb lesz. Alapértelmezettként 1-es és 32000-et használunk. A zkozel értékének 0-nál nagyobbnak kell lennie!

Néha átmenetileg szükséges a normál kivetítés, ami a 3D módon kívül használt. Ehhez használhatók a következő függvények:
d3d_set_projection_ortho(x,y,sz,m,szog) - a normál derékszögű kivetítés beállítása a szobában a jelölt területre, a jelölt szöggel átforgatva.
d3d_set_projection_perspective(x,y,sz,m,szog) - a normál távlati kivetítés beállítása a szobában a jelölt területre, a jelölt szöggel átforgatva. GM 6.1-től.

Ez például a pontszám kirajzolásánál használatos. Átmenetileg a rejtett felszín eltávolítást is ki kell kapcsolni, mert nem kell figyelembevenni a pillanatnyi mélységértéket. A következő példa a pontszám kirajzolásával mutatja ezt be:
{
draw_set_color(c_black);
d3d_set_projection_ortho(0,0,room_width,room_height,0);
d3d_set_hidden(false);
draw_text(10,10,'Pont: ' + string(score));
d3d_set_hidden(true);
}

- Átalakítások:

Az átalakítások lehetővé teszik annak a helynek a megváltoztatását, ahol a dolgok kirajzolódnak a világban. Például a kockákat rajzoló függvény csak párhuzamos tengelyű kockákat tud rajzolni. Az első beállítással, a forgatási átalakítással létrehozhatók elforgatott kockák. A képek is mindig az xy-síkkal párhuzamosan rajzolódnak ki, de az átalakítás beállításával ez megváltoztatható. Kétféle függvények vannak: amelyek beállítják az átalakítást és amelyek hozzáadnak átalakítást.

d3d_transform_set_identity() - az átalakítás azonosra állítása (vagyis nincs átalakítás).
d3d_transform_set_translation(xf,yf,zf) - az átalakítás beállítása a jelölt vektorral való forgatásra.
d3d_transform_set_scaling(xm,ym,zm) - az átalakítás beállítása a jelölt értékekkel való méretezésre.
d3d_transform_set_rotation_x(szog) - az átalakítás beállítása az x-tengely körül a jelölt értékkel való elforgatásra.
d3d_transform_set_rotation_y(szog) - az átalakítás beállítása az y-tengely körül a jelölt értékkel való elforgatásra.
d3d_transform_set_rotation_z(szog) - az átalakítás beállítása az z-tengely körül a jelölt értékkel való elforgatásra.
d3d_transform_set_rotation_axis(xt,yt,zt,szog) - az átalakítás beállítása a tengelyek körül a jelölt értékkel való elforgatásra.
d3d_transform_add_translation(xf,yf,zf) - a jelölt vektorral való forgatás hozzáadása.
d3d_transform_add_scaling(xm,ym,zm) - a jelölt értékekkel való méretezés hozzáadása.
d3d_transform_add_rotation_x(szog) - a jelölt értékkel az x-tengely körüli elforgatás hozzáadása.
d3d_transform_add_rotation_y(szog) - a jelölt értékkel az y-tengely körüli elforgatás hozzáadása.
d3d_transform_add_rotation_z(szog) - a jelölt értékkel az z-tengely körüli elforgatás hozzáadása.
d3d_transform_add_rotation_axis(xt,yt,zt,szog) - a jelölt értékkel a tengelyek körüli elforgatás hozzáadása.

Jegyezzük meg, hogy a forgatás és a méretezés a világ eredetéhez viszonyított, és nem ahhoz a tárgyéhoz, amelyhez kirajzolódik. Ha a tárgy nem az eredetnél van, akkor elmozdul egy másik helyre, ami nem az, amit akarunk. Így például egy tárgy elforgatásához a saját x-tengelye mentén először el kell fordítani az eredetbe, aztán elforgatni, majd visszafordítani a helyére.

A következő példák jobban érthetővé teszik ezt. Van egy kép (kep), amit a 100,100,10 helyre akarunk kirajzolni. Ehhez a következő kódot használhatjuk:
{
d3d_transform_set_translation(100,100,10);
draw_sprite(kep,0,0,0);
d3d_transform_set_identity();
}

Jegyezzük meg, hogy mivel fordítást használunk, most a 0,0 helyre kell a képet kirajzolni. (Ez hozzárendeli a jelenlegi példányt a 0 mélységhez! Ha nem vagyunk biztosak benne, akkor először állítsuk be a mélységet.) Ha használjuk ezt az FPS játékunkban, akkor a képet nem látjuk. Ennek az az oka, hogy még párhuzamos az xy-síkkal, ezért szükséges egy forgatás hozzáadása. Emlékezzünk a sorrendre: először forgatjuk a képet, aztán fordítjuk. Ezért a következő kódot használhatjuk:
{
d3d_transform_set_identity();
d3d_transform_add_rotation_x(90);
d3d_transform_add_translation(100,100,10);
draw_sprite(kep,0,0,0);
d3d_transform_set_identity();
}

Néha átmenetileg el akarjuk menteni a pillanatnyi átalakítást, például egy hozzáadó átalakítás megadása, majd a régi visszatöltése esetén (ez gyakran történik rangsorolt modellek esetén). Erre a célra a pillanatnyi átalakítás elhelyezhető egy veremben, majd később kivehető onnan. A következő függvények léteznek erre:
d3d_transform_stack_clear() - az átalakítások vermének törlése.
d3d_transform_stack_empty() - visszaadja, hogy az átalakítások verme üres-e.
d3d_transform_stack_push() - a pillanatnyi átalakítás berakása a verembe. Visszatér, hogy volt-e hely a veremben az elhelyezésre (ha elfeledkezünk az átalakítások kivételéről, akkor egy bizonyos időpontban elfogy a hely a veremben).
d3d_transform_stack_pop() - a verem tetején lévő átalakítás kivétele és jelenleginek való beállítása. Visszatér, hogy volt-e átalakítás a veremben.
d3d_transform_stack_top() - a verem tetején lévő átalakítást állítja be a jelenleginek, de nem veszi ki a veremből. Visszatér, hogy volt-e átalakítás a veremben.
d3d_transform_stack_discard() - kiveszi a veremből a tetején lévő átalakítást, de nem állítja be jelenleginek. Visszatér, hogy volt-e átalakítás a veremben.

Az átalakítások használata erőteljes lehetőség, de legyünk óvatosak és mindig állítsuk vissza az átalakítást az eredetire, ha végeztünk vele.

- Köd:

A köd használatos a 3D játékokban arra, hogy a távoli tárgyak homályosan vagy egyenletesen eltűnőnek látszódjanak. Ez segít a légkör megalkotásában és lehetővé teszi, hogy a távoli tárgyak ne rajzolódjanak ki.
d3d_set_fog(eng,szin,kezdete,vege) - a köd használatának engedélyezése vagy tiltása. A szin jelzi a köd színét, a kezdete pedig azt a távolságot, amelynél kezdődnie kell. A vege jelzi azt a távolságot, amelynél a köd a legnagyobb, és többé semmi sem látszódik.

Hogy jobban megértsük, mi történik, valójában kétfajta köd van: tábla és csúcspont alapú köd. Az első típus pixel alapú értékeken számítja a ködöt, míg a második minden csúcspontra számítja, aztán közbeszúrja ezeket. Az első típus jobb, de nem mindig támogatott. A GM megpróbálja a tábla alapú ködöt használni, mikor támogatott, különben csúcspont alapú ködöt használ (hacsak nincs támogatva köd). Jegyezzük meg, hogy bizonyos grafikus kártyák jelzik, hogy tudják kezelni a tábla alapú ködöt, de felkínálják a lehetőséget a felhasználónak, hogy ezt kikapcsolják a beállításokban (advanced display settings). Ebben az esetben az eredmény egy fekete képernyő lehet!

- Megvilágítás:

A függvényekkel kirajzolt tájak eléggé laposnak néznek ki, mert nincs fény. A szín, ha az oldalak egyenlőek, független a tájolástól. A még élethűbb kinézetű tájak létrehozásához engedélyezni kell a megvilágítást, és el kell helyezni a fényeket a megfelelő helyekre. A megfelelően megvilágított tájak elkészítése nem könnyű, de a hatás nagyon szép.

A megvilágítás engedélyezésére a következő függvény használható:
d3d_set_lighting(eng) - a megvilágítás engedélyezése vagy tiltása.

Megvilágítás használatakor egy sokszög minden csúcsa számára a szín meghatározott. A belső képpontok színe ezen csúcsok színén alapul. Két módon lehet ezt megcsinálni: az egyik, hogy az egész sokszög azonos színt kap, vagy hogy a szín egyenletesen szúródik be végig a sokszögön. Alapértelmezés szerint az egyenletes árnyékolás használt. Ez a következő függvénnyel változtatható meg:
d3d_set_shading(egyenletes) - az egyenletes árnyékolás legyen-e a használt, vagy nem.

A megvilágítás használatához nyilvánvalóan meg kell határozni a fényeket. Két különböző fény létezik: közvetlen fények (mint a nap) és pozicionált fények. A fénynek van egy színe.(Csak a szórt fénnyel foglalkozunk.) A következő függvények léteznek fények meghatározására és használatára:
d3d_light_define_direction(ind,xir,yir,zir,szin) - egy közvetlen fény meghatározása. Az ind a fény indexe (kis, pozitív számot adjunk meg). Xir,yir,zir a fény iránya, szin a színe (ehhez gyakran a c_white használt). Ez a függvény még nem kapcsolja be a fényt.
d3d_light_define_point(ind,x,y,z,terj,szin) - egy pontfény meghatározása. Az ind a fény indexe (kis, pozitív számot adjunk meg). X,y,z a fény iránya. A terj azt a távolságot jelzi, amelyre a fénysugarak kiterjednek. Túl ezen a fényerősség csökkeni fog. A szin a fény színe. Ez a függvény még nem kapcsolja be a fényt.
d3d_light_enable(ind,eng) - engedélyezése (true) vagy tiltása (false) az ind jelű fénynek.

Egy tárgy által visszavert fény a fényirány és a felszín közötti szögtől, vagyis a felszíntől elmutató vektortól függ. A megvilágított tárgyakkal kapcsolatban tehát nemcsak a csúcsok helyzetéről, hanem azok szabályosságáról is gondoskodni kell. Az következő négy függvény felhasználható a primitívek csúcsainak meghatározására:
d3d_vertex_normal(x,y,z,szx,szy,szz) - csúcs (x,y,z) adása a primitívhez, szabályos vektorral (szx,szy,szz).
d3d_vertex_normal_color(x,y,z,szx,szy,szz,szin,alfa) - csúcs adása a primitívhez, szabályos vektorral, és saját színnel és alfaértékkel.
d3d_vertex_normal_texture(x,y,z,szx,szy,szz,xtex,ytex) - csúcs adása a primitívhez, szabályos vektorral az xtex,ytex helyre a textúrában, keverve a már beállított színnel és alfaértékkel.
d3d_vertex_normal_texture_color(x,y,z,szx,szy,szz,xtex,ytex,szin,alfa) - csúcs adása a primitívhez, szabályos vektorral az xtex,ytex helyre a textúrában, keverve a saját színnel és alfaértékkel.

Az kirajzolt alap alakzatok szabályossága önműködően beállítódik.

- Modellek létrehozása: (GM 6.1-től)

Amikor nagy modellek rajzolása szükséges, akkor eléggé erőforrásigényes az összes rajzolófüggvény hívása újra és újra minden lépésben. Ezt elkerülendő létre lehet hozni modelleket. Egy modell számos rajzolási primitívet és alakot tartalmaz. Ha egy modell létrejött, akkor különféle helyekre lehet kirajzolni egyetlen függvényhívással. Ezenkívül a modelleket fájlból is be lehet tölteni, vagy elmenthetők egy fájlba.

Az ezzel kapcsolatos függvények bemutatása előtt pár szó egy fontos kérdésről: a textúrák kezeléséről. Mint ahogy ezelőtt már le volt írva, a textúrákat képekből és hátterekből kapjuk. A textúrák indexe különböző lehet az egyes időpontokban. Emiatt a modellek nem tartalmaznak minden textúrainformációt. Csak egy modell megrajzolásakor adhatunk meg textúrát. Így egy modellben csak egy textúrát használhatunk. Ha több textúrára van szükség, akkor azokat egybe kell kombinálni (és gondosan kezelni a textúrakoordinátákat), vagy többszörös modelleket kell használni. Ennek az az előnye, hogy könnyedén lehet rajzolni ugyanazt a modellt különböző textúrákkal.

A következő függvények léteznek modellek létrehozására, mentésére, betöltésére és rajzolására:

d3d_model_create() - létrehoz egy új modellt, és visszatér az indexével. Ez az index használandó az összes többi modellkezelő függvényben.
d3d_model_destroy(ind) - megsemmisíti az adott indexű modellt, és felszabadítja az általa használt memóriát.
d3d_model_clear(ind) - törli az adott indexű modellt, eltávolítja az összes primitívjét.
d3d_model_save(ind,fnev) - elmenti a modellt az adott fájlba.
d3d_model_load(ind,fnev) - betölti a modellt az adott fájlból.
d3d_model_draw(ind,x,y,z,texid) - kirajzolja a modellt x,y,z helyre. A texid a használt textúra, amelynek értéke -1, ha nincs textúra. Ha forgatni vagy méretezni akarjuk a modellt, akkor ehhez a fentebb már említett transzformációs rutinokat kell alkalmaznunk.

Minden primitív függvénynek van egy megfelelője egy modell hozzáadásához. A függvényeknek ugyanolyan argumentumaik vannak mint korábban, kivéve hogy mindegyiknél az első argumentum a modell indexe, és nincs textúrainformáció.

d3d_model_primitive_begin(ind, fajta) - egy 3D primitív hozzáadása a jelölt fajta (pr_pointlist, pr_linelist, pr_linestrip, pr_trianglelist, pr_trianglestrip, pr_trianglefan) modelléhez.
d3d_model_vertex(ind,x,y,z) - csúcspont hozzáadása a modellhez.
d3d_model_vertex_color(ind,x,y,z,szin,alfa) - csúcspont (x,y,z) adása a modellhez, saját színnel és alfaértékkel.
d3d_model_vertex_texture(ind,x,y,z,xtex,ytex) - csúcspont adása a modellhez az xtex,ytex helyre a textúrában.
d3d_model_vertex_texture_color(ind,x,y,z,xtex,ytex,szin,alfa) - csúcspont adása a modellhez textúrával és színértékkel.
d3d_model_vertex_normal(ind,x,y,z,nx,ny,nz) - csúcspont adása a modellhez normál vektorral (nx,ny,nz).
d3d_model_vertex_normal_color(ind,x,y,z,nx,ny,nz,szin,alfa) - csúcspont adása a modellhez normál vektorral, saját színnel és alfaértékkel.
d3d_model_vertex_normal_texture(ind,x,y,z,nx,ny,nz,xtex,ytex) - csúcspont adása a modellhez normál vektorral és textúrapozícióval.
d3d_model_vertex_normal_texture_color(ind,x,y,z,nx,ny,nz,xtex,ytex,szin,alfa) - csúcspont adása a modellhez normál vektorral, textúrával és színértékkel.
d3d_model_primitive_end(ind) - a primitív meghatározásának vége a modellben.

A primitíveken kívül alap formákat is lehet adni a modellekhez. A függvények itt is majdnem ugyanolyanok, de van modellindex és hiányzik a textúrainformáció.

d3d_model_block(ind,x1,y1,z1,x2,y2,z2,vism,fism) - egy kocka alak hozzáadása a modellhez.
d3d_model_cylinder(ind,x1,y1,z1,x2,y2,z2,vism,fism,zart,lepesek) - egy henger alak hozzáadása a modellhez.
d3d_model_cone(x1,y1,z1,x2,y2,z2,vism,fism,zart,lepesek) - egy kúp alak hozzáadása a modellhez.
d3d_model_ellipsoid(ind,x1,y1,z1,x2,y2,z2,vism,fism,lepesek) - egy ellipszis alak hozzáadása a modellhez.
d3d_model_wall(ind,x1,y1,z1,x2,y2,z2,vism,fism) - egy fal alak hozzáadása a modellhez.
d3d_model_floor(ind,x1,y1,z1,x2,y2,z2,vism,fism) - egy padló alak hozzáadása a modellhez.

A modellek használata jelentősen felgyorsíthatja a 3D játék grafikáját, és akármennyiszer használhatjuk.

- Záró szavak:

A 3D függvények a GM-ben néhány szép 3D-s játék elkészítésére használhatók. De működésük eléggé korlátozott és még jónéhány tennivaló marad ránk. Ne gondoljuk, hogy majd saját Quake-et készítünk velük. A GM megmaradt elsődlegesen 2-dimenziós játékok készítésére való programnak.

« Előző oldal- - - ^Tartalom^