Dezvoltarea Unui Spatiu Tridimensional Prin Mixajul Motorului Grafic Unity 3d cu Programul Cinema 4d

Introducere și punerea problemei

Spațiul 3D sau tridimensional desemnează o tehnică de redare a obiectelor reale cu trei dimensiuni: înalțime, lățime și adâncime. În lucrarea de față "Dezvoltarea unui spațiu tridimensional prin mixajul motorului grafic Unity3D cu programul Cinema 4D" ne propunem să prezentăm metodele prin care poate fi creat un spațiu tridimensional într-un mod simplu și practic, ușor de înțeles, folosind motorul grafic Unity3D și dezvoltarea acestuia îmbinând elemente de grafică avansată folosind programul Cinema 4D și elemente de programare folosind JavaScript prin intermediul programul Unity3D.

Astfel, mi-am propus să creez un joc 3D ce are ca element grafic principal un automobil și să dezvolt o aplicație ce simulează în timp real mișcările automobilului în mai multe spații tridimensionale ce vor fi realizate prin diferite metode de modelare și asamblare. Modelarea elementelor grafice principale, cât a celor secundare se va face utilizând programul Cinema 4D deoarece programul este user-friendly, timpul de modelare este unul scurt, iar rezultatele finale sunt de o calitatea superioară față de alte programe asemănătoare, urmând a fi exportate în Unity3D pentru a dezvolta o aplicație tridimenională unde vom implementa o interfață ușor de folosit și prietenoasă pentru utilizator. Am ales Unity3D deoarece este user friendly, este ușor de folosit, foarte intuitiv, iar timpul necesar pentru a creea o aplicație este foarte mic datorită elementelor care sunt puse la dispoziția programatorului în cadrul programului. În plus, programul nu are limitări și ne permite să construim o aplicație care randează în timp real la o calitatea superioară în comparație cu alte programe care fac parte din aceeași categorie.

Cu ajutorul programului MonoDev care aparține programului Unity3D am implementat fiecare script Java. Programarea obiectelor în Unity3D este foarte ușor de înțeles datorită capacității programării Java care prezintă programatorului fiecare funcție în amănunt și care îl corectează și completează atunci când este nevoie.

Asamblarea în Unity3D a spațiilor tridimensionale constă în alinierea elementelor tridimensionale ce formează spațiul tridimensional astfel încât să fie apropiate și să nu avem goluri între elementele asamblate. Spre deosebire de alte programe asemănătoare, Unity3D oferă această posibilitate simplă de a crea un spațiu tridimensional doar prin adăugarea obiectelor tridimensionale în scenă și așezarea acestora fără restricții și fără alte setări necesare pentru fixarea elementelor tridimensionale. Unity3D permite, de asemenea, modelarea spațiului tridimensional în cadrul programului punând la dispoziția programatorului o gamă largă de unelte de modelare grafică.

Motorul grafic Unity3D. Generalități și platforme de dezvoltare

Unity 3D este un motor grafic puternic cu o varietate de instrumente care pot fi utilizate pentru a satisface nevoile de implementare ale unei aplicații. Editorul este dezvoltat de Unity Technologies și este intuitiv, personalizabil și ușor de utilizat, "user friendly", permițând o mare libertate în fluxul de lucru. Unity3D poate fi utilizat pentru:

dezvoltarea și implementarea jocurilor video și a aplicațiilor disponibile pe toate platformele cunoscute de noi;

arhitectură, inginerie și construcții;

simularea mediilor periculoase pentru prevenirea dezastrelor.

Unity 3D permite crearea de aplicații tridimensionale, dar și bidimensionale. Legătura dintre partea graficăși programarea obiectelor se poate face prin:

Unity JavaScript

C#

Programul permite, de asemenea, importarea fișierelor grafice și a texturilor din majoritatea programelorde modelare grafică existente pe piață. Exportarea din Unity3D se poate face către aproape orice mediu de lucru disponibil pe piață:

IOS

Android

Windows

BlackBerry 10

Windows Phone

Mac/Windows

Linux/Steam

Web Browsers

Ps3,Ps4,PsVita

XboxOne,Xbox360

Wii U

Oculus Rift

Gear VR

Android Tv

Smart TV

Astfel putem crea foarte ușor și în timp util o aplicație care poate fi disponibilă pe toate platformele de mai sus.

Descrierea spațiului de lucru în Unity3D

În momentul în care vom deschide programul este nevoie să creăm un proiect nou sau să selectăm unul deja creat. Interfața programului Unity3D se împarte în:

Bara de instrumente

Ierarhia

Suprafața de lucru/Scena

Proiectul

Panoul de comandă

Aceste secțiuni se pot vedea reprezentate schematic în figura nr.1.

Ierarhia conține fiecare element adăugat în scena curentă. Odată adăugat un element în scenă, acesta va apărea în ierarhie și va dispărea în cazul în care acesta este eliminat.

Elementele de proiect reprezintă suma tuturor elementelor adăugate care sunt elemente active în scenă sau nu și ne permite gestionarea acestora în funcție de nevoile noastre. Din acest meniu putem adăuga elemente noi în proiect de unde le vom adăuga apoi în scenă.

Scena sau suprafața de lucru reprezintă locul în care vom adăuga elementele 3D, vom seta camerele și luminile și vom anima fiecare obiect în parte.

Panoul de setări este activ în momentul în care selectăm un obiect 3D din scena curentă. Din acest panou putem adăuga scripturi, sunete sau putem modifica proprietățile obiectului selectat.

Așa cum se vede în tabelul 1, bara de instrumente are două valențe distincte: de transformare a obiectelor și de manevrare a lor în modul Game.

Tabel 1. Valențele principale ale barei de instrumente

Crearea unui ambient 3D în Unity3D

În Unity3D când vorbim de ambient 3D ne referim la suma elementelor tridimensionale și a scripturilor folosite pentru a realiza un spațiu tridimensional realist de o calitate superioară ce imită realitatea și conferă utilizatorului o experiență de joc unică prin îmbinarea acestora într-un mod simplu și creativ fără a crea probleme în momentul în care aplicația este disponibilă utilizatorului. Un ambient 3D se împarte în:

forme de relief;

texturile elementelor de relief;

elemente de decor auxiliare (ex: în cazul în care construim un ambient ce prezintă o zonă de munte elementelor auxiliare vor fi reprezentate de copaci, flori, iarbă etc.).

Pentru a crea un ambient 3D putem folosi mai multe tehnici de modelare și asamblare în funcție de complexitatea ambientului și de modul în care acesta va fi folosit. Astfel putem modela un ambient 3D în programele:

Unity3D

Cinema4D

WorldMachine

Putem exporta totul în Unity3D pentru a adăuga elementele auxiliare și pentru îmbinarea acestora cu scripturile Java. Dacă avem de creat un ambient 3D complex, este nevoie să modelăm fiecare element grafic folosind Cinema4D (ex: în cazul în care construim un oraș este nevoie să modelăm fiecare element al orașului, strazi,clădiri, etc.) iar apoi să exportăm totul în Unity3D și să asamblăm fiecare element modelat astfel încât să creăm ambientul dorit.

Setarea spațiului de lucru în Unity3D

Setarea spațiului de lucru se referă strict la adăugarea elementelor ajutătoare în spațiul de lucru sau scenă. Spațiul de lucru conține suma elementelor grafice ce contribuie la aplicația care este dezvoltată. Aceste elemente pot fi folosite pentru a crea un meniu și astfel, o interfață grafică către utilizator sau pentru a crea un alt nivel în cadrul aplicației. Putem adăuga elemente 3D primitive precum cubul,sfera,cilindrul planul, dar pentru a crea elemente complexe este nevoie de modelarea acestora în Cinema4D și importarea acestora în Unity3D. Odată adăugat un obiect 3D în spațiul de lucru din Unity3D acesta nu poate fi modelat, putând folosi doar instrumentele de transformare pentru al poziționa oriunde se dorește. Cu aceste instrumente putem plasa și roti obiectul pe axele de coordonate XYZ schimbând valorile de bază din panoul de comandă după cum putem observa în figura 2.

Setarea vizibilității în Unity3D cu ajutorul Camerelor și a Luminilor

Cea mai importantă parte în momentul în care dezvoltăm o aplicație se referă la poziționarea luminilor și a camerelor pentru a reda într-un mod unic și realist ambientul 3D. Într-o scenă putem adăuga câte lumini și camere avem nevoie să folosim și le putem seta exact așa cum ne propunem, fără a avea restricții.

Camerele reprezintă "ochii" aplicațieiși sunt dispozitive de captare care afișeză spațiul tridimensional utilizatorului. Prin personalizarea și manipularea camerelor putem face prezentarea unei aplicații într-un mod unic. Adăugarea unei camere în spațiul de lucru se face din meniul GameObject -> Camera. Putem adăuga un număr nelimitat de camere într-o scenăși le putem seta pentru a afișa un obiect în orice ordine, în orice loc de pe ecran sau doar anumite părți ale ecranului.Odată adaugatăîn scenă,în panoul de comandă vor fi disponibile următoarele comenzipentru a fi utilizate (figura 3):

Clear Flags – Determină câte părți ale ecranului nu vor aparea în momentul in care lansăm în execuție aplicația. Acest lucru ne permite să utilizăm mai multe camere pentru a prezenta mai multe cadre din scenă.

Background – Reprezintă culoarea aplicată din jurul scenei după ce toate elemente au fost adăugate și poate fi folosită atunci cand nu există un SkyBox.

Culling Mask – Includem sau omitem obiectele dintr-un anumit layer pentru a fi randate sau nu de cameră.

Projection- Activează sau dezactivează capacitatea camerei de a simula perspectiva.

Field of View -Reprezintă capacitatea camerei de a afișa o suprafață pe o anumită distanță.

Luminile sunt o parte fundamentalăîn cadrul grafic al aplicației deoarece acestea determină vizibilitatea și umbrirea unui obiect. În Unity3D luminile sunt de 4 tipuri:

Directional light

Point light

Spot light

Area light

Direcțional light este un obiect care nu are o sursa identificabilăastfel sursa de lumină poate fi poziționată oriunde în spațiul de lucru.

Point light este situat la un punct în spațiu și trimite lumina egal în toate direcțiile la fel ca și lumina direcțională, nu are o sursă identificabilă iar lumina scade în intensitate, ajungând la zero după o anumită distanță specificatăîn panoul de comandă.

Spot lighteste asemanătoare cu o lumină de tip punct, o lumina spot are o locație specificăîn spațiu și o anumită zonă peste care cade lumina.Cu toate acestea lumina de tip spot este constrânsă la un unghi ce poate fi setat din panoul de comandăși rezultă o formă de con de iluminare.

Area light este definită de un dreptunghi în spațiu. Lumina este emisăîn toate direcțiile dar numai dintr-o anumita parte a dreptunghiului și cade la un interval specificat, toate acestea fiind programabile din panoul de comandă.

Odată adaugatăîn spațiul de lucru în panoul de comandă vom putea modifica tipul de lumină care este prezent în scenă,cât de departe este emisa lumina fațăde centrul obiectului, culoarea luminii emise, intensitatea acesteia și dacă crează umbre sau nu(figura 4).

Crearea unui spațiu tridimensional folosind Unity3D

Pentru a crea un spațiu tridimensional în Unity3d este nevoie să adaugăm un plan sau un obiect 3D de tip teren ( GameObject -> 3D Object -> Terrain).

Odată adăugat și selectat din panoul de comandă putem face modificări referitoare la poziția/rotația/scala terenului în spațiul de lucru. Pentru a crea forme de relief și pentru a adăuga terenului un aspect deosebit vom folosi din panoul de comandă următoarele butoane:

prezentate succint în tabelul 2:

Tabel 2- Unelte de modelare a unui spațiu tridimensional în Unity3D

Crearea spațiului tridimensional folosind programul World Machine

World Machine este un program ce generează automat un spațiu tridimensional. Programarea spațiului tridimensional se face folosind blocuri de comandă. Pentru a creea un teren simplu este nevoie să adăugăm un bloc de tip Advanced Perlincu ajutorul căruia putem edita diferiți parametri ce caracterizează spațiul tridimensional, de la adăugarea formelor de relief la poziția acestora și modalitatea în care vor fi construite (figura 5).

După apăsarea butonului Build spațiul tridimensional va arăta caîn figura 6.

Crearea spațiului tridimensional folosind programul Cinema4D

Crearea unui spațiu tridimensional în Cinema4D poate fi dezvoltată în doua moduri:

În cazul în care dorim să construim un spațiu tridimensional ce reprezintă elemente din mediul înconjurător și elemente de relief vom folosi unealta Landscape.

În cazul în care dorim să construim un spațiu tridimensional complex(ex:oraș) vom construi fiecare element 3D ce este necesar pentru a asambla spațiul tridimensional dorit.

În acest capitol ne propunem să construim un spațiu tridimensional ce reprezintă o zonă muntoasă. Astfel este nevoie săfolosim în spațiul de lucru din bara de instrumente unealta Landscape. Opțiunea Landscape adaugă în spațiul de lucru un plan unde vom adăuga și modela formele de relief. Imediat ce a fost adăugat planul, în partea dreaptă vor fi vizibile setările spațiului tridimensional iar de aici putem modifica dimensiunea planuluiși forma elementelor de relief după cum putem observa în figura 7.

Importarea unui obiect tridimensional în Unity3D

Pentru a importa elementele tridimensionale în Unity 3D vom selecta din meniul:

Assets -> Import New Asset…

iar din fereastra deschisă vom selecta elementele pe care dorim să le adăugam în program(figura 7).Odata adăugate acestea vor fi vizibile în partea de jos în bara de instrumente Assets. Pentru a adăuga un element în scena de lucru este necesar să folosim procedura Drag&Drop. De asemenea putem importa obiecte în Unity3D folosind procedura Drag&Drop a obiectelor tridimensionale în zona elementelor de proiect.

Inițierea unui proiect 3D prin implementarea și dezvoltarea unei interfețe grafice simple pentru utilizator. Experimente practice.Aspecte generale.

Interfața grafică (în engleză: Graphical User Interface sau GUI) reprezintă o interfață cu utilizatorulce are la bază un sistem de prezentare grafică ce conține imagini, butoane și alte elemente UI. Interfată grafică este legătura dinte aplicației și utilizator fără a prezenta elemente de programare și proiectare.

Avantajele folosirii GUI sunt:

Interacțiune cu computerul mai ușoarăși mai eficientă pentru utilizator;

Simplificare instrucțiunilor complexe, realizată cu ajutorul pictogramelor și butoanelor;

Inițiere intuitivă a comenzilor către computer;

UI(User Interface) este legătura dintre partea de graficăși programare care este disponibila fiecarui utilizator. Aceasta reprezintă totalitatea comenzilor pe care un utilizator obișnuit le poate accesa în cadrul unei aplicații software. Scopul acestei interacțiuni este de a permite operarea și controlul efectiv al aplicației de către utilizator, usor,simplu și plăcut fără a întâmpina dificultăți.

Pentru a construi interfața grafică pentru utilizator este nevoie să adăugăm mai multe elemente ajutătoare pentru a o implementa. Vom adăuga elemente de UI din meniul GameObject-> UI ( figura 9).

Optiunea UI cuprinde următoarele elemente, prezentate succint in tabelul 3:

Tabel 3 – Elemente de interfață grafică

Gestionarea scenelor de lucru folosind nivele de lucru

Un nivel de lucru este reprezentat de o scena creatăîn spațiul de lucru. Pentru a creea o scenă nouă vom accesa meniul File și vom selecta New Scene.Pentru a gestiona fiecare scenă care va fi încarcată la acțiunea unui element de tip UI este necesar să atribuim scenei în care lucrăm un număr X, atribuit automat pentru a o încarca la momentul potrivit folosind un script de tip Java.Pentru a atribui unei scene un nivel de lucru este necesar să selectăm din meniul File -> Build Settings.

Foarte important este ca atunci când dorim să atribuim un nivel de lucru unei scene aceasta să fie activăîn spațiul de lucru. Selectăm platforma de lucru pe care ne dorim să ruleze aplicațiași apăsăm butonul Add Curent pentru a adăuga scena din spațiul de lucru în build-ul ce va fi creat(figura 10).

Crearea unei interfețe simple pentru utilizator prin crearea uner scene și folosirea unui script Java pentru tranziția dintre ele

Ne propunem să dezvoltăm o aplicație simplă care face tranziția între 2 scene de lucru folosind cateva butoane. Pentru a implementa interfața către utilizator este nevoie săcreămo scenă nouă, să adăugăm un buton și să mutăm camera astfel încat butonul să fie vizibil în modul Play,după cum putem observa în figura 7. Salvăm scena curentăși o adaugăm ca nivel de lucru 0 exact cum am prezentat mai sus când am atribuit nivelele de lucru.

Continuăm creând o scenă nouăîn care vom adăuga două butoane pentru a face diferențierea între scene și vom seta camera astfel încat butonul să fie vizibil în modul Play. Urmează să salvăm scena și să o adăugăm ca nivel de lucru 1.Pentru a face tranziția dintre scena care are ca nivel de lucru 0 și scena care are nivel de lucru 1 este nevoie să implementăm un JavaScript. Deschidem scena 1 selectăm butonul prezent în scenăși adăugăm un JavaScript din panoul de comandă.

Codul ce face posibilă tranziția dintre cele două scene este prezentatîn figura 12.Scriptul apelează nivelul de lucru X definit în momementul în care am terminat scena. În cazul nostru scriptul va încarca nivelul de lucru 1 și astfel apăsând pe butonul din scena 1 acesta va face tranziția la scena 2 unde am poziționat cele două butoane.Pentru a pune scriptul în funcțiune este necesar ca scriptul să fie atașat butonului cu Drag&drop peste buton și din panoul de comandăîn secțiunea Button(Script) ->OnClick() în spațiul unde apare None trebuie adaugat butonul din scena. Acesta ne va permite să selectăm scriptul atașat butonului și deasemenea din acesta să apelăm funcția care implicăîncarcarea nivelului, în cazul meu LoadScene() după cum observăm în figura 13.

În modul Play în momentul în care vom apăsa click pe butonul din prima scena acesta va încărca automat a doua scenă.

Aspecte generale ale programul CINEMA4D. Generalități.

Cinema4D este cel mai puțin aglomerat program de modelare/animație 3D. User-friendly,ușor de folosit, ne permite să modelăm o suprafață 3D exact cum ne dorim fără a pune piedici în calea creativității noastre. Cinema4D este un software de modelare 3D, animație și randare dezvoltat de MAXON în Germania. Este capabil de modelare, animare, iluminare, texturare și randare a obiectelor 3D într-un timp foarte scurt datorită faptului că este ușor de înțeles și prezintă foarte exact ceea ce putem creea.

În momentul în care vom deschide Cinema4D putem observa scena de lucru unde vom adăuga elementele tridimensionale pentru a le modela sau anima după cum putem observa în figura 13. În partea de jos este Timeline-ul ce ne permite săcreăm videoclipuri ăi filmulețe cu ajutorul elementelor adăugate în scenă.Sub Timeline avem bara de instrumente de materiale ce ne permite să construim materiale ce vor fi aplicate pe obiectele din scena. Cinema4D permite în cadrul meniurilor din secțiunea Materiale o gamă largă de materiale predefinite. În partea de sus găsim bara de instrumente și unelte ce ne permite să adăugă m obiecte 3D primitive in scena ,sa adaugam efecte, sa aplicam unelte de transformare(pozitionare pe axa XYZ, rotire, redimensionare) asupra unui obiect din scenă sau să randăm scena curentă. În bara de instrumente și unelte se află mai multe meniuri ce permit adăugarea de obiecte și efecte complexe.

Tipuri de modelare

Spline modelling este tipul de modelare prin care putem crea un obiect tridimensional după o schiță 2D folosind ca elementele principale linii și puncte și construind conturul obiectului 2D, după cum putem obseva în figura 16.

După ce am construit un contur închis al obiectului îl vom extruda în jurul unei axei pe care a fost constuit folosind comanda Lathe Nurbs (fig. 17).

Modelarea în "cutie"(box modelling)este tipul de modelare prin care adăugăm un obiect primitiv și modificăm poligoanele și punctele acesuia pentru a crea un obiect tridimensional. Putem folosi proiecțiile 2D ale unui obiect pentru a crea poligoanele, respectiv forma tridimensională a acestuia sau putem lucra pe un obiect 3D primitiv și să îi modificăm forma astfel încât să construim obiectul dorit aplicând diferite extrudări sau modificând poziția punctelor ce formeaza un poligon. Astfel vom construi un copac ce are un număr mic de poligoane folosind acesta tehnică. Vom adăuga în scena de lucru un cub, îl vom redimensiona așa cum dorim folosind uneletele de tip Transform, vom face cubul editabil și îl vom extruda la distanțe diferite modificând de fiecare dată dimensiunea suprafeței extrudate dar și pozitia acesteia(fig. 18).

Modelarea prin puncte (polygon modelling) constă în adăugarea de puncte și crearea unor poligoane între acestea pe o suprafață 2D ce reprezintă proiecțiile unui obiect tridimensional pentru a constui elementul tridimensional dorit(Fig. 19). Este o tehnică complexă de modelare deoarece necesită foarte multă precizie și durează mult mai mult timp față de celelalte tehnici de modelare, dar rezultatele obținute sunt de o calitate superioară pană la cele mai mici detalii. Se adaugă proiecțiile obiectului pe care dorim să îl construim și folosind uneltele: Create Polygon, Create Point, Bridge, Knife modelăm suprafețele care formeazăobiectul tridimensional. Astfel vom modela jumătate din obiectul tridimensional dorit și vom aplica mirror.

Materiale în Cinema4D

Cinema4D are o paleta de culori imensă și o multitudine de efecte ce pot fi adăugate materialelor pentru a putea avea materialul dorit. Pe langă posibilitatea de a ne crea singuri materialele în Cinema4D avem o librărie de materiale ce reflectă texturile ce apar în natură (sticlă,lemn,metal,piatră etc.). Materialele sunt create pentru a colora un obiect tridimensional pentru a arăta realist. Putem aplica un material pe toată suprafața unui obiect folosind procedura simplă Drag&Drop a materialului peste suprafața dorită(fig.20).

Dacă dorim sa aplicăm un material pe anumite suprafețe ale obiectului este necesar să facem obiectul tridimensional editabil (~C) și să selectăm suprafețele pe care dorim să aplicăm materialul(Shift+Click). După selectarea suprafețelor vom folosi procedura Drag&Drop a materialului pe suprafața selectată anterior (fig. 21).

Modelarea și texturarea unui automobil în Cinema4D pornind de la elemente 3D primitive

Pentru a construi modelulul mașinii în Cinema4D vom folosi ca obiect 3D primitiv un cub și vom aplica diferite extrudări pe suprafețele cubului pentru a realiza forma automobilului. Pentru a adăuga un cub în scenă este necesar să selectăm din bara de instrumente și unelte pictograma pe care este un cub albastru de unde va rezulta adăugarea unui cub în scenădupă cum putem observa în figura 22.

Pentru a putea aplica aceste extrudări este nevoie să facem obiectul editabil (selectand

obiectul 3D și apăsând tasta C) și să activăm opțiunea ce ne permite să selectăm suprafețele cubului(fig. 23).

Pentru un design realist vom modela suprafețele cubului folosindmodelarea în "cutie"(box modelling). Această metodă ne permite să modelăm o suprafață prin selectarea unor puncte și suprafețe corespunzătoare acesteia, prin redimensionarea sau mișcarea punctelor pe axele de coordonate. Folosim această metodă deoarece ne dorim un obiect 3D care să conțină puține poligoane pentru a putea fi randat în timp real mult mai ușor și pentru a avea un design plăcutși calitativ.Pentru a folosi metoda „în cutie” este necesar după extrudarea obiectului să selectăm din meniul din partea dreaptă opțiunea ce ne permite să selectăm punctele obiectului 3D după cum putem observa în figura 24.

Folosind extrudarea și metoda prin puncte asupra suprafețelorcreate vom obține designul mașinii după cum putem observa în figura 25.

Pentru a creea roțile vom adăuga pentru fiecare roatăîn parte un cilindru ăși îl vom redimensiona urmând apoi săîl plasăm în spațiul destinat roții(fig. 26).

Pentru a textura obiectele tridimensionale în Cinema4D este nevoie să creăm materialefolosind o gama largă de culori și să le îmbinăm cu efecte pentru a crea materialul care reflectă exact ceea ce ne propunem să prezinte. Pentru a crea un material nou este nevoie să accesăm meniul Create->New Material și să modificăm proprietățiile acestuia pentru a crea materialul de care avem nevoie(fig. 27).

Pentru a adăuga un material pe o anumită suprafață a mașinii este necesar să selectăm poligoanele care reprezintă suprafața pe care ne propunem să colorăm automobilul după care să tragem materialul peste suprafata selectată (fig. 28).

Pentru a aplica un material pe toata suprafața automobilului este nevoie doar să tragem materialul peste obiect în scenă (fig. 29).

Modelarea elementelor de design pentru a crea un spațiu tridimensional complex folosind Cinema4D

Pentru a dezvolta un spațiu tridimensional complex și realist este necesar să ne construim fiecare element tridimensional pe care spațiul îl conține astfel încât elementele acestuia să conțină puține poligoane dar totodată să fie de o calitate superioară. Ne propunem să construim toate elementele tridimensionale principale ale unui oraș în Cinema4D și să le asamblăm în Unity3D. Pentru toate acestea vom folosi elemente primitive și vom aplica diferite extrudări pe diferite suprafețe.

Pentru a construi o clădire vom adauga în spațiul de lucru din Cinema4D un cub, îl vom redimensiona pentru a avea dimensiunea dorită, îl facem obiect editabil și folosind Extrude pe diferite poligoane ale cubului vom construi clădireadupă cum putem observa în figura 30.

Prin aceeași metodă vom modela și celelalte clădiri pe care le vom folosi în asamblarea spațiului tridimensional urban și în ansamblarea spațiului tridimensional rural în Unity3D, după cum putem observa în figura 31 respectiv în figura 32. Texturarea obiectelor tridimensionale se face cu ajutorul tehnicii Drag&Drop a texturii peste obiectul tridimensional. Pentru a crea o textură complexă este necesar să selectăm anumite poligoaneale cubului și să aplicăm un material peste poligoanele selectate sau putem fotografia din mediul înconjurător o clădire și să aplicăm fotografia digitală peste obiectul tridimensional.

Pentru a crea un spațiu tridimensional complex este nevoie să folosim foarte multe lumini. O lumină este emisa de o sursă, astfel este nevoie să construim obiectele tridimensionale corespunzătoare surselor de lumină din spațiul tridimensional (Fig. 33).

Drumurile reprezintă o parte foarte importantă a spațiului tridimensional creat deoarece pe suprafața acestora automobilul se va mișca. Ele trebuie să fie construite perfect, fără defecte de construcție. Pentru a construi un traseu este nevoie doar să construim părțile principale acestuia un drum drept, o curbă la stânga, o curbă la dreapta,o intersecție din care pleacă 3 drumuri respectiv o intersecție din care pleacă 4 drumuri(Fig. 34). Pentru a construi un drum putem folosi ca obiect 3D un plan sau un cub și să îl redimensionăm la dimensiunile de care avem nevoie.Pentru drumurile curbate vom folosi discul și vom șterge poligoanele de care nu avem nevoie pentru a modela forma curbei.

Pentru a face spațiul tridimensional reprezentat de un oraș unul realist este nevoie să construim elemente auxiliare precum trotuarele. Pentru a construi aceste elemente în Cinema4D vom folosi în continuare ca material de modelat planul și îl vom redimensiona sau vom sterge poligoanele care nu sunt necesare pentru a crea obiectul tridimensional dorit. După alinierea, dimensionarea și ștergerea poligoanelor elementele auxiliare vor arăta ca în Figura 35.

Exportarea modelelor tridimensionale din Cinema4D

Pentru a exporta modelele tridimensionale create anterior alături de toate materialele și texturile din Cinema4D pentru a le utiliza corespunzător în Unity3D vom selecta din meniul:

File -> Export ->Wavefront(*.obj)

Selectăm acest tip de exportare deoarece ne dorim să exportăm toate elementele obiectelor 3D inclusiv materialele folosite pentru texturarea acestora(Fig. 36).

Obținea unui joc 3D cu ajutorul facilităților oferite de motorul grafic Unity3D

Ne propunem să începem construirea unui joc 3D ce are ca element principal un automobil dar pentru început trebuie să construim în Unity3D spațiile tridimensionale reprezentate de fiecare nivel al jocului și anume:

Spațiul tridimensional urban reprezentat prin nivelul jocului "Circuit"

Spațiu tridimensional rural reprezentat prin nivelul jocului "Free Drive"

Spațiu tridimensional mixt reprezentat prin nevelul jocului "Sprint"

Cu ajutorul obiectelor tridimensionale modelate anterior vom asambla spațiile tridimensionale.

Asamblarea în Unity3D constă în alinierea elementelor tridimensionale ce formează spațiul tridimensional astfel încât să fie apropiate și să nu avem goluri între elementele asamblate.

Spre deosebire de alte programe asemănătoare Unity3D oferă acestă posibilitate simplă de a creea un spațiu tridimensional doar prin adăugarea obiectelor tridimensionale în scenă și așezarea acestora fără restricții și fără alte setări necesare pentru fixarea elementelor tridimensionale.

Asamblarea elementelor tridimensionale în Unity3d pentru dezvoltarea unui spațiu tridimensional urban

Începem prin a importa toate elementele necesare asamblării unui oraș. Dorim să construim un traseu cu careautomobilul va interacționa și să adaugăm elementele auxiliare statice ce formează spațiul tridimensional. Vom adăuga un teren(GameObject – 3D Object -Terrain) pe care o să asamblăm elementele spațiului tridimensional după cum putem observa în Figura 37.

Pentru a poziționa fiecare element al spațiului tridimensional în poziția corectă vom folosi uneltele de tip Transform ce permit mișcarea, rotirea si redimensionarea obiectelor tridimensionale adăugate în scena de lucru.

Pentru fiecare element tridimensional în parte este absolut necesar să adăugăm un collider de tip mesh. Componentele de tip collider definesc în spațiul tridimensional forma unui obiect tridimensional în sensul coliziunii fizice. În spațiul tridimensional collider-ul este invizibil și nu trebuie neapărat sa aibă aceeași formă ca obiectul de care este atașat. Există mai multe tipuri de collider care se folosesc în 3D prezentate succint în Tabelul 4.

Tabel 4 – Tipuri de Collider în Unity3D

În cazul nostru vom aplica pe fiecare element al traseului un collider de tip Mesh Collider. Este necesar să apăsăm click pe un element al traseului și din panoul de setări să adăugăm o componentă nouă după cum putem observa în Figura 39.

După asamblarea fiecărei porțiuni de drum a spațiului tridimensional (Fig. 38) și aplicarea colliderelor de tip Mesh pe fiecare element din spațiu tridimensional (Fig.39) vom trece la adăugarea obiectelor tridimensionale auxiliare create în Cinema4d în scena de lucru(Fig. 40) cărora este necesar de asemenea să le adăugăm un collider de tip Box.

În continuare vom adăuga în scena de lucru trotuarele. Pentru acesta este nevoie să mutăm toate clădirile de pe fiecare latură a traseului și să adăugăm obiectele tridimensionale corespunzătoare trotuarelor. Foarte important este să aplicăm pe fiecare trotuar un collider de tip box după cum putem observa în Figura 41.

Urmează să adăugăm pe trotuare luminile după cum putem observa în Figura 42. Pentru acestea vom adăuga în capătul de sus al stâlpului o lumină de tip spot și vom adăuga un collider de tip Mesh pe stâlpi pentru a avea coliziune fizică cu automobilul.

Pentru a crea un mediu realist este necesar să adăugăm un element de tip SkyBox. Un SkyBox înconjoară spațiul tridimensionat pentru a da impresia de peisaj complex în orizont, în cazul nostru Skybox-ul reprezintă cerul. Vom folosi un pachet inclus în Unity pentru a adăuga un skybox, astfel, după încărcarea pachetului (Assets – Import Package – Environment) o să adăugăm camerei principale o componentă SkyBox și, cu ajutorul proprietății Custom Skybox, vom selecta skybox-ul dorit după cum putem observa în Figura 43.

Asamblarea și modelarea elementelor tridimensionale în Unity3d pentru dezvoltarea unui mediu rural tridimensional

Pentru a construi un spațiu tridimensional rural în Unity 3D începem prin a adăuga o scenă nouă unde vom importa toate elementele tridimensionale din Cinema4D necesare asamblării unui spațiu tridimensionalrural(drumuri,lumini,clădiri etc.) și totodată, vom importa pachetul Environment din Unity3D pentru a încarca texturile predefinite necesare în dezvoltarea spațiului tridimensional rural. Vom construi un traseu adăugând în scenă porțiuni de drum(curbe,intersecții, etc.) cu care automobilul va interacționa pe tot parcursul cursei. Vom adăuga un teren(GameObject – 3D Object – Terrain) pe care vom asambla și modela elementele spațiului tridimensional.Foarte important, atunci când adăugăm o porțiune de drum, este să îi aplicăm o componentă de tipul Mesh Collider pentru ca porțiunile de drum să aibă o coliziune fizică cu automobilul și acesta să nu treacă prin ele.

Folosind uneltele de modelare a terenului vom aplica o textură de tipul "GrassRock"cu ajutorul uneltei "Paint Texture" pe care o găsim automat în proiect dacă am adăugat pachetul "Environment" din Unity3D, după cum putem observa în Figura 44. Pentru a adăuga textura peste teren este nevoie să selectăm unealta "Paint Texture" și din meniul deschis să apăsăm butonul "Edit Textures…". Din fereastra nou deschisă apăsăm butonul "Select" alegem textura dorită, în cazul nostru "GrassRock" și apăsăm butonul "Add". Textura va fi adăugată în panoul de setări în cadrul uneltei "Paint Texture" în dreptul proprietății "Textures" și va fi adăugată automat peste teren.

Folosind unealta de modelare "Raise/Lower Terrain" și diferite tipuri de pensule cu mărimi diferite vom modela terenul astfel încat să arate ca un peisaj montan, urmând imediat apoi să folosim unealta "Paint Texture" pentru a aplica o textură de tipul "GrassHill" la baza munților și pe crestele înalte după cum putem observa în Figura 46.

În continuare vom adăuga clădirile spațiului tridimensional rural care au fost modelate în Cinema4D. După ce am adăugat un grup de 5-6 clădiri le vom selecta pe toate și le vom multiplica urmând a le muta și roti la o altă locație din spațiul tridimensional creat(Fig. 47).

Pentru a crea un mediu realist este necesar să adăugăm un element de tip SkyBox. Un SkyBox înconjuară spațiul tridimensionat pentru a da impresia de peisaj complex în orizont, în cazul nostru Skybox-ul reprezintă cerul. Vom folosi un pachet inclus în Unity pentru a adăuga un skybox.Astfel, după încărcarea pachetului (Assets – Import Package – Environment),vom adăuga camerei principale o componentă SkyBox ș, cu ajutorul proprietății Custom Skybox, vom selecta skybox-ul dorit după cum putem observa în Figura 48.

Ultimul pas spre finalizarea spațiului tridimensional rural constă în adăugarea detaliilor. Vom adăuga în scenă folosind unealta "Place Trees" și "Paint Details" copaci și iarbă folosind pensule de diferite marimi și forme după cum putem observa în Figura 49.

Asamblarea și modelarea elementelor tridimensionale în Unity3D pentru dezvoltarea unui spațiu tridimensional mixt

Pentru a construi un spațiu tridimensional mixt în Unity 3D începem prin a adăuga o scenă nouă unde se adăugă un teren (GameObject – 3D Object – Terrain) pe care vom asambla și modela elementele spațiului tridimensional. Vom importa în program din Cinema4D elementele necesare construirii spațiului tridimensional. Având în vedere că această scenă reprezintă nivelul jocului de tip "Sprint" vom construi un traseu drept pe marginea căruia vom adăuga elemente auxiliare.Foarte important este, atunci când adăugăm o porțiune de drum, să îi aplicăm o componentă de tipul Mesh Collider pentru ca porțiunile de drum să aibă o coliziune fizică cu automobilul și acesta să nu treacă prin ele.

Cele două intersecții vor fi blocate pentru a nu permite utilizatorului să treacă în afara traseului, ele fiind construite pentru a creea ideea unui spațiu tridimensional mare în momentul în care aplicația rulează.

Continuăm prin a asambla scena curentă folosind modalitățile folosite în cadrul asambrării și modelării spatiilor tridimensionale rurale și urbane. Astfel vom adăuga în scenă toate elementele tridimensionale din Cinema4D necesare asamblării unui spațiu tridimensional urban și vom modela terenul folosind uneltele prezentate în cadrul spațiului tridimensional rural alături de texturare și de adăugarea detaliilor terenului.

Soluții în crearea unui limbaj prietenos pentru utilizatorul jocului creat

Interfața grafică pentru utilizator trebuie concepută astfel încât interacțiunea cu aplicație să fie simplă și eficientă în același timp pentru utilizator. Vom folosi butoane, animații pentru a crea scena de lucru și imagini intuitive pentru o înțelegere ușoară. Începem prin a adăuga în proiectul curent o scenă nouă (File->New Scene) în cadrul căreia vom implementa interfața grafică a jocului. În ansamblu interfața grafică este formată din :

Fundalul de lucru

Elemente de animație

Butoane

Scripturi pentru tranziția între scenele de lucru

Fundalul reprezintă toate elementele tridimensionale din scena de lucru în care vom dezvolta interfața grafică ce reprezintă limbajul jocului tridimensional. Astfel vom adăuga în scenă următoarele elemente tridimensionale construite în Cinema4D descrise succint în Tabelul 5:

Tabelul 5 – Adăugarea elementelor în scena de lucru pentru a crea fundalul interfeței grafice

După adăugarea fiecărui element în scena de lucru vom poziționa automobilul pe cilindru, îl vom plasa sub plan și poziționa exact sub gaură iar cele două jumatăți de cilindru se plasează în gaura din plan.

Se vor anima cele două jumătăți de cilindru astfel încât să coboare și să gliseze pe langă plan. Pentru a crea o animație nouă selectăm din meniul Window opțiunea Animation. În fereastra deschisă, folosind elementele din ierarhie, vom adăuga cele doua jumătăți ale dreptunghiului cu ajutorul butonului Add Property. Pentru fiecare jumătăte de cilindru în parte este necesar să adăugăm proprietăți de tip Transform – Position (Fig. 52) deoarece în cazul nostru animația constă doar în mișcarea jumătăților de cilindru pe axa X respectiv pe axa Y.

Urmează să creăm animația, pentru acesta este necesar să o salvăm pentru a putea continua. Animația rulează în mod automat la 60 de cadre pe secundă este necesar să schimbăm rularea aplicației la 5 cadre pe secundă din fereastra Animation (Fig. 53)pentru a face mișcarea jumătăților de cilindru mai lentă.Vom șterge ultimul cadru cheie (Keyframe) selectând candrul și apăsând tasta Delete deoarece nu dorim ca aplicația să se repete, după cum putem observa în Figura 54.

Pentru a crea animația jumătății din partea stângă a cilindrului se vor face următoarele setări, prezentate succint în Tabelul 6:

Tabelul 6 – Setările animației pentru jumătatea cilindrului din partea stângă

Tabelul 6 evidențiază faptul că la secunda 0 vom adăuga un cadru cheie(Keyframe) fără a aduce modificări pe axa X, respectiv pe axa Y a jumătații cilindrului din partea stângă în panoul de setări(Fig. 55). La secunda 5 vom adăuga un cadru cheie(Keyframe) după ce am mișcat jumătatea stăngă a cilindrului la o distanța de -0,25 mm pe axa Y în panoul de setări (Fig. 55).La secunda 15 vom adăuga un cadru cheie(Keyframe) după ce am mișcat jumătatea stăngă a cilindrului la o distanța de -4 mm pe axa X în panoul de setări iar distanța pentru axa Y rămâne neschimbată deoarece au fost adăugate anterior(Fig. 55). Folosind procedura Drag&Drop vom trage fișierul nou creat Nume_cilindru_stanga.anim din bara elementelor de proiect peste jumătatea stăngă a cilindrului.

Ștergem ultimul cadru cheie (Keyframe) și pentru a crea animația jumătății din partea dreaptă a cilindrului se vor face următoarele setări, prezentate succint în Tabelul 7:

Tabel 7 – Setările animației pentru jumătatea cilindrului din partea dreaptă

Tabelul 7descrie același proces pe care l-am descris și la tabelul 6 singura diferență fiind că la secunda 15 vom adăuga un cadru cheie(Keyframe) după ce am mișcat jumătatea dreaptă a cilindrului la o distanța de 4 mm pe axa X în panoul de setări.

În continuare vom anima cilindrul pe care se află automobilul. Animarea acestuia constă în ridicarea acestuia pe axa Y după ce cele două jumătăți de cilindru au coborât și au glisat pe langă plan. Pentru a crea o animație nouă selectăm din meniul Window optiunea Animation. În fereastra deschisă, folosind elementele din ierarhie, vom adăuga cele două jumătăți ale dreptunghiului cu ajutorul butonului Add Property. Pentru cilindru este necesar să adăugăm proprietăți de tip Transform – Position (Fig. 52) deoarece în cazul nostru animația constă doar în mișcarea cilindrului pe axa Y.Vom șterge ultimul cadru cheie (Keyframe) după cum putem observa în Figura 54.Animația rulează în mod automat la 60 de cadre pe secundă este necesar să schimbăm rularea aplicației la 5 cadre pe secundă din fereastra Animation după cum putem observa în Figura 53.Pentru a crea animația cilindrului se vor face următoarele setări prezentate succint în Tabelul 8:

Tabel 8 – Setările animației pentru cilindru

Tabelul 8 prezintă faptul că la secunda 0 vom adăuga un cadru cheie(Keyframe) fară a aduce modificări pe axa Y a cilindrului în panoul de setări. La secunda 25 vom adăuga un cadru cheie(Keyframe) după ce am mișcat cilindrul la o distanța de 12mm pe axa Y în panoul de setări după cum putem observa în Figura 57.

Ne propunem să implementăm în continuare un script Java care să ne permită să rotim continuu cilindrul și automobilul în plan. Pentru a crea un nou script Java vom selecta din meniul Create opțiunea Javascript după cum putem obseva in Figura 58.

Îl vom salva sub numele de "rotație_obj".Pentru a deschide un script Java apăsăm dublu click pe scriptul dorit, moment în care se va deschide programul MonoDev ce face parte din programului Unity3D unde putem implementa scriptul Java. Implementarea scriptul Java,ce ne permite să rotim continuu un obiect tridimensional(Fig. 59) se descrie astfel:

Definim o variabilă viteză care este egală cu 1.

Defim funcția Update care este apelată o singură dată pe cadru.

În cadrul funcției Update apelăm funcția de tip transform care ne permite să miscăm,rotim și să redimensionăm obiectele tridimensionale într-un spațiu tridimensional.

În continuarea funcției tranform apelăm "Rotate" care reprezintă proprietatea de rotire a obiectelor tridimensionale.

Setăm valorile axelor de coordonate astfel încât axa X și axa Z sunt egale cu 0 deoarece rotirea obiectului tridimensional se face în jurul axei Y iar axa Y este definită de variabila viteza care este înmulțită cu "Time.deltaTime" ce reprezintă timpul care a trecut de la ultimul cadru. Folosim "Time.deltatime" dacă dorim să mutăm sau să rotim un obiect tridimensional cu o viteză viteză constantă.

După salvarea scriptului acesta trebuie atașat pe cilindrul pe care stă automobilul. Folosind procedura Drag&Drop vom trage scriptul "rotație_obj" din bara elementelor de proiect peste cilindru, astfel încât în momentul în care vom rula aplicația cele două jumătăți de cilindru vor coborî și vor glisa pe langă plan iar cilindrul se va ridica deasupra planului și se va roti cu automobilul după cum putem observa în Figura 60.

Pentru a termina fundalul este nevoie să modificăm proprietățile camerei principale din panoul de setări. Vom schimba poziția și unghiulastfel încât camera să randeze în timp real scena ce prezintă animația descrisă mai sus.În panoul de setări vom modifica setările camerei (Fig.61 )astfel:

Background-ul reprezintă fundalul din spatele scenei care înconjoară spațiul tridimensional și îi vom schimba culoarea din albastru în gri.

Field of View sau câmpul de vizualizare reprezintă lățimea de vederea unghiului camerei măsurate în grade de-a lungul axei Y. Vom modifica acest unghi la o dimensioune de 40 de grade astfel încât camera să afișeze în modul play doar o parte din plan și cilindrul cu automobilul care se rotesc.

În continuare vom adăuga butoanele ce îi vor permite utilizatorului să folosească aplicația. Ele trebuie să fie intuitive și ușor de folosit fără a crea probleme în utilizarea aplicației. Adăugăm un buton din meniul "GameObject – UI – Button". Odată adăugat în scena de lucru acesta va fi poziționat în centrul unui contur "Canvas”. Toate elementele care reprezintă interfața grafică vor fi adăgate în Canvas și vor fi elementele acestuia.Canvas-ul permite redimensionarea elementelor UI în cazul în care schimbăm rezoluția aplicației. Un buton este format din corpul dreptunghiular de culoare gri și de elementul său, Text.

Vom adăuga în scena de lucru 3 butoane pe care le vom denumi Play, Options și Exit ce vor permite utilizatorului să pornească aplicația, să schimbe setările aplicației și respectiv să iasă din aplicație.Folosind unelete de Transform(Miscare,Rotire,Redimensionare) vom muta cele 3 butoane în partea dreaptă, langă automobil. Pentru a schimba textul ce apare pe buton este necesar să accesăm elementul butonuluiText și în panoul de setări să introducem textul dorit, după cum putem observa în Figura 62. Din panoul de setări putem de asemenea modifica și tipul fontului folosit, dimensiunea și spațierea dintre linii precum și orientarea textului în paragraf.

În continuare vom implementa ca, în momentul în care vom trece cu cursorul mouse-ului peste un buton acesta să se coloreze progresiv în nuanțe de roșu. Astfel selectăm un buton iar din panoul de setari vom aduce modificări în cadrul opțiunii Buton(Script) referitoare la evidențierea culorii (Higlighted Color), selectând pentru fiecare buton în parte culoarea roșie și de asemenea vom modifica opțiunea duratei de decolorare (Fade Duration), pentru a crea un efect de colorare progresivă în nuanțe de roșu după cum putem observa în Figura 64.

Urmează să construim următoarea scenă de unde utilizatorul va selecta tipul de cursă. Peste scena anterioară vom construi meniul de selecție astfel: vom șterge Canvasul și butoanele din scena anterioară păstrând doar fundalul și pentru a crea interfața grafică a meniului de selecție a nivelurilor jocului vom folosi 3 imagini reprezentative pentru tipul de traseu (circuit,sprint și free drive) și un buton, Back, pentru a ne putea întoarce la meniul principal după cum putem observa în Figura 64.

Continuăm prin a implementa animația imaginilor, astfel vom selecta fiecare imagine în parte și vom adăuga în panoul de setări o componentă nouă de tip Button(Script). Din această componentă vom modifica proprietatea "Transition – Color Tint" în "Transition – Animation" pentru a putea construi animația, după cum putem observa în figura 65:

Ne interesează ca, în momentul în care cursorul mouse-ului trece peste imagine, aceasta să iasă în evidență prin redimensionare. Pentru a implementa animația vom selecta din panoul de setări în cadrul componentei Button(Script) opțiunea Auto Generate Animation, aceasta va genera o animație goală ce ne va permite să construim tipul de animație care face imaginea să iasă în evidență în momentul în care cursurul mouse-ului trece peste ea. Vom crea o animație nouă din meniul Window – Aplication iar din fereastra deschisă selectăm modul Highlighted. Adăugăm o proprietate nouă a imaginii de tip "Rect Transform – Scale" ce ne va permite să redimensionăm imaginea în interiorul Canvas-ului.

Ștergem ultimul cadru cheie deoarece dorim ca animația să nu se repete și modificăm ca animația să se ruleze la 5 cadre pe secundă. La secunda 0 adăugăm un cadru cheie (Keyframe) și tot la secunda 0 vom redimensiona imaginea și vom adăuga un cadru cheie după cum putem observa în figura 66.

Având cele două scene de lucru create mai este necesar să setăm ordinea în care să ruleze în momentul în care pornește aplicația și să creăm un script Java pentru tranziția dintre cele două scene. Pentru a atribui ordinea în care rulează cele două scene este necesar să:

Deschidem prima scenă în care am creat cele 3 butoane Play/Options/Exit.

Din meniul File selectăm opțiune Build Settings.

Din fereastra deschisă selectăm butonul Add Current care va adăuga automat scena în care ne aflăm ca și nivel 0 de unde aplicația va porni, după cum putem observa în Figura 58.

Alegem platforma de dezvoltare (în cazul nostru Windows) și numărul de biți pe care acesta va lucra(în cazul nostru 32 sau 64 biți).

Deschidem cea de-a doua scenă ce reprezintă meniul de selecție al nivelelor.

Din meniul File selectăm opțiune Build Settings.

Din fereastra deschisă selectăm butonul Add Current care va adăuga automat scena în care ne aflăm ca și nivel 1 după cum putem observa în Figura 67.

Dorim ca, la apăsarea butonului Play, aplicația să încarce automat scena de lucru, unde putem să selectăm nivelul pentru a putea intra în joc, pentru aceasta fiind necesar să implemenăm un script Java care să permită acest lucru.

Javascript-ul care face posibilă tranziția dintre cele două scene este prezent în Figura 68. Scriptul apelează prin funcția LoadScene() încarcarea nivelului 1 atribuit în fereastra Build Settings (Fig. 67).

Pentru a pune scriptul în funcțiune este necesar ca să atașăm butonului scripul necesar folosind procedura Drag&Drop și, din panoul de comandă în secțiunea Button(Script) -OnClick() în spațiul unde apare "None" să adăugăm butonul Play. Acesta ne va permite să apelăm funcțiile scriptului atașat butonului și deasemenea din acesta să apelăm funcția care implică încărcarea nivelului, în cazul nostru LoadScene(), după cum observăm în Figura 69.

În momentul lansării aplicației la apăsarea butonului Play acesta va încarca scena în care apare meniul de selectarea a nivelelor. Scripturi auxiliare pentru dezvoltarea aplicației:

Script pentru închiderea aplicației este format din funcția ExitGame() prin care apelăm închiderea aplicației prin procedura Application.Quit() după cum putem observa în Figura 70.

Scriptul care ne permite să ne întoarcem la meniul anterior este identic cu cel din Figura 59 doar că, în cazul nostru butonul Back va încarca nivelul 0 care reprezintă meniul principal.

Scriptul pentru opțiuni va fi creat prin crearea unei scene noi legată prin butonul Options de interfața grafică care va conține 7 butoane din care 6 butoane reprezintă cele 6 tipuri ale calității video a jocului:Fantastic,Beautiful,Good,Simple,Fast și Fastest. Cel de-al 7-lea buton este buton Back care ne va permite să ne întoarcem în meniul principal. Scriptul Java, care permite schimbarea calității video a aplicației,se implementează printr-o funcție Quality în care vom apela o secvență de instrucțiuni "QualitySettings.SetQualityLevel(QualityLevel.TipCalitate)" unde TipCalitate (Fig. 71) este tipul de calitate care va fi schimbată la apăsarea butonului.

Soluții pentru implementarea scripturilor Java necesare în spațiile tridimensionale

În acest capitol ne propunem să începem construirea scripturilor Java necesare pentru finalizarea aplicației a unui joc 3D care are ca element principal un automobil dar pentru început trebuie să setăm elementele principale pentru care vom crea scripturi în Unity3D.

Știm că automobilul este format din 5 elemente (caroserie și 4 roți) toate grupate în același GameObject denumit în scenele de lucru "mașina" în cadrul următoarelor subcapitole vom atribui componente noi acestor obiecte pentru a construi diferite scripuri Java.

Setarea automobilului în Unity3d pentru implementarea unui script simplu Java pentru mobilitatea acestuia

Setarea automobilului în Unity3D se face după ce am adăugat automobilul în fiecare scenă de lucru reprezentată de un nivel de joc :

Scenă de lucru 1 spațiul tridimensional urban reprezentat prin nivelul jocului "Circuit"

Scenă de lucru 2 spațiul tridimensional rural reprezentat prin nivelul jocului "Free Drive"

Scenă de lucru 3 spațiul tridimensional mixt reprezentat prin nevelul jocului "Sprint"

După adăugarea automobilului în scenele de lucru vom atribui automobilului două componente noi asupra elementului principal ce conține elemente automobilului:

O componentă collider de tip Box Collider pe care îl vom redimensiona pentru a lua forma GameObject-ului, mașină (Fig. 72) deoarece automobilul este format din mai multe componente iar Box Collider-ul nu ia forma acesteia automat. Adăugăm acest collider deoarece dorim ca automobilul să aibă o coliziune fizică cu toate elementele din spațiile tridimensionale.

O componentă de tip Rigidbody (Fig. 72) asupra GameObject-ului, mașină care ne va permite posibilitatea mișcării acestuia folosind motorul grafic Unity3D. Fară a adăuga un script Java asupra unui obiect care are o componentă Rigidbody acesta va fi tras în jos de gravitație și va reacționa la coliziuni cu obiectele pe care le întâlnește dacă există aplicată o componentă de tip Collider.

În continuare vom implementa un script Java pentru a permite mișcarea automobilului în fiecare dintre scenele de lucru construite anterior. Vom trata automobilul ca un obiect tridimensional oarecare și vom implementa un script simplu pe baza mișcării unui obiect tridimensional de-a lungul axei X și rotindul în jurul axei Y(Fig. 73).

Vom seta două valori inițiale corespunzătoare vitezei cu care se va mișca obiectul tridimensional și vitezei de rotație a acestuia definite ca "viteza_mașină" și "viteza_rotatie". În cadrul funcției Update construim două variabile de tip float translatie și rotatie care sunt implementate selectând axa verticală Y și axa orizontală X și înmulțind cu viteza obiectului tridimensional viteza_masina respectiv cu viteza sa de rotație viteza_rotatie. Pentru a implementa mișcarea și rotația obiectului tridimensional în scena de lucru în cadrul funcției Update apelăm două proceduri de tip transform de unde vom alege proprietățiile de rotație și de poziție, în cazul rotației funcția transform.rotate care va învârti obiectul tridimensional în jurul axei Y cu viteza de rotație definită anterior și în cazul mișcării funcția transform.position care va mișca obiectul tridimensional pe axa X cu viteza definită anterior înmulțită cu Time.deltaTime care ne permite să mișcăm un obiect tridimensional cu o viteză viteză constantă.

Implicit fără a aduce alte modificari scriptului de mai sus programul utilizeazș tastele direcționale pentru mișcarea și rotirea automobilului în scena de lucru. Vom atribui automobilului scriptul implementat folosind procedura Drag&Drop a scriptului asupra elementului principal care conține elementele automobilului. În momentul rulării aplicației în modul Play automobilul se va mișca și roti în scena de lucru.

Acest script nu reproduce mișcarea si rotația automobilului realist după cum știm că se întamplă în mod obișnuit mișcarea dându-ne impresia de "efect de patinaj".

Setarea automobilului în Unity3d pentru implementarea unui script complex Java pentru mobilitatea acestuia

Știind că automobilul este format din caroserie și 4 roți toate grupate în același GameObject pentru a crea un script Java complex în Unity3D trebuie să atribuim automobilului în scenele de lucru următoarele componente asupra GameObject-ului, mașină:

O componentă collider de tip Box Collider pe care îl vom redimensiona pentru a lua forma GameObject-ului, mașină (Fig. 72) deoarece automobilul este format din mai multe componente iar Box Collider-ul nu ia forma acesteia automat. Adăugăm acest collider deoarece dorim ca automobilul să aibă o coliziune fizică cu toate elementele din spațiile tridimensionale.

O componentă de tip Rigidbody (Fig. 72) asupra GameObject-ului, mașină care ne va permite posibilitatea mișcării acestuia folosind motorul grafic Unity3D. Fară a adăuga un script Java asupra unui obiect ce are o componentă Rigidbody acesta va fi tras în jos de gravitație și va reacționa la coliziuni cu obiectele pe care le întâlnește dacă există aplicată o componentă de tip Collider.

Pentru fiecare roată în parte o componentă de tip Wheel Collider ce ne va permite să avem o coliziune fizică precisă fără a da impresia "efectului de patinaj" pe care îl găsim în cazul scriptului simplu descris anterior. Vom adăuga un nou GameObject pe care îl vom redenumi "Collider_roti" în care vom copia toate roțiile și apoi fiecare roată în parte o vom adăuga într-un GameObject pe care il vom redenumi după poziția fiecărei roți (SF – stânga față/ DF – dreapta față / SS – stânga spate / DS – dreapta spate). Vom șterge cele 4 roți copiate anterior din fiecare GameObject și vom selecta toate elementele GameObject denumite după poziția roțiilor și le vom adăuga o componentă nouă de tip WheelCollider(Component – Physics – WheelCollider). Din panoul de setări vom modifica raza componentelor de tipul WheelCollider și le vom mișca pe axele de coordonate astfel încât să se potrivească perfect pe cele patru roți ale automobilului. După ce am atribuit toate elementele de mai sus, automobilul din scena de lucru și elementele din ierarhie vor arăta ca în Figura 74.

Vom crea un script Java nou pe care îl vom numi "script complex". Vom declara cele patru componente de tip WheelCollider pe care le vom atribui apoi scriptului Java și o variabilă vitezamax ce reprezintă viteza de mișcare a automobilui în scena de lucru. Vom schimba funcția Update în funcția FixedUpdate deoarece Update poate fi apelată doar o singura dată pe cadru iar funcția FixedUpdate poate fi apelată de mai multe ori în același cadru. În cadrul funcției Start vom defini centrul de greutate al automobilului care are setată o componentă de tip Rigidbody pentru a face automobilul stabil în momentul în care virăm în curbe. Funcția Start este apelătă o singură dată pe cadru în momentul în care scriptul rulează și efectuează toate comenzile din cadrul funcției imediat înainte de funcția Update.

În cadrul funcției FixedUpdate vom apela componentele de tip WheelCollider definite anterior pentru roțile din spate și proprietatea componentelor de tip WheelCollider denumită motorTorque care reprezintă cuplul motor pe axa roții exprimată în metri Newton pe care o vom înmulți cu axa verticală (Fig. 75). Tot în cadrul funcției FixedUpdate vom apela componentele de tip WheelCollider definite anterior pentru roțile din față și proprietatea componentelor de tip WheelCollider denumită steerAngle ce reprezintă direcția unghiului măsurat în grade în jurul axei Y pe care îl vom înmulti cu axa verticală (Fig. 75).

După ce am salvat scripul Java este necesar să îl aplicăm folosind procedura Drag&Drop peste GameObject-ului, mașină. Odată aplicat în panoul de setări vor apărea imediat cele patru variabile declarate la începutul scriptului ce reprezintă cele patru componente de tip WheelCollider. Este absolut vital să adăugăm în spațiul rezervat fiecarei roți tipul de Collider corespunzător (Fig. 76) :

Roata_SF – Whell Collider – SF- stânga față

Roata_DF – Whell Collider DF – dreapta față

Roata_SS – Whell Collider SS – stânga spate

Roata_DS – Whell Collider DS – dreapta spate

În momentul testării aplicației vom observa că automobilul se mișcă și virează realistic dar nu scade viteza atunci când nu accelerăm și nu frânează. Pentru a fixa această problemă este necesar să modificăm scriptul anterior.

Pentru a schimba scriptul anterior care îi oferă automobilului mobilitate ca să își modifice viteza de deplasare în cazul în care nu accelerăm vom adăuga o variabilă nouă pe care o vom numi "scadeviteza".

În cadrul funcției FixedUpdate vom verifica dacă butonul tastaturii care ne permite să ne deplasăm este apăsat sau nu, în cazul în care nu este apăsat viteza scade iar în cazul în care buton este apăsat viteza nu scade. Vom implementa acestă procedură într-un if folosind proprietatea componentei de tip WheelCollider denumită brakeTorque ce ne permite să reducem viteza de deplasare a automobilului (Fig. 77).Pentru a adăuga automobilului proprietatea de a frâna vom modifica scriptul anterior prin adăugarea unei variabile vitezadefrane de tip float ce reprezintă viteza cu care autovehiculul va frâna și variabila frana de tipboolean pe care o declaram false. Tipul boolean definește un tip de variabilă care poate fi adevărată sau falsă, folosim boolean pentru a permite și detecta dacă utilizatorul a urmat un set de instucțiuni care conduc la un rezultat clar.

Construim o funcție franare care verifică, cu ajutorul lui if, dacă utilizatorul a apăsat sau nu tasta Jump corespunzătoare butonului Space de pe tastură. În cazul în care butonul a fost apăsat automobilul va frâna, altfel își va continua drumul inițial. Dacă utilizatorul a frânat se apelează proprietatea componentei de tip WheelCollider denumită brakeTorque care ne permite să reducem viteza de deplasare a automobilului. În același timp este necesar să definim și proprietatea componentelor de tip WheelCollider denumită motorTorque ce reprezintă cuplul motor pe axa roții exprimată în metri Newton să fie egală cu zero, fapt ce prezintă că în momentul frânării automobilul nu va accelera.

Implementarea unui script ce urmărește mișcările automobilului folosind camera

Vom crea un script pe care îl vom numi "camerascript" unde vom implementa un script Java ce permite camerei să urmărească un obiect tridimensional în scena de lucru. Pentru început vom defini următoarele variabile prezentate succint în Tabelul 9.

Tabel 9 – Definirea variabilelor pentru implementarea unui script ce urmărește miscările unui obiec în scena de lucru

Funcțiile Java folosite pentru a implementa scriptul care ne permite să urmărim un obiect tridimensinal în scena de lucru folosite în continuare sunt prezentate succint în Tabelul 10.

Tabel 10 – Secvențe de instrucțiuni complexe pentru implementarea unui script ce urmărește miscările unui obiec în scena de lucru

După definirea variabilelor și a secvențelor de instrucțiuni în cadrul funcției LateUpdate care este apelată în fiecare cadruvom poziționa camera pe planul X-Z în spatele automobilului, vom seta de asemenea și înălțimea la care este poziționată camera și nu în ultimul rând vom seta camera să se privească mereu către obiectul țintă folosind funcțiile de tip transform după cum putem observa în figura 79.

În continuare ne propunem sa implementăm o funcție Java care să permită rotirea camerei în sens invers miscării obiectului tridimensional țintă si care să îsi schimbe câmpul de vizualizare și distanta fată de obiectul țintă care se va afla în miscare. De asemeanea dorim să creăm un efect de micșorare a elementele din scena de lucru atunci când obiectul tintă se deplasează cu viteza.

În cadrul funcției FixedUpdate vom adăuga o variabila viteza_locala ce este egală cu funcția InverseTransformDirection care transformă direcția vectorului viteză a componentei RigidBody a automobilului. Dacă viteza_locală este mai mică decât -0,5 camera se va întoarce la 180 de grade în jurul axei Y iar dacă viteza este mai mare decât -0,5 camera își va urmări ținta după cum putem observa în figura 79.

Vom construi în corpul funcției FixedUpdate o variabilă acceleratie care este egală cu valoarea lungimii vectorului viteză a componentei RigidBody a automobilului. Vom seta suprafața de vizualizare a camerei ca fiind egală cu variabila campdevizualizareCamera pe care o vom declara înaintea funcției LateUpdate adunată cu valoarea înmulțirii dintre variabila acceleratie și variabila zoom după cum putem obseva în figura 79.

Implementarea unui script Java ce permite roților să se învârtă

Ne propunem să implementăm un script Java ce va permite roților să se învârtă, astfel vom modifica scriptul Java complex pentru mobilitatea automobilului în scena de lucru (fig. 75). Vom adăuga patru variabile de tip Transform corespunzatoare celor patru roți.

Vom crea o funcție Updateunde vom defini fiecare roată ca și un vector format din axa X definită prin WheelCollider-ul roții pe care dorim să o învârtim cu proprietatea rpm a WheelCollider-ului ce reprezintă viteza de rotație a acestuia împarțit la 60 înmulțit cu 360 de grade și cu Time.deltaTime deoarece dorim să învârtim fiecare roată cu viteză constantă, axa Y si axa Z au valoarea 0 (fig. 80). Repetăm procesul pentru fiecare roată în parte. După ce am salvat scriptul selectăm automobilul și adăugăm în panoul de setări cele patru elemente tridimensionale corespunzătoare celor patru roți.

Implementarea unui script pentru sistemul de calcul al circuitului urban care reprezintă scena nivelului circuit

Nivelul circuit oferă posibilitatea utilizatorului de a rula aplicația în scena de lucru a mediului urban și este necesară implementarea unui script Java ce poate număra de câte ori utilizatorul a înconjurat circuitul cu automobilul pentru finalizarea nivelului. Astfel vom adăuga în scenă următoarele elemente :

O componentă UI de tip Text de unde vom șterge elementul Canvas adăugat automat în momentul adăugării în scenă a componentei Text. Vom aduce modificări asupra proprietățiilor din panoul de setări de unde vom șterge elementul Text(Script),Canvas Renderer și Rect Transform și vom adăuga în locul lor o componentă de tip Text Mesh care va contine textul "Checkpoint: 0 Lap: 0" și o componentă de tipul Mesh Renderer.Vom trage textul folosind procedura Drag&Drop asupra camerei. Vom poziționa textul folosind unelte de tip Transform astfel încât camera să îl randeze în același timp cu automobilul.

Un GameObject gol în care vom adăuga patru elemente tridimensionale de tip cub ce vor reprezenta punctele de control ale traseului.Vom poziționa cele patru cuburi în apropierea drumului și vom modifica dimensiunea componentei Box Collider astfel încat să treacă peste toată porțiunea de drum din acea zonă. Vom bifa proprietatea Box Collider-ului denumită Is Trigger pentru a putea folosi componentele de tip Box Collider asemănator unor întrerupătoare în implementarea scriptului.

Implementăm un script Java pentru a adăuga cele patru puncte de control ca și elemente de tip Transform, totodată vom adăuga și două variabile de tip integer denumite punctedecontrolcurent și etapacurenta ce reprezintă numărul punctelor de control prin care automobilul va trece respectiv numărul de etape pe care automobilul le-a efectuat asupra traseului pe care le vom inițializa cu 0 după cum putem observa în figura 81.

În continuare vom implementa scriptul principal care va număra de câte ori automobilul trece prin cele 4 puncte de control dacă automobilul a trecut o dată prin toate punctele de control etapa curentă se va modifica și va avea valoare 2. Vom declara o variabila de tip Transform denumită playerTransform unde vom stoca componenta punctului de control. În cadrul funcției Start vom seta automobilul prin căutarea acestuia în scena curentăîn cazul în care acesta nu se află în scenă cele doua variabile puncte de control și numărul de etape nu vor înregistra nicio acțiune chiar dacă există automobile în scenă care au trecut prin cel puțin un Box Collider. Vom seta o funcție OnTriggerEnter ce ne va permite să folosim cele patru Box Collidere adăugate anterior ca pe niște întrerupătoare. Cu ajutorul acestor collidere vom contoriza fiecare trece a automobilului prin punctele de control și de asemenea vom contoriza momentul în care automobilul a terminat un contur închis al traseului. Folosim funcția if pentru a verfica dacă numărul puncte de control este egal cu numărul collider-elor adăugate în scena de lucru. În cadrul acestui if vom adăuga încă unul care să ne permită să verificăm cantitatea punctelor de control. Mai adăugăm un if care ne permite să adăugăm o valore variabilei etapacurenta, daca variabila puncte de control este egală cu 0 dacă acest lucru este adevărat variabilele etapacurenta și punctdecontrol li se adună +1, altfel variabila punct de control este 0. Pentru a modifica textul ca să prezinte exact ceea ce am înregistrat pe parcursul traseului vom apela o functie Camera.main ce ne permite să accesăm camera principală a scenei de lucru de unde alegem componenta Text de tip TextMesh cu ajutorul funcției GetComponentInChildren care va fi egală cu textul "Checkpoint:" plus numărul curent al punctelor de control plus textul "Lap:" adunat cu numărul etapei curente.

Implementarea unui script pentru sistemul de calcul al circuitului mixt care reprezintă scena nivelului sprint

Nivelul sprint oferă posibilitatea utilizatorului de a rula aplicația în scena de lucru a mediului mixt și este necesară implemntarea unui script Java care poate sesiza momentul în care automobilul ajunge la capătul cursei. Astfel vom adăuga în scenă un GameObject gol în care vom adăuga un element tridimensional de tip cub care va reprezenta punctul de control al traseului în momentul finalizării cursei. Vom poziționa cubul la sfârșitul drumului și vom modifica dimensiunea componentei Box Collider astfel încât să treacă peste toată porțiunea de drum din acea zonă. Vom bifa proprietatea Box Collider-ului denumită Is Trigger pentru a putea folosi componentele de tip Box Collider asemănător unor întrerupătoare în implementarea scriptului. Vom folosi scriptul Java pentru a adăuga punctul de control ca și elemente de tip Transform creat anterior (fig. 81).Vom folosi scriptul de calcul al circuitului urban (fig. 82) pentru a realiza nivelul sprint. Este necesar să construim un meniu care să apară în momentul finalizării cursei.

Implementarea unei scene si a unui script pentru meniul de final în cazul nivelurilor circuit, sprint și free drive

Este nevoie să construim o scenă nouă care să conțină două butoane și un element de tip text. Vom adăuga butoanelor un efect de evidențiere în momentul în care cursorul mouse-ului va trece peste ele. Fundalul scenei îl vom seta din panoul de setări al camerei principale în cadrul proprietății Clear flags vom alege Solid Color și culoarea neagră din meniul Background. Vom aduce modificări scripturilor nivelului circuit (fig. 83) și nivelului sprint (fig. 84) pentru a încărca scena meniului final în momentul în care automobilul ajunge la finalul traseului.

În cazul nivelului circuit vom adăuga la sfârșit după ultima funcție urmatoarele linii de cod ce reprezintă momentul în care utilizatorul ajunge la a treia cursă circuit aplicația va încărca meniul de final.

În cazul nivelului sprintvom adăuga la sfârșit după ultima funcție urmatoarele linii de cod ce reprezintă momentul în care automobilul atinge collider-ul de tip Box și aplicația încarcă meniul de final.

În cazul nivelului de tip free drive vom crea o scenă nouă, identică cu cele folosite pentru nivelul circuit și sprint și vom implementa un script java care va deschide scena nou creată prin apăsarea butonului "P" în timp ce aplicația rulează. Vom adăuga o variabilă pauseGame pe care o vom declara inițial falsă și în cadrul funcției FixedUpdate punem condiția ca în momentul apăsării butonului Pause corepunzător butonului de pe tastatură "P" variabila pauseGame devine adevărată. Dacă variabila pauseGame este adevărată atunci va încărca scena 8 care reprezină meniul final pentru nivelul free drive.

Metode de testare pentru imbunatatirea calitatii jocului

Folosim metode de testatare pentru asigurarea calității unei aplicații deoarece ne dorim o aplicație stabilă care răspunde în timp util la comenzile utilizatorului și în cadrul căreia nu gasim erori de programare și proiectare. Metodele de testare folosite în industria jocurilor video sunt următoarele:

Teste de performanță

Teste de stabilitate

Teste de funcționalitate

Testare automată

Testare liberă

Testele de performanță sunt folosite pentru măsurarea vitezei de calcul a aplicației, pentru măsurarea resurselor necesare funcționării aplicației, pentru măsurarea timpului de răspuns din momentul începerii unei acțiuni până în momentul în care aceasta sa finalizat. Un model al unui test de performanță este prezentat succint în tabelul 11.

Tabel 11 – Modelul unui test de performanță

Testele de stabilitate sunt folosite pentru verificarea stabilității jocului adică dacă acesta se blochează în momentul în care rulează în diferite niveluluri de joc. Un model al unui test de stabilitate este prezentat succint în tabelul 12 unde PASS reprezintă dacă nivelul de joc a trecut testu iar FAIL reprezintă daca nivelul de joc a picat testul.

Tabel 12 – Modelul unui test de stabilitate

Diagrama 1 – Rezultatele testului de stabilitate

Din testul de stabilititate concluzionăm ca în timp nivelului de joc Circuit aplicația sa blocat o singură dată, în timp nivelului de joc Sprint aplicația sa blocat de două ori iar în timp nivelului de joc Free Drive aplicația nu a întâmpinat probleme. În cazul nivelurilor de joc Circuit și Sprint vom retesta prin pașii care au dus la blocarea jocului problemele apărute și în cazul repetării acestora vom aduce modificări aplicației astfel încat jocul să permită o bună funcționare.

În testele de funcționalitate vom testatoate meniurile și toate butoanele ce permit tranziții catre alte elemente din joc ce pentru a ne asigura că totul funcționează în mod corespunzător fară a crea probleme de funcționalitate.

Testare automată constă în conceperea unor scripturi ce realizează testele de performană, stabilitate și funcționalitate în mod automat fără a fi nevoie de mâna omului pentru strângerea rezultatelor acestor teste.

Testare liberă reprezintă timpul petrecut rezervat testării ce implica creativitate persoanei care testează aplicația.Persoana care testează aplicația poate încerca prin orice metodă să blocheze jocul astfel încât la sfârsit să obținem o aplicație stabilă care răspunde în timp util la comenzile utilizatorului și în cadrul căreia nu gasim erori de programare și proiectare.

Adaugarea elementelor audio

Pentru a atribui un element audio unui obiect tridimensional în Unity3D este necesar să adăugăm din panoul de setări obiectului tridimensional o componentă nouă de tip Audio Source(figura. 86)care va permite rularea unui fișier audio atât timp cât elemtentul tridimensional ce are atribuit compontenta de tip Audio Sourceexistă în șcenă.

În cazul nostru după ce am adăugat automobilului o componentă de tip Audio Sourcevom adăuga fisierul audio în spațiul AudioClip folosind procedura Drag&Drop și vomactiva setarea Looppentru a permite fisierului audio să se repete atât timp cat automobilul este prezent în șcena de lucru. În momentul în care aplicația va rula în modul play fișierul audio se va repeta continuu atât timp cât automobilul este în șcenă.

Inteligența artificială. Adăugarea unui automobil autonom care rulează nivelurile de joc în mod automat

Pentru a crea un script ce permite unui automobil să ruleze autonom nivelurile de joc este nevoie să adăugăm în scene de lucru următoarele elemente pe care le vom programa ulterior:

Un nou GameObjectgol în care vom adăuga patru elemente tridimensionale de tip cub ce vor reprezenta punctele de control ale nivelului de joc.Vom poziționa cele patru cuburideasupra drumului la o distanță diferită fată de punctele de control definite pentru sistemul de calcul al nivelelor de joc circuit și sprint.Vom bifa proprietatea Box Collider-ului denumită Is Trigger pentru a putea folosi componentele de tip Box Collider asemănator unor întrerupătoare în implementarea scriptului.

Vom adăuga în scenă încă un automobil identic cu cel pe care îl controlăm căruia îi vom schimba culoarea.

Vom adăuga un nou GameObjectgol în ierarhie pe care îl vom numi CursaAI în care vom adăuga mai multe elemente de tip GameObjectcu ajutorul cărora vom trasa drumul pe care automobilul autonom îl va urma.

În cadrul elemenlui principal masinaAIce reprezintă automobilul autonom vom adăuga un element tridimensional de tip cub căruia îi vom modifica din panoul de setări componenta de tip Box Collider astfel încat aceasta să atingă punctele de control ale nivelului de joc adăugate anterior. Cubul va reprezenta senzorul automobilului autonom ce va trimite utilizatorul într-o scenă nouă în cazul în care acesta a pierdut nivelul de joc.

Pentru a trasa drumul pe care automobilul autonom îl va urma este necesar să constuim un script Java care îl vom atribui Gameobject-ului CursaAI. Scriptul Java ne va permite prin adăugarea unor elemente de tip GameObject să construim drumul automobilului autonom.Scriptul permite trasarea între două elemente de tip GameObject o linie dreaptă pe care ulterior le vom programa astfel încât automobilul autonom să le urmeze.

Vom implementa scriptul Java prin definirea a două variabile : o variabilă cale de tip Arrayce ne permite să stocăm mai multe obiecte într-o singură variabilă și o variabilăculoareliniecu ajutorul căreia vom seta culoare dintre două elemente de tip GameObject. Funcția OnDrawGizmos() ne permite să alegem rapid obiectele din șcena de lucru.În cadrul funcției OnDrawGizmos()vom defini o variabilă obiecte_calede tip Array care va fi egală cu toate componentele de tip Gameobject din Gameobject-ul CursaAIpe care le vom mișca folosind uneltele de tip Transform. Astfel funcția GetComponentsInChildren(Transform) va returna variabilei obiecte_cale toate obiectele de tip GameObject asupra cărora au fost aduse modificări folosind unelte de tip Transform. Variabila cale va fi egală cu un nou Array ce ne permite să stocăm obiectele de tip GameObject. Într-un forvom defini o variabilă nouă numită obiect_cale ce reprezintă toate elementele de tip GameObject asupra căruia am utilizat unelte de tip Transform care se află în GameObjectul principal CursaAI. Pentru momentul în cât vom avea cel putin un GameObject asupra caruia am utilizat unelte de tip Transformîn cadrul GameObject-ului principal CursaAI vom executa o funcție de tip if care verifică dacă asupra variabilei obiect_cale(ce reprezintă toate elementele de tip GameObject din cadrul GameObject-ului principal CursaAI) au fost aduse modificări de tip Transform.Dacă nu au fost aduse modificări de tip transform asupra elementelor de tip GameObject din cadrul GameObject-ului principal CursaAIvariabila cale[cale.lenght] de tip Arrayunde cale.lenght

reprezintă lungimea variabilei cale (inițial aceasta va fi 0) va fi egală cu obiect_calece reprezintă numărul elementele de tip GameObject din cadrul GameObject-ului principal CursaAI.

În continuare vom implementa o funcție for unde vom defini variabilă i ca va fi egală cu 0 și mai mică decât lungimea variabilei cale ce este egală cu numărul elementele de tip GameObject din cadrul GameObject-ului principal CursaAI și unde vom mări variabila i cu o unitate de fiecare dată când apelăm funcția for.În cadrul funcției for vom defini o variabilă posce va reprezenta poziția inițială a unui element de tip GameObject din cadrul GameObject-ului principal CursaAI de tip Vector 3(ce permite reprezentarea vectori 3D și a punctelor )care va fi egală cu valoarea poziției fiecărei variabile calepentru fiecare element de tip GameObject din cadrul GameObject-ului principal CursaAI. Dacă variabila i este strict mai mare ca 0 atunci vom defini o variabilăpos_antce va fi reprezentată prin poziția anterioară elementului de tip GameObject din cadrul GameObject-ului principal CursaAI. Vom trasa o linie între variabila pos_antce reprezintă poziția initială și variabila pos folosind funcția Gizmos și vom desena o sferă cu raza de 0,3 în jurul variabile pos ce reprezintă poziția inițială elementului de tip GameObject din cadrul GameObject-ului principal CursaAI. Scriptul ce face posibilă trasarea unei linii între două elemente de tip GameObject poate fi regăsit în figura .

Figură 87Scriptul Java ce face posibilă trasarea unei linii între două elemente de tip GameObject

În ierarhie vom crea un GameObject gol pe care îl vom numi CursaAIpeste care vom trage folosind procedura Drag&Drop scriptul creat anterior (figura 87).În cadrul GameObject-uluiCursaAIvom adăuga în ierarhie elemente de tip GameObject pe care le vom muta folosind uneltele de tip Transform prea a crea traseul automobilului autonom ce va fi controlat de calculator. După ce am adăugat fiecare element de tip GameObject în cadrul GameObject-ului principal CursaAI și am format un contur închis al traseului acesta va arata ca în figura.

Scriptul ce va permite automobilului autonom să citească traseul este prezentat în figura 89.În cadrul funcției GetPathvom defini o variabilă obiecte_calede tip Array ce reprezintă toate elementele de tip GameObject asupra căruia am utilizat unelte de tip Transform care se află în GameObjectul principal CursaAI.Variabila cale va fi egală cu un nou Array ce ne permite să stocăm obiectele de tip GameObject.

Într-un forvom defini o variabilă nouă numită obiect_cale ce reprezintă toate elementele de tip GameObject asupra căruia am utilizat unelte de tip Transform care se află în GameObjectul principal CursaAI. Pentru momentul în cât vom avea cel putin un GameObject asupra caruia am utilizat unelte de tip Transformîn cadrul GameObject-ului principal CursaAI vom executa o funcție de tip if care verifică dacă variabilei obiect_caleaparține elementului de tip GameObject principal CursaAI.Dacă variabilei obiect_caleaparține elementului de tip GameObject principal CursaAIvariabila cale[cale.lenght]unde cale.lenghtreprezintă lungimea variabilei cale (inițial aceasta va fi 0) va fi egală cu obiect_calece reprezintă numărul elementele de tip GameObject din cadrul GameObject-ului principal CursaAI.

În continuare vom crea un script care să permită mobilitate automobilului autonom asemănător cu scriptul complex creat anterior (figura 78). Vom declara variabilele prezentate în figura

Vom adăuga scriptul ce permite automobilului autonom să citească traseul creat.În cadrul funcției Updatevom apela funcțiile GetSteer și Movece permit automobilului să vireze și să se miște în nivelul jocului după cum putem observa în figura 91.

Concluzii

În concluzieprin mixajul motorului grafic Unity3D cu programul Cinema 4D" am reușit să prezentăm modalitățiile prin care pot fi create mai multe spații tridimensionale într-un mod simplu și ușor de înteles. Am folosit motorul grafic Unity3D pentru asamblarea spațiilor tridimensionale și implementarea scripturilor necesare în cadrul aplicației și programul de modelare grafică Cinema 4D pentru a modela fiecare element tridimensional ce contribuie la asamblarea spațiilor tridimensionale. Programul Unity3D este user-friendly, este ușor de folosit, foarte intuitiv, iar timpul necesar pentru a creea o aplicație este foarte mic datorită elementelor care sunt puse la dispoziția programatorului în cadrul programului. Programul Cinema 4D este de asemenea user-friendly și timpul de modelare este unul scurt comparativ cu alte programe din gama sa iar rezultatele finale sunt de o calitatea superioară față de alte programe asemănătoare.

Am reușit să dezvoltăm un joc tridimensional îmbinând cele două programe prin implementarea în Unity3D unor scripturi:

ce permit mobilitatea unui automobil folosind tastele direcționale

ce permit să urmărească miscările automobilului folosind camera

ce permit roților automobilului să se învârtă

ce permit setarea unui sistem de calcul pentru nivelurile de joc

În Cinema 4D folosind diferite metode de modelare am modelat elementelor spațiilor tridimensionale ce au fost asamblate în Unity3D precum:

automobilul

clădirile spațiilor tridimensionale

trotuarele și stâlpii de lumină ai spațiului urban

Unity3D permite de asemenea modelarea spațiului tridimensional în cadrul programului punând la dispoziția programului o gamă largă de unelte de modelare grafică. Mixând elementele implementate în cele două programare și adăugând elemente auxiliare folosind programul Unity3D am reusit să dezvoltăm o aplicație joc complet funcțională. Aplicația rulează în timp real constant la 60 de cadre pe secunde.

Interfața grafică (în engleză: Graphical User Interface sau GUI) reprezintă o interfață cu utilizatorulce are la bază un sistem de prezentare grafică ce conține imagini, butoane și alte elemente UI. Interfată grafică este legătura dinte aplicației și utilizator fără a prezenta elemente de programare și proiectare. În cadrul aplicației noastre am folosit element de UI(User Interface) pentru a dezvolta o interfată grafică pentru utilizator ușor de folosit și intuitivă care prezintă în mod direct toate elemente jocului.

În final, putem descrie mixajul programelor Cinema 4D și Unity3D ca fiind o modalitate practică și ușor de implementat a unei aplicații tridimensionale folosind cunoștințe minime de programare Java și care conține elemente de grafică avansată ce înglobează o aplicație stabilă și intuitivă de o calitate superioară din punct de vedere grafic

Bibliografie

(1). http://docs.unity3d.com/Manual/

(2). https://unity3d.com/learn/tutorials/modules

(3). WillGoldstone. Unity 3.x Game Development Essentials. Editura Paperback Publishing, Birmingham Decembrie 2011

(4). Ryan Creighton. Unity 4.x Game Development by Example. EdituraPaperback Publishing, Decembrie 2013

(5). http://www.design3.com/training-center/engines-sdks/unity

(6). Janine Suvak. Learn Unity3D Programming with UnityScript:Unity's JavaScript for Beginners.EdituraPaperback Publishing, August 2014

(7). http://www.walkerboystudio.com/wbstudio/learn-unity/

(8). http://www.cinema4dtutorial.net/

(9). http://www.digitaltutors.com/software/CINEMA-4D-tutorials

(10).http://greyscalegorilla.com/tutorials/

(11). Chris Martin. Learning Cinema4D R15. Editura Infinite Skills, Decembrie 2013

Similar Posts