This is an old revision of the document!
In cadrul acestei teme veti avea de implementat un joc aproape in totalitate la alegere :) , dar care trebuie sa contina un set de elemente vizuale obligatorii. Mai jos, aveti descrierea acestor elemente vizuale, impreuna cu cateva indicatii de implementare. Mult succes :) !
Trebuie sa realizati cel putin 5 elemente vizuale.
Cel mai simplu element vizual din lume poate fi realizat sub forma unui cub sau unui paralelipiped. Paralelipipedul se poate obtine din geometria unui cub, prin desenarea celui din urma cu o transformare de redimensionare neuniforma.
Urmatorul element vizual ce trebuie construit este construit din cel putin 3 cuburi sau paralelipipede.
Un alt element vizual trebuie sa fie construit din cel putin 3 cuburi sau paralelipipede, similar cu cel descris anterior, dar in situatia acestuia, cel putin o componenta din care este construit trebuie sa aiba o animatie continua.
Un alt element element vizual trebuie construit din cel putin 3 cuburi sau paralelipipede si trebuie sa contina cel putin o sursa de lumina atasata de el. Aceasta sursa de lumina trebuie sa lumineze orice obiect din lumea virtuala.
Similar cu elementul vizual descris mai sus, ultimul element vizual obligatoriu trebuie sa fie construit din cel putin 3 cuburi sau paralelipipede si sa contina cel putin o sursa de lumina atasata de el, care sa aiba un comportament de iluminare ce se modifica continuu. Posibile modificari ale sursei comportamentului de iluminare pot fi schimbarea culorii/intensitatii de iluminare.
Lumea virtuala in care se desfasoara actiunea jocului trebuie sa contina o curbura intr-o directie aleasa de voi.
Rezultatul este doar un efect vizual ce curbează geometria în jurul personajului, astfel că acesta poate ajunge la limita geometriei lumii, altfel spus la capătul ei și să și depășească acest capăt :) . De asemenea, este important de menționat că pentru calculele de iluminare NU se ține cont de calculele de creare a curburii geometriei.
Realizeaza curburii obiectelor din lume se realizează la pasul de desenare a obiectelor din scenă. Acest efect se creează prin modificarea coordonatelor pentru toate vârfurile obiectelor din lume. Procesul este realizat în vertex shader. Coordonata tuturor vârfurilor se modifică după cum urmează:
$$ Pozitie_{v} = Pozitie_{v} - \vec{control} \cdot \|{Pozitie_{camera}-Pozitie_v}\|^2 \cdot factorCurbura $$
Factorul de curbură este proporțional cu dimensiunea obiectelor din lume. O valoare posibila pentru factorul de curbura este 0.02.
Geometria personajului și a inamicilor poate fi identică. Ea este realizată din 6 paralelipipede, ce reprezintă trunchiul, capul, piciorul stâng și drept, brațul stâng și drept al personajului, conform imaginii de mai jos.
În situația în care se utilizează framework-ul de laborator, pentru determinarea direcției de deplasare a jucătorului pe baza direcției de vizualizare a camerei observator, se poate utiliza obiectul de tip Camera, după cum urmează:
auto camera = GetSceneCamera(); glm::vec3 forward = camera->m_transform->GetLocalOZVector(); forward = glm::normalize(glm::vec3(forward.x, 0, forward.z));
Se utilizează o proiecție pe planul XOZ a direcției de vizualizare a camerei. Calculele se realizează analog și pentru celelalte direcții ale obiectului de tip Camera.
Pentru a orienta geometria personajului în direcția de deplasare, se utilizează o matrice de rotație în jurul axei OY. În situația în care se cunoaște direcția de deplasare, unghiul de rotație se poate calcula după cum urmează:
$$ unghi = arctan(\frac{directie_x}{directie_z}) $$
atan2() pentru calcularea arctangentei.
În situația în care se utilizează framework-ul de laborator, pentru desenarea geometriei din perspectiva camerei observator, se poate utiliza obiectul de tip Camera, după cum urmeaza:
auto camera = GetSceneCamera(); // pozitia relativa a camerei fata de pozitia personajului glm::vec3 relativeCameraPosition = ...; // playerPosition este pozitia in lume a personajului controlat de jucator camera->SetPositionAndRotation( playerPosition + relativeCameraPosition, glm::quatLookAt(-glm::normalize(relativeCameraPosition), glm::vec3(0, 1, 0)) );
În calculele de iluminare a geometriei, trebuie utilizată componenta ambientală, componenta difuză și componenta speculară. Se pot utiliza modelele de iluminare deja analizate. Dacă se dorește, se poate înlocui calculul de iluminare pentru oricare din cele 3 componente cu un alt model de iluminare ce oferă rezultate vizuale superioare :) . Utilizarea unor astfel de modele de iluminare se punctează suplimentar.
În situația în care transformarea de modelare conține o transformare neuniformă de modificare a scării, trecerea vectorului normal din spațiul obiectului în spațiul lumii se realizează după cum urmează:
$$ \begin{bmatrix} \vec{N'}_{x} \\ \vec{N'}_{y} \\ \vec{N'}_{z} \\ 0 \end{bmatrix} = {{(Model^{-1})}^t} \cdot \begin{bmatrix} \vec{N}_{x} \\ \vec{N}_{y} \\ \vec{N}_{z} \\ 0 \end{bmatrix} $$
Direcția de iluminare a surselor de lumină de tip spot din vârful stâlpilor se vor roti continuu.
La apăsarea tastei space, personajul “trage” cu o “armă”, așa cum s-a menționat mai sus. Pentru a identifica inamicii care se află pe direcția de deplasare a personajului, la distanță mai mică de 2 unități, se poate folosi o abordare simplă ce oferă rezultate satisfăcătoare. Se utilizează un cerc virtual de rază 1, astfel ca diametrul să fie de dimensiune 2, ce se poziționează cu centrul la distanța 1 față de poziția personajului, pe direcția lui de deplasare. Această abordare este descrisă vizual în imaginea de mai jos.
Prin utilizarea acestei abordări, este suficient să identificăm toți inamicii ce au poziția în cercul descris mai sus pentru a afla inamicii ce trebuie eliminați din joc. Se consideră pozițiile personajului și ale inamicilor proiectate paralel pe planul XOZ pentru a lucra într-un spațiu 2D. Pentru a verifica dacă o poziție se află în interiorul unui cerc, se verifică daca distanta între poziție și centrul cercului este mai mică decât raza cercului.
Geometria personajului și a inamicilor trebuie să realizeze o animație continuă de deplasare, conform filmulețului de mai jos:
Doar pentru personajul controlat de jucător, în momentul în care jucătorul se oprește din mișcare, animația trebuie să se întoarcă înapoi la cadrul de animație în care personajul stă pe loc. În filmulețul de mai jos se poate observa acest comportament de joc.
În momentul în care jocul se utilizează în 2, pe ecran se desenează geometria în două porți de afișare cum s-a descris mai sus. Toate elementele vizuale, inclusiv personajul companion și iluminarea cu sursele de lumină proprii personajului companion, trebuie să se deseneze din două perspective diferite, câte una pentru fiecare personaj. De asemenea, curbura geometriei trebuie realizată din poziția personajului din perspectiva căruia se desenează geometria în poarta de afișare.