Sunteți pe pagina 1din 6

Tehnici de programare

grafică 3D

Scris de Ciprian Lefter - ianuarie 2001

      Subiectele vor fi structurate în două: prima va fi de Tehnici de programare grafică 3D


(implementarea matematică a obiectelor pe ecran) şi a doua se va numi Platforme şi tehnologii
(în principal vom vorbi despre DirectX în care vom lucra). Totul pe parcursul a două trei numere
şi apoi vom trece la implementarea propriu zisă a joculeţului nostru.

Tehnici de programare grafică 3D

      Vom face acum analogia între conceptele de bază 3D cum ar fi punctele, poligoanele şi
transformările şi implementarea lor în C++. Mai sunt descrise şi alte concepte mult mai
complexe cum ar fi luminile şi texturile.

Punctele

      Punctele sunt locaţii în spaţiu care nu au masă, suprafaţa sau volum. Punctele descriu unde
este ceva în spaţiu. De exemplu, un pătrat poate fi descris de punctele (1,1) (1,0) (0,0) (0,1).
Aceste puncte au un corespondent pe axa X şi unul pe axa Y. Aceste puncte sunt descrise în două
dimensiuni. Pentru reprezentarea 3D mai avem nevoie de o dimensiune pe axa Z. Deci un punct
3D are o reprezentare de forma (x, y, z). Ca exemplu luăm un cub "unitate" care este definit de
punctele (1,1,0) (1,0,0) (0,0,0) (0,1,0) (1,1,1) (1,0,1) (0,0,1) (0,1,1). În C, reprezentarea care ar
defini un asemenea punct ar fi:

typedef struct point_3d


{
float x, y, z;
};

      Pe ecran aceste puncte sunt altfel definite. În primul rând memoria


video nu este ca o foaie de hârtie. Diferenţa majoră este aceea că axa y
este "cu capul în jos", originea (0, 0) este sus în colţul din stânga ca în
imaginea de mai jos.
      Astfel pentru a afla coordonatele unui punct 2D (în coordonatele
descrise iniţial cu axa y în sus) trebuie să facem următoarele calcule:

new.y = -old.y + (screen_height / 2)


new.x = old.x + (screen_heigh / 2)

Matrici
      Matricile sunt moduri convenabile de a stoca date. Sunt simple "tabele de numere" cu
coloane şi linii. Sunt foarte folositoare, aşa cum vedem din secţiunea următoare - transformări.
Matricile se pot aduna, scădea sau înmulţi. Un punct 3D poate fi stocat într-o matrice de genul [x
y z 1].

      În C o matrice poate fi de genul unui tablou:

float a[2][2];
Reguli ale matricilor (Adunarea şi scăderea, Înmulţirea, Matricea unitate)

Adunarea şi scăderea:

      Se adună şi se scad toate elementele corespondente.

Exemplu:
[A B] [E F]
[C D] + [G H] =

[(A + E) (B + F)]
[(C + D) (D + H)]

Exemplu:
[2 3] + [3 -1]
[1 4] [5 6] =

[2 + 3] [3 +(-1)]
[1 + 5] [4 + 6]
Rezultat
[5 2]
[6 10]
Înmulţirea matricilor:

      Înmulţirea este un pic mai grea dar o dată învăţată nu mai sunt probleme. Coloanele matricii
A trebuie să fie egale cu liniile din matricea B pentru ca înmulţirea să aibă loc. Formula de bază
este linii ori coloane. Dar mai bine vedeţi exemplul de mai jos:

Exemplu:
[A B] [E F]
[C D] x [G H] =

[(A x E) + (B x G) (A x F) + (B x H)]
[(C x E) + (D x G) (C x F) + (D x H)]
Exemplu:
[2 3] [5 6]
[1 2] x [3 0] =

[(2 x 5) + (3 x 3) (2 x 6) + (3 x 0)]
[(1 x 5) + (2 x 3) (1 x 6) + (2 x 0)]
Rezultat
[19 12]
[11 6]
Matricea unitate:

      Această matrice este folositoare pentru că orice matrice înmulţită cu ea dă acelaşi lucru. La
matricea unitate diagonala principală este umplută cu valori de 1.

[1 0]
[0 1]
Exemplu:
[5 10] [1 0]
[6 4] x [0 1] =

[(5 x 1) +(10 x 0) (5 x 0) +(10 x 1)]


[(6 x 1) + (4 x 0) (6 x 0) + (4 x 1)]
Rezultat:
[5 10]
[6 4]
Transformările

      Transformările sunt modurile de a muta punctele matematic. Punctele pot fi scalate, rotite sau
translate. Matricile sunt folositoare pentru acest lucru pentru că un punct poate fi rotit, scalat sau
translat cu ajutorul unei singure matrici. Pentru combinarea mai multor transformări într-o
singură matrice, trebuie doar înmulţite matricile (ordinea înmulţirii contează). Se multiplică
matricea transformării cu matricea pentru acel punct. Matricea punct este în forma [x y z 1].

Matricea pentru
Tipuri de transformări:
transformare:
Translaţia - mutarea [1 0 0 0]
x = x + tx [0 1 0 0]
y = y + ty [0 0 1 0]
z = z + tz [tx ty tz 1]
Scalarea: mărirea, micşorarea [sx 0 0 0]
x = x * sx [0 sy 0 0]
y = y * sy [0 0 sz 0]
z = z * sz [0 0 0 1]
Rotaţia: [cosq sinq 0 0]
roll - rotirea în jurul axei
[-sinq cosq 0 0]
Z:
[0 0 0 0]
x' = x * cosq - y * sinq
[0 0 0 0]
y' = x * sinq + y * cosq
pitch - rotirea în jurul axei [0 0 0 0]
X: [0 cosq -sinq 0]
z' = z * cosq - y * sinq [0 sinq cosq 0]
y' = z * sinq + y * cosq [0 0 0 0]
yaw - rotirea în jurul axei Y: [cosq 0 sinq 0]
[0 0 0 0]
x' = x * cosq - z * sinq [-sinq 0 cosq 0]
z' = x * sinq + z * cosq [0 0 0 0]
rotirea în jurul unei axe arbitrare cu un vector (x, y, z)
[x2 + cosq(1 - x2) xy(1 - cosq) - zsinq xz(1 - cosq) + ysinq 0]
[xy(1-cosq)+zsinq y2 + cosq(1 - y2) yz(1 - cosq) - xsinq 0]
[xz(1-cosq)-ysinq yz(1 - cosq) + xsinq z2 + cosq(1 - z2) 0]
[0 0 0 0]

      Puteţi încerca pe cele scrise mai sus să scrieţi mici progrămele care să facă ceva. De
exemplu, să rotiţi un punct făcând un ceas (puneţi ca secundar un punct şi rotiţi-l (formulele le
aveţi), simplu, nu?).
      Data viitoare în capitolul tehnici de programare grafică 3D - proiecţie, lumini (cum cad
luminile pe obiecte), structura unui obiect 3D, exemplu pe un obiect (un cub) - mişcare, rotire
etc.

Partea I - Platforme şi tehnologii

      Subiectul din numărul acesta este unul mai mult de ordin general. Deşi nu conţine cod,
articolul de faţă este foarte important pentru înţelegerea viitoare a ceea ce voi face. Dacă ce este
scris aici nu vă satisface încercaţi help-ul de la MSDN - DirectX.
      Noile implementări în domeniul graficii tridimensionale se bazează pe folosirea unor funcţii
grafice puse la punct fie de anumite firme, fie de comunitatea largă a programatorilor. Cele mai
răspândite la ora actuală sunt tehnologiile: GLIDE implementat de firma 3DFX, Direct3D al
firmei Microsoft, şi OpenGL.
      Pentru proiectul de faţă am optat pentru folosirea pachetului DirectX al firmei Microsoft.
Grupul de tehnologii din DirectX fac dintr-un sistem Windows o platformă ideală pentru rularea
aplicaţiilor cu conţinut multimedia bogat, sunet sourround, animaţii 3D sau grafică full-color.
Scopul principal declarat este promovarea jocurilor PC pentru mediul Windows, care până nu
demult erau într-o mare proporţie pentru DOS. Una din cele mai însemnate facilităţi este faptul
că programatorii nu trebuie să se mai concentreze asupra dezvoltării suportului pentru diferite
componente, ci pot să îşi mute centrul atenţiei asupra aplicaţiei efective, fără a pierde timp cu
accesul direct hardware şi fără ca diversele implementări hardware să constituie o problemă.
DirectX este practic o interfaţă consistentă între hardware şi aplicaţie, reducând complexitatea
instalării şi configurării şi folosind la maxim facilităţile disponibile. Prin aceasta orice program
care îl foloseşte are acces la funcţiile plăcilor acceleratoare, la componentele Plug&Play şi la
serviciile de comunicare disponibile în Windows.
      DirectX constă dintr-un set de componente axate pe diferite sarcini. Toate componentele au
câte un rol foarte bine definit, pe care îl îndeplinesc cât mai bine posibil.
      Pentru afişare, DirectDraw accelerează tehnicile de animaţie folosind accesul direct la
imaginile din memoria video neafişată şi la operaţiile de blitting şi buffer-flipping disponibile în
hardware. Când sunt necesare imagini tridimensionale, Direct3D asigură accesul la plăcile
grafice capabile de operaţii 3D. Acesta oferă dezvoltatorilor două interfeţe: Retained Mode,
concepută în ideea uşurinţei în folosire şi Imediate Mode, pentru programarea de nivel scăzut,
foarte aproape de lucrul cu acceleratorul 3D, care bine înţeles că este esenţial în folosirea acestei
componente.
      La manipularea sunetului intervine DirectSound, care implementează mixarea şi playback-ul
din hardware şi software. Specializată în muzică este componenta DirectMusic, prezentă
începând cu DirectX6.1, care este dedicată înregistrării şi redării sunetelor digitale, lucrând cu
date muzicale bazate pe mesaje.
      DirectInput furnizează o interfaţă către dispozitivele folosite de utilizator, suportate la ora
actuală fiind mouse-ul, tastatura, joystick-urile şi mecanismele force feedback.
      Devenind din ce în ce mai populare în ultimul timp, jocurile multiplayer sunt bazate pe
DirectPlay, care asigură interconectarea sistemelor cu ajutorul unui modem sau al unei conexiuni
de reţea şi oferă suport pentru diferite protocoale.
      Toate aceste componente lucrează împreună pentru a asigura o bază fiecărui joc de Windows
şi pentru a-i oferi un suport adecvat la funcţiile disponibile în hardware. Cea mai puţin vizibilă
de către utilizator dintre toate componentele este DirectSetup care facilitează instalarea DirectX,
fără ca programatorul să fie obligat să verifice diferite versiuni ale fişierelor instalate şi fără să
fie nevoie de vreo intervenţie a utilizatorului.

2.3 Direct3D Immediate Mode (Modul imediat)

      Interfaţa de programare a aplicaţiilor (API) Direct3D Immediate Mode este parte integrantă
din componentele grafice ale DirectX.
      Direct3D este proiectat pentru a facilita cele mai bune jocuri şi grafica interactivă,
tridimensională, pe un calculator pe care rulează Microsoft Windows. Facilitând accesul direct la
video-display-ul 3-D, Direct3D este o interfaţă pentru hard-ul 3-D.
      Direct3D are două moduri: Immediate Mode (modul imediat) şi Retained Mode (modul
reţinut). Retained Mode este un mod de nivel înalt pentru programatorii care vor implementarea
rapidă sau care vor ajutor pentru suportul Retained Mode pentru ierarhii şi animaţii.
      Direct3D Immediate Mode este un 3-D API de nivel jos care este ideal pentru programatori
care au nevoie să poată plasa jocurile şi alte aplicaţii multimedia pe sistemul de operare
Windows. Immediate Mode este o cale independentă de dispozitiv pentru aplicaţii de a comunica
cu acceleratorul hard la nivel jos. Direct3D Retained Mode este construit imediat "deasupra"
Immediate Mode-ului.
      Acestea sunt câteva din facilităţile avansate ale Direct3D :

 Buffere de adancime care se pot schimba (z-buffers sau w-buffers)


 Umbrire flat sau Gouraud
 Multiple surse şi tipuri de lumină
 Suport pentru texturi, inclusiv mipmapping
 Drivere de emulare software puternice
 Transformări şi clipping
 Independenţa de hard
 Suport pentru sistemele de oeprare Windows, 95, 98, 2000
 Suport pentru arhitectura Intel MMX

      Programatorii care folosesc Immediate Mode în loc de Retained Mode sunt de obicei mai
experimentaţi în programare şi de asemenea experimentaţi în grafica 3-D. Cea mai bună sursă de
informaţie Despre Immediate Mode sunt sursele (exemplele) din documentaţia de la DirectX,
care ilustrează cum se pune Direct3D Immediate Mode la lucru în aplicaţii reale.

2.3.2 De ce se foloseşte Direct3D Immediate Mode?


      Imediate Mode este bazat pe punctele de intersecţie a unghiurilor, poligoane şi comenzi de
control pentru acestea. Permite accesul direct pentru transformări, lumini. Dacă hard-ul nu este
prezent pentru a accelera, Direct3D oferă o bază robustă pentru emulări soft. Programatorii care
folosesc aplicaţiile 3-D existente şi cei care au nevoie să atingă performanţe maxime menţinând
o legătură subţire între aplicaţii şi hard trebuie să folosească Immediate Mode în loc de Retained
Mode.
      Direct3D Immediate Mode oferă metode simple şi directe pentru a seta o scenă 3-D. Cheia
setului acesta de metode sunt descrise de metode ca DrawPrimitive; ele dau posibilitatea
aplicaţiilor de a desena unul sau mai multe obiecte într-o scenă cu o singură apelare de metodă.
      Immediate Mode permite o legătură low-overhead cu hard-ul 3-D. Această conexiune vine cu
un preţ trebuie de dat semnale explicite pentru transformări şi lumini, trebuie date toate matricile
necesare, şi trebuie determinat ce fel de hard este prezent şi ce capabilităţi are. Data viitoare veţi
avea parte şi de cod.

S-ar putea să vă placă și