« 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^