Manipularea obiectelor în mediul virtual 3D prin programare în Java [304149]

[anonimizat]: AUTOMATICĂ ȘI INFORMATICĂ APLICATĂ

LUCRARE DE LICENȚĂ

COORDONATORI: ABSOLVENT: [anonimizat].dr.ing. [anonimizat].dr.ing. Paul Ciprian Patic

TÂRGOVIȘTE

IUNIE / IULIE 2013

Manipularea obiectelor în mediul virtual 3D prin programare în Java

MOTIVAREA ALEGERII TEMEI

Incă de la o varstă fragedă am fost pasionat de tehnologie și de metodele tehnologice care ajută omul în încercarea lui de a afla răspunsuri la toate întrebările. Interesul pentru programare și design m-a determinat să aleg tema pentru licență cu titlul „Manipularea obiectelor în mediul virtual 3D prin programare în Java”.

Am ales această temă cu gândul de a crea o aplicație care combină elemente din domenii variate ([anonimizat] 3D [anonimizat], algebră și geometrie în spațiu) rezultatul final fiind un program care necesită interacțiunea utilizatorului cu mediul virtual pentru a ilustra un concept ce poate fi aplicat în viitorul apropiat în industrie.

Limbajul Java, a [anonimizat]. Creatorii limbajului au avut ca scop implementarea unei mașini virtuale codul fiind asemănător limbajului C sau C++. Prin lansarea oficială a [anonimizat] 1995, Sun Microsystems a avut deviza „[anonimizat]” („Scrie o [anonimizat]”) , [anonimizat], siguranța și portabilitatea (independența de platforma de lucru) sunt câteva din caracteristicile care au avut ca efect creșterea rapidă a [anonimizat].

Java 3D API este o interfață pentru crearea de programe care interacționează cu grafica 3D, [anonimizat]-ul oferă o implementare la nivel grafic a [anonimizat]-uri precum OpenGL sau DirectX care se axează pe partea procedurală. Deși oferea o puternică modalitate de a interacționa in mediul 3D, din anul 2008 Java 3D nu a [anonimizat] a aplicațiilor 3D au avut de ales între a continua să utilizeze aceste librării deși deveneau învechite și a se orienta spre JOGL (Java Binding for the OpenGL API), motorul jMonkey Engine sau alte soluții. [anonimizat], întrucât acest motor beneficiază de o [anonimizat], este scris în Java (inclusiv platforma proprie de dezvoltare) și implementează tehnologia modernă de randare a mediului 3d (suportă inclusiv OpenGL4, iar randarea se face utilizând tehnologia „shader” care exploatează resursele plăcilor grafice pentru a calcula influențele efectelor și de a le crea mai realist).

Software-ul Autodesk 3Ds Max asigură o soluție completă de modelare 3D, animație sau randare pentru jocuri video sau chiar filme (filmele „Avatar” și „2012” conțin grafică generată pe computer cu ajutorul acestui program). Capabilitățile avansate de modelare, o [anonimizat]-uri și interpretorul MaxScript sunt cateva dintre avantajele acestei aplicații care este atât de populară în industria jocurilor video și a studiourilor de filme și televiziune.

[anonimizat]em robotizat pentru industria de automobile. Sunt luate în cosiderare apecte privind amplasarea, geometria în spațiu, recunoașterea coliziunilor sau restricții de deplasare și comandarea robotului. Ilustrarea conceptului utilizând realitatea virtuală are și rol de instruire a angajaților care vor întra in contact direct cu sistemul robotizat ce va fi implementat, dar și rol educațional, deoarece codul programului este grupat, documentat, iar obiectele și clasele folosite sunt denumite intuitiv pentru ca elevii/studenții să poată recunoaște cu mai multă ușurință partea de cod responsabilă pentru o anumită acțiune.

Primul capitol al acestei lucrări prezintă programul Autodesk 3Ds Max, modalitățile de realizare ale modelelor necesare aplicației și ale materialelor cu diferite caracteristici utilizate pentru a simula metalul, vopseaua metalizată, suprafețe mate etc.

Cel de-al doilea capitol își propune familiarizarea cu limbajul de programare Java, platforma jMonkeyEngine 3.0 și pachetele de clase utilizate pentru crearea aplicației.

Al treilea capitol prezintă studiul de caz al procesului ilustrat de aplicație. Obiectele modelate cu ajutorul 3Ds Max sunt manipulate cu ajutorul limbajului Java pentru a realiza obiectivele propuse.

Capitolul „Concluzii” prezintă avantajele unei aplicații de proiectare și simulare utilizând grafica 3D și, de asemnea, experiența acumulată pe parcursul a aproximativ opt luni de aprofundare a unor domenii strans legate de viitor și de tehnicile care vor ajuta în continuare omul în „setea” acestuia pentru cunoaștere.

Albert Einstein a susținut faptul că „Imaginația este mai importantă decât cunoașterea” și, în mare parte, sunt de acord întrucât fără capacitatea de a gândi neconvențional („thinking outside of the box”), rutina în care omenirea s-ar „dezvolta” poate fi o povară grea. Fără inovație dezvoltarea continuă a umanității ar înceta prematur, iar eu vreau și sper să contribui la acest proces cu un mare succes.

Capitolul I
Proiectarea obiectelor 3D în 3ds Max

1.1. Domeniul tridimensional și rolul 3ds Max

Autodesk 3ds Max, cunoscut până nu demult sub numele de 3D Studio Max, este un program de grafică 3D dezvoltat și distribuit de „Autodesk Media and Entertainment” și este folosit pentru a realiza modele tridimensionale și animații 3D. Este foarte popular in industria jocurilor video, dar și a filmelor. Surclasează majoritatea celorlalte programe la realizarea și animația obiectelor cu număr redus de poligoane („Low-Poly”), modelele realizate în acest fel ocupă un spațiu pe disc mult mai mic decât modelele proiectate cu o precizie ridicată și un număr de poligoane mai mare („High-Poly”). Acesta este principalul avantaj pentru industria jocurilor, întrucât este nevoie de obiecte cu forme cat mai apropiate de realitate, dar, în același timp, spațiul ocupat trebuie să fie minim pentru ca respectivul joc să aibă un timp scurt de încărcare, iar interacțiunea să se realizeze fără blocarea „frame-urilor”.

Ultimele versiuni ale programului includ tehnologia „shader” și metode precum „Ambient occlusion” (aproximează felul în care radiază lumina în realitate, în special la întâlnirea suprafetelor cu factor de reflexie mic) și „Subsurface scattering” (mecanism de simulare a luminii ce penetrează suprafețele transparente, se reflectă de mai multe ori la unghiuri diferite în interiorul materialului și trece din nou în exterior creând un efect realist).

3D Studio a fost proiectat inițial sub platforma MS-DOS, iar odata cu trecerea sub Windows, produsul a primit sufixul „Max”. Începând cu versiunea din 2009, produsul se numeste „Autodesk 3ds Max”.

În ultimii ani, în majoritatea domeniilor de activitate, se vorbește de mediul tridimensional, iar expresia „3D” este din ce în ce mai utilizată. Tendința actuală este de a transforma totul din 2D în 3D și exista o multitudine de exemple precum desene realizate de artiști geniali pe o simplă foaie de hârtie, dar care privită dintr-un anumit unghi, „păcălește” ochiul creând impresia unui obiect tridimensional sau chiar străzi întregi pictate în acest fel.

Grafica 3D reprezintă un domeniu în plină expansiune și cu un viitor promițător. Chiar și desenele animate adoptă noile metode de ilustrare cu ajutorul programelor profesionale de grafică 3D, iar vechea modalitate prin care erau realizate sute de mii de cadre desenate în creion pentru o animație de câteva minute a dispărut sau este doar o nișă caracterizată doar ca hobby pentru anumiți artiști.

„3D Computer Graphics” este un domeniu ce îmbină arta și tehnologia, devenind un tot unitar și cucerește mereu noi arii de utilizare. Este un mediu din ce în ce mai accesibil și permite utilizarea acestor tehnologii ca mijloc de pregătire, pentru realizări multimedia de produse, efecte speciale sau chiar recrearea actorilor (în principal, pentru a nu mai folosi cascadori care își riscă viața în realizarea scenelor spectaculoase) în producțiile cinematografice.

Deși este un domeniu cu un imens potențial, soluția pentru a continua evoluția este internetul, care va fi suportul tehnologiei 3D. Toate mijloacele de a trimite o informație, de la televiziune până la site-uri Web, vor cunoaște o schimbare radicală odată cu evoluția graficii 3D.

Vorbim de cât de atractiv este acest domeniu și toate ideile expuse tind să creeze o impresie generală excepțională pentru acest domeniu, însă există anumite aspecte care trebuie luate în considerare pentru a înțelege nevoile unei astfel de tehnologii pentru ca rezultatele să aibă efectul dorit.

În primul rând, nu atât prelucrările, cât renderizarea modelelor (scenelor) necesită resurse semnificative din partea sistemelor hardware pe care rulează aceste programe. Un exemplu elocvent este cunoscutul film „Transformers” care expune o acțiune science-fiction celebră (organisme robotice care au capacitatea de a lua forma unor diferite obiecte precum autovehicule, aeronave etc.). Detaliile modelelor, animațiile și efectele aplicate modelelor tridimensionale sunt de o complexitate foarte ridicată, lucrându-se luni de zile pentru a realiza un singur robot. Se folosesc computere cu specificații tehnice extraordinare, dotate cu ultimele modele ale celor mai performante procesoare, până la 64 GB de memorie RAM și plăci grafice de ultimă generație, iar în ciuda acestor resurse, dacă o scenă conține trei roboți, renderizarea unui singur cadru durează aproximativ 30 de ore (în condițiile în care filmul rulează, în general, la 25 până la 30 de cadre pe secundă).

Figura 1.1. Introducerea robotilor în cadrele filmate (sus) și renderizarea scenelor (jos)

În al doilea rând, cunoștințele necesare acestui domeniu includ o multitudine de alte domenii. Cunoșterea multor noțiuni de matematică sau fizică sunt obligatorii pentru realizarea modelelor tridimensionale, realizarea animațiilor cere noțiuni de mecanică pentru a ca mișcările să aibă un efect real. De asemenea, aplicarea/crearea materialelor și texturilor cer noțiuni de design și coloristică.

Soluția software Autodesk 3ds Max oferă arhitecților, proiectanților, inginerilor civili sau specialiștilor în domeniul vizualizării, un set complet de instrumente puternice ce ajută la transpunerea conceptelor și analiza cu precizie a efectelor iluminării naturale într-un mod rapid.

Modelarea poligoanelor este o noțiune specifică design-ului jocurilor decât orice alta tehnică. Implicit, se începe cu una din primitivele 3ds Max, apoi se folosesc instrumentele precum „bevel” sau „extrude”, se adaugă alte detalii și se rafinează modelul.

O alternativă la modelarea utilizând poligoane este un standard de modelare și design al suprafețelor numit „NURBS” (Non-Uniform Rational B-Splines). Această metodă nu necesită înțelegerea matematicii din spatele realizării obiectelor și este utilizată des datorită faptului ca obiectele pot fi manipulate ușor, interactiv.

Instrumentul de suprafețe a fost inițial un plug-in, dar fiind foarte practic, a fost adoptat ca utilitar inclus în software. Practic, se pot crea cateva linii (splines), apoi aplicând modifier-ul „Surface Tool” se crează o suprafață între acele linii. Este foarte util acest instrument pentru a realiza o suprafață ușor curbată, cu o geometrie simplă (altă metodă de realizare a unei sprafețe uniforme necesită mai mult timp). Acuratețea acestui instrument este foarte bună, manual nu se poate atinge această acuratețe a suprafeței.

Cel mai important aspect al acestui software, în opinia personală, o reprezintă posibilitatea de a face export modelului creat sub diferite extensii (de la extensiile cu care lucreaza 3ds Max și alte software-uri sub brand-ul Autodesk, până la extensia .obj, folosită pentru aplicația realizată sub limbajul Java).

1.2. Interfața 3ds Max 2010

3ds Max 2010 prezintă o interfață complexă și ușor schimbată față de versiunile precedente, oferind o nouă experiență îmbunătățită. Componentele acetei interfețe sunt:

Bara de Meniu;

Bara Principală cu Instrumente;

Viewport-urile (vederile);

Panoul de Comandă;

Instrumentele de Navigare;

Controlul Animațiilor;

Bara de Status;

MaxScript;

Figura 1.2. Interfața 3ds Max

1.2.1. Bara de Meniu

Bara de Meniu se află în partea superioară a ecranului, sub bara ce conține titlul fișierului deschis. Există 13 meniuri derulante, precum: File, Edit, Tools, Group, Views, Create, Modifiers, Animation, Graph Editors, Rendering, Customize, MaxScript și Help (figura 1.1.). Aceste meniuri vor fi utilizate pentru accesul al anumite comenzi necesare diferitelor procese de modelare.

Figura 1.0.3. Bara de Meniu

Meniurile din 3ds Max se comportă similar meniurilor de același tip din alte aplicații ce rulează sub Windows, astfel că:

Meniul File conține comenzi pentru organizarea fișierelor. Cu ajutorul acestui meniu se pot importa și exporta fișiere în formate precum: 3D Studio, Adobe Illustrator, AutoCAD, StereoLitho, VRML, OBJ etc.

Meniul Edit conține comenzi pentru selectarea și editarea obiectelor dintr-o scenă. Una dintre opțiunile des utilizate aflate în acest meniu se numește Clone și are ca rezultat realizarea unei copii perfecte (clonă) a obiectului selectat. Metoda de copiere prin clonare este folosită pentru a obține un număr mare de obiecte identice după un model dat;

Meniul Tools conține opțiuni de schimbare a poziției si management al obiectelor, în special, colecții de obiecte. Astfel, opțiunea Mirror realizează o poziționare sau o copie “în oglindă” a obiectului selectat, iar opțiunea Array are ca rezultat o matrice bidimensională sau tridimensională formată din copii ale obiectului;

Meniul Group conține funcții de grupare/degrupare ale obiectelor dintr-o scenă. Astfel, mai multe obiecte ce formează un ansamblu pot fi grupate, formând un grup de obiecte. Acesta se comportă în continuare ca un singur obiect putând fi deplasat în scenă în cadrul unei animații, clonat etc.

Meniul Views conține comenzi de setare și control a Viewport-urilor (vederilor). Unele dintre opțiunile prezente aici sunt accesibile și prin click dreapta pe numele portului;

Meniul Create oferă posibilitatea de a construi cele mai uzuale elemente geometrice (primitive de bază, primitive extinse, forme geometrice plane), lumini și sisteme de particule. Elementele geometrice reprezintă, în majoritatea cazurilor, punctul de pornire în modelarea unui obiect;

Meniul Modifiers conține lista celor mai des aplicați modificatori, organizați în submeniuri. În funcție de obiectul selectat, unele opțiuni din meniu vor fi active sau inactive.

Meniul Animation oferă un set de comenzi referitoare la animație, constrângeri si cinematică inversă;

Meniul Graph Editors oferă o modalitate directă de management a scenei create, a ierarhiilor dintre obiecte, a cadrelor animației, a materialelor cu care sunt mapate obiectele, a efectelor speciale etc.;

Meniul Rendering conține comenzile necesare pentru renderizarea scenei, setarea mediului ambient scenei, a efectelor speciale sau compunerea avansată a scenelor. De asemenea, în meniul Rendering se află editorul de materiale (Material Editor);

Meniul Customize conține cele mai uzuale comenzi pentru personalizarea interfeței cu utilizator (User Interface);

Meniul MaxScript conține toate elementele necesare realizării de script-uri, folosind limbajul intern al programului 3D Studio Max. Aceste script-uri automatizează unele secvențe din munca utilizatorului, regăsindu-se în modelare, animație, crearea materialelor si chiar renderizare. Limbajul MaxScript a fost proiectat special pentru a fi complementar programului 3D Studio Max, este orientat pe obiecte, iar sintaxa este destul de simplă pentru a fi accesibilă si celor mai puțin experimentați în programare;

Meniul Help oferă explicații detaliate asupra tuturor aspectelor legate de sintaxa comenzilor, caracteristicile si performanțele programului. De asemenea, din acest meniu se pot accesa o serie de tutoriale extrem de explicite, existând si posibilitatea conectării pe Internet la o bază de date cu informații de ultimă oră referitoare la program.

1.2.2. Bara Principală

Bara Principală ce conține instrumentele de lucru, se află poziționată sub meniurile derulante. Unele dintre aceste instrumente au 2-3 versiuni care se obțin menținând apăsat butonul mouse-ului când cursorul se află deasupra pictogramei respective (figura 1.2.).

Figura 1.0.4. Bara Principală

Bara Pricipală cu instrumente conține un număr mare de opțiuni și se poate derula stânga-dreapta, fiind afișată parțial sau complet în funcție de rezoluția ecranului. Pe bara cu instrumente sunt prezente cele mai uzuale opțiuni si comenzi utilizate în cadrul modelării unei scene. Astfel, de la stânga la dreapta, conform cu figura 1.2., sunt prezente următoarele instrumente: Select and Link, Unlink Selection, Bind to Space Warp, Select Object, Rectangular Selection Region, Selection Filter, Select by Name, Select and Move, Select and Rotate, Select and Scale, Select and Manipulate, Reference Coordinate System, Use Pivot Point Center, Restrict to X, Restrict to Y, Restrict to Z, Restrict to XY Plane, Mirror si Array.

În continuare sunt prezentate doar opțiunile specifice programului 3D Studio Max:

Select and Link se utilizează pentru a stabili relația ierarhică între două obiecte, printr-o legătură “child & parent”. Astfel, legătura se realizează de la obiectul selectat (child) la un alt obiect (parent). Prin legătura realizată, obiectul “child” moștenește toate transformările obiectului “parent” (deplasare, rotire, scalare), reciproca nefiind aplicabilă;

Unlink Selection, evident, desface o legătură stabilită în modul prezentat anterior;

Bind to Space Warp se utilizează pentru a atașa la selecția curentă o serie de obiecte de tip “deformare spațială” (space warp). Acestea sunt, de fapt, efecte speciale care acționează asupra obiectelor de care sunt atașate. Deformările spațiale, în sine, nu sunt renderizabile și sunt folosite doar pentru a schimba aspectul și forma unui obiect sau grup de obiecte în același moment de timp. Unele deformări spațiale se comportă ca niște generatoare de câmpuri de forță care deformează structura obiectelor sau aplică forțe acestora, având ca efect valuri, explozii, efecte atmosferice etc.;

Reference Coordinate System este o listă care permite utilizatorului să specifice sistemul de coordonate pe care doreste să-l folosească pentru a realiza transformările obiectelor selectate;

Use Pivot Point Center permite scalarea sau rotirea unui obiect (grup de obiecte) în jurul punctelor pivot respective. De reținut este faptul că toate transformările obiectului se vor face în funcție de poziția acestui punct pivot.

Restrict to X, Y, Z se utilizează pentru a limita toate transformările (deplasare, rotire, scalare) unui obiect sau grup de obiecte pe direcția unei singure axe (X, Y sau Z). Restrict to XY (YZ sau ZX) Plane limitează transformările numai în acel plan. Spre exemplu, dacă se doreste deplasarea unui obiect numai pe axa X se selectează această restricție, dar dacă obiectul trebuie deplasat pe ambele axe, X si Y, atunci se va folosi restricția planului XY.

1.2.3. Panoul de Comenzi

Panoul cu comenzi reprezintă una dintre cele mai importante secțiuni din interfața programului 3D Studio Max și este amplasat în partea din dreapta a acesteia. Acest panou conține majoritatea instrumentelor necesare desenării, modelării, editării și animării obiectelor dintr-o scenă, fiind împărțit în șase secțiuni: Create (creare), Modify (modificare), Hierarchy (ierarhie), Motion (mișcare), Display (afișare) și Utility (opțiuni suplimentare cu caracter utilitar). Fiecare secțiune are propriul set de comenzi și funcționalități. Trecerea de la o secțiune la alta se efectuează printr-un click cu mouse-ul pe eticheta corespunzătoare. Comutarea între secțiunile panoului de comenzi anulează comanda selectată în acel moment.

În figura … se observă structura secțiunii Create. În partea superioară a acestuia sunt șapte butoane, sub care se află câte un meniu derulant. Cele șapte butoane reprezintă diferite categorii de obiecte ce pot fi inserate într-o scenă, incluzând Geometry (geometrie), Shapes (forme), Lights (lumini), Cameras (camere), Helpers (elemente ajutătoare), Space Warps (elemente de deformare spațială) și Systems (sisteme).

La selectarea unui buton (Geometry, spre exemplu) apare o listă derulantă în care sunt enumerate diferitele tipuri de elemente geometrice care pot fi create (în cazul de față va apare: Standard Primitives, Extended Primitives, Compund Objects, Loft Object, Particle Systems, Patch Grids, NURBS Surfaces, Doors si Windows).

Secțiunile sunt organizate ierarhic pentru a permite localizarea simplă si rapidă a comenzii căutate. După selectarea unui set de comenzi (Standard Primitives, spre exemplu) apare o listă cu tipurile de primitive standard disponibile, fiecare cu propriile opțiuni si caracteristici.

Secțiunea Create oferă toate resursele pentru crearea obiectelor geometrice, camere, lumini, elemente ajutătoare, elemente de deformare spațială si sisteme. Crearea acestor obiecte este, de altfel, si primul pas în realizarea unei scene cu 3D Studio Max, meniul fiind folosit, cu siguranță, pe parcursul întregului proiect. Obiectele incluse în scenă, folosind secțiunea Create, sunt determinate ca formă si caracteristici, de o serie de parametri, care în momentul creării obiectului, iau anumite valori.

Secțiunea Modify permite aplicarea asupra obiectului a unor serii de modificatori, care sunt, de fapt, instrumente de schimbare a formei obiectului. Totusi, chiar dacă modificatorii schimbă forma obiectului, parametrii fundamentali ai acestuia rămân nemodificați, oricând existând posibilitatea revenirii obiectului la forma inițială.

Secțiunea Hierarchy oferă acces la diferite opțiuni de ajustare a legăturii ierarhice între obiecte. Prin legarea unui obiect de altul, se creează o relație de tip “child-parent”, toate transformările aplicate asupra obiectului “parent” influ ențând obiectul “child”.

Secțiunea Motion conține opțiunile necesare pentru ajustarea miscării obiectului selectat. Miscarea are la bază un set de cadre cheie, ce definesc traiectoria de rulare a obiectului, dar si momentele de timp în care au loc transformări asupra acestuia.

Secțiunea Display oferă acces la opțiunile ce controlează afisarea obiectelor în scenă. Display se utilizează pentru a determina care obiecte vor fi “ascunse” sau, dimpotrivă, “afisate”, “înghețate”, în funcție de complexitatea scenei, astfel încât utilizatorul să lucreze cu un număr cât mai mic de obiecte. Un număr redus de obiecte, afisat la un moment dat, conduce la o mai rapidă afisare a geometriei acestora si, evident, la simplificarea activității de modelare.

Secțiunea Utility conține diverse programe utilitare, scrise special pentru 3D Studio Max. Majoritatea acestor programe utilitare se numesc “plug-in-uri”, fiind scrise de firma producătoare, Discreet, dar si de alți dezvoltatori, pe baza informațiilor conținute de SDK (Software Development Kit).

1.2.4. Bara de Status, Controlul Animațiilor, Instrumentele de Navigare, MaxScript

În partea de jos a interfeței, se regăsesc patru zone ce oferă diferite instrumente și informații despre scena curentă (figura …).

Figura 1.10. Instrumentele de navigare, Controlul Animațiilor, Bara de Status si Zona de implementare script (MaxScript)

Bara de status arată în ce constă selecția curentă și permite singularizarea acestei selecții pentru a se preveni selectarea accidentală a altui obiect din scenă. De asemenea, ea afișează coordonatele obiectului supus acțiunii curente sau alte date importante referitoare la acesta. Bara cu mesaje afișează o scurtă descriere a funcției instrumentului folosit. De asemenea, în bara de status se află butoanele Selection Lock, Crossing Selection, 3D Snap, Angle Snap, Grid etc., foarte utile în modelarea și manipularea obiectelor în scenă.

Controlul Animațiilor se compun din cursorul de timp, butonul Animate și cele șapte controale din partea dreaptă a acestuia, având ca funcție deplasarea prin cadrele animației și setarea numărului de cadre pentru segmentul curent de timp.

Butonul Animate este foarte important în stabilirea și activarea cadrelor animației, toate deplasările, rotațiile sau scalarile aplicate obiectelor fiind înregistrate și transformate în cadre, când butonul este apăsat.

Fiecare port de vedere are posibilitatea de a efectua operații precum transfocarea, panoramarea si rotirea imaginii prin intermediul controalelor porturilor de vedere, fiind amplasate în colțul din dreapta-jos al interfeței (Figura …).

Opțiunile, prezente sub formă de butoane în această zonă, se pot modifica în funcție de tipul portului activ. Majoritatea controalelor porturilor de vedere pot fi aplicate prin operații de click si tragere cu mouse-ul. Spre exemplu, comanda Zoom permite vizualizarea prin mărire sau micsorare a dimensiunilor scenei si se bazează pe operații de click si tragere a mouse-ului în sus sau în jos în portul de vedere curent.

Zona de implementare script (MAXScript) permite aplicarea unor comenzi repetitive în mod rapid, fără a mai deschide editorul de MAXScript. MAXScript este un limbaj de scripting care permite să automatizăm orice proces pe care îl poate realiza 3ds Max și este un mod excepțional de a realiza acțiuni repetitive într-un timp mult mai scurt. De exemplu, avem o sută de cuburi poziționate pe planul XY și dorim ca suprafața creată să devină neregulată. Selectăm toate cuburile, și în zona MAXScript scriem următoarea instrucțiune: “for cube in selection do cube.poz.Z += random 1 5” care se traduce “pentru cuburile din selectie muta fiecare cub pe axa Z cu un numar de unități generat aleator între 1 și 5”, rezultatul acestei comenzi este în figura …:

1.2.5. Viewport-urile (vederile)

Porturile de vedere permit vizualizarea scenei dintr-o mulțime de unghiuri diferite. În mod prestabilit (Figura …), 3ds Max are patru porturi de vedere: Top (sus), Front (față), Left (stânga) și Perspective, dar există posibilitatea de a schimba ordinea și dimensiunile acestora, în funcție de nevoile sau preferințele utilizatorului.

3D Studio Max permite configurarea tuturor caracteristicilor acestor porturi de vedere, prin modificarea unor opțiuni legate de nivelul de umbrire, modul de afișare și vizualizare etc. O primă metodă este aceea de a efectua click cu butonul dreapta al
mouse-ului pe numele portului situate în colțul din stânga-sus al acestuia, după care se va afișa un meniu în care se pot configura cei mai des folosiți parametri ai portului curent.

O a doua metodă de configurare a porturilor de vedere, total diferită de prima, dar complementară, este folosirea casetei de dialog Viewport Configuration, din meniul Customize. Astfel, Viewport-ul Configuration oferă opțiuni mai complexe decât cele din metoda anterioară, utilizându-se pentru stabilirea caracteristicilor portului curent. Odată stabilite caracteristicile, acestea vor fi utilizate permanent până la o nouă modificare sau repornire a programului, dar această metoda se utilizează în situații rare, când nu se pot realiza anumite opțiuni folosind prima metodă.

1.2.6. Controlul afișării obiectelor

Una dintre cele mai frecvent utilizate metode de a accelera și usura procesul de lucru în 3D Studio Max este aceea de a controla afișarea obiectelor în porturile de vedere. Astfel, utilizatorul poate stabili dacă un obiect va fi sau nu afișat în scenă. În cazul în care scena devine complexă, cu obiecte ce conțin mii de fețe, este utilă dezactivarea acelora care au încheiat procesul de modelare și/sau încetinesc sistemul.

Există două metode de a controla afișarea obiectelor: prim implică paleta flotantă Display, iar cea de-a doua utilizează panoul de comenzi Display. Prima este mai ușor de utilizat, deoarece permite activarea-dezactivarea unui obiect fără a fi necesară părăsirea panoului de comenzi în care se lucrează. Paleta flotantă Display este accesibilă sub meniul derulant Tools (Figura …).

Pentru a controla afișarea obiectelor în scenă există mai multe comenzi:

Hide Selected ascunde toate obiectele selectate din scenă;

Hide Unselected ascunde toate obiectele care nu sunt neselectate din scenă.

Hide by Name deschide o casetă de dialog Select by Name prin care utilizatorul își alege după nume si categorie obiectele pe care dorește să le îndepărteze temporar din scenă;

Hide by Colour se bazează pe faptul că orice obiect creat în 3D Studio Max are o culoare atribuită aleator. Utilizatorul are, totuși, posibilitatea de a schimba aceste culori, spre exemplu, în funcție de categoria din care obiectul face parte. În astfel de situații, este utilă folosirea comenzii Hide by Colour pentru a ascunde toate obiectele din scenă care au aceeași culoare;

Hide by Category ascunde obiectele care fac parte dintr-o anumită categorie, precum: geometrie, lumini, sisteme de particule, camere etc. Comanda este utilizată când se dorește ascunderea rapidă a tuturor obiectelor de acelasi tip, fără a necesita identificarea lor în listă;

Obiectele ascunse pot fi reafișate, programul oferind doar două comenzi: Unhide All și Unhide by Name.

1.2.7. Atribuirea de nume obiectelor

O scenă poate conține câteva obiecte pe care utilizatorul le poate manevra fără mare dificultate. Dar, în momentul în care numărul obiectelor crește la câteva zeci, sute sau mii, o metodă bună de gestionare a acestora este atribuirea unui nume sugestiv pentru fiecare obiect sau grup de obiecte în parte. Astfel, selectarea obiectelor se face mult mai simplu, în special când este vorba de obiecte obținute prin clonare, fiecare clonă păstrând o parte din numele obiectului sursă (figura …).

La crearea unui obiect, acestuia i se atribuie un nume în funcție de categoria din care face parte și o cifră pentru a-l numerota (de exemplu: Cylinder01, Box03, Plane05, Camera01 etc.).

În cadrul unui proiect la care lucrează mai mulți utilizatori este util ca obiectele să se conformeze unei scheme de denumire cunoscută de toți membrii echipei.

1.2.8. Obiectele (primitivele) predefinite

Aceasta este o metodă de modelare de bază, în care se folosesc numai obiecte de tip cutie (box), sferă (sphere), con (Cone), cilindru (cylinder) și alte obiecte predefinite din lista standard sau o listă de extindere a primitivelor. Se pot aplica, de asemenea, operațiunile de tip Boolean.

Lista cu primitive predefinite:

Box – cutie, produce o prisma dreptunghiulara.

Cyilinder- cilindru, produce un cilindru.

Torus – produce un covrig sau un inel – cu o secțiune transversală circulară, uneori menționată ca o gogoasă.

Teapot – ceainic, produce ceainic Utah. Deoarece ceainicul este un obiect parametric, utilizatorul poate alege care părți ale ceainicului sunt afisate după creație. Aceste părți includ corpul, mânerul, ciocul si capacul.

Cone – con, produce conuri.

Sphere – sfera, produce o sferă completă, emisfera, sau altă porțiune a unei sfere.

Tube – tub, poate produce atât tuburi rotunde cât si tuburi prismatice. Tubul este similar cu un cilindru cu o gaură în el.

Pyramid – piramidă, produce o piramidă care poate avea o bază pătrată saudreptunghiulară si fețe triunghiulare.

Plane – plan, produce un plan care este un tip special de poligon plan care poate fi mărit în orice moment. Utilizatorul poate specifica factorii pentru a mări dimensiunea sau numărul de segmente, sau ambele. Modificatorii, cum ar fi “displace” (deplasarea) pot fi adăugați la un plan pentru a simula un teren deluros.

Geosphere – geosferă, produce sfere si emisfere bazat pe trei clase de poligoane regulate.

1.2.9. Modelarea de tip Editable Poly

Această metodă convertește un model 3D. Se face prin click dreapta pe obiect, se alege submeniul Convert To și se dă click pe opțiunea Convert To Editable Poly.

De obicei, se folosește acest modificator pentru că nu este distructiv asupra modelului 3D, modificările facute putând fi separate de celelalte.

1.2.9.1. Nivelul de editare Vertex

Vertexii sunt puncte în spațiu ce definesc structura altor sub-obiecte care fac obiectul Poly. Când nodurile sunt mutate sau editate, geometria fețelor este afectată, de asemenea.

La Editable Poly, nivelul Vertex, se pot selecta mai multe puncte unice și se pot muta prin utilizarea metodelor standard.

1.2.9.2. Nivelul de editare EDGE

Așa cum spune și numele nivelului de editare, un Edge este o linie care leagă două noduri care fac parte dintr-un poligon. Muchia nu poate fi partajata de mai mult de două poligoane. De asemenea, fețele normale ale celor două poligoane ar trebui să fie adiacente.

La nivelul Edit Poly EDGE se pot selecta unul sau mai multe edgeuri si să se modifice prin utilizarea metodelor standard.

1.2.9.3. Nivelul de editare POLYGON

Un poligon este o față a unui model 3D; un poligon poate avea trei sau mai multe laturi. Se poate trata un poligon ca un singur obiect în acelasi timp ca model, dar în momentul cand se face randarea, 3ds Max îl descompune în mai multe fețe triunghiulare. La nivelul Edit Poly Polygon se pot selecta unul sau mai multe poligoane si să se modifice prin utilizarea metodelor standard.

1.3. Modelarea autovehiculului și a robotului

1.3.1. Modelarea autovehiculului

1.3.1.1. Pregătirea spațiului de lucru

Pentru realizarea modelului Am folosit blueprint-ul autovehiculului care poate fi găsit pe internet.* Blueprint-ul reprezintă vederile ortografice ale autovehiculului: vederile din față, spate, lateral și de sus.

Căutarea acestor blueprint-uri încă este dificilă, există câteva resurse online, însă problema acestor blueprint-uri este că fiecare vedere este scalată sau realizată diferit față de celelalte și, lucrând astfel, în 3ds Max vor exista conflicte vizuale pentru cel ce modelează obiectul (autovehiculul). După cum se observă în figura …, am realizat, cu ajutorul Adobe Photoshop, câteva linii de ghidaj care demostrează ca vederile sunt proportionale și pot fi folosite cu succes.

Modelul ales se numește Ford Mustang, ediția de colecție GT Deluxe 2005 (figura …).

Pentru a modela obiectul realist în 3ds Max, am folosit aceste imagini și le-am importat pe rand ca fundal (background) pentru fiecare viewport (vedere). Acest lucru se realizează selectând viewport-ul dorit (de exemplu, top), din meniul principal selectăm opțiunea View, apoi Viewport Background, urmată de opțiunea Viewport Background… . Se deschide o fereastră pentru setarea fundalului viewport-ului selectat. Apăsăm pe butonul Files… și selectăm de pe hard-disk imaginea corespunzatoare vederii de sus. Apoi se selectează opțiunile Match Bitmap, Display Background și Lock Zoom/Pan.

Se procedează analog pentru celelalte vederi, la final obținându-se:

1.3.1.2. Construirea autovehiculului

Am început modelarea autovehiculului prin realizarea componentelor arcuite ale aripilor față și spate. Astfel, primul pas este de a crea un tube (tub), din secțiunea Create, cu centrul în centrul roții, care va arăta ca în figura … cu proprietățile din figura … .

Tubul va rămâne doar cu partea arcuită de sus ce va reprezenta componenta aripii față, adică partea de jos a aripii (marginea arcuită după forma roții). Pentru asta, vom convertii tubul în Editable Poly, astfel putem modifica orice geometrie componentă a acestui tub. Vom selecta Polygon și, în viewport, selectăm din vederea left, opt poligoane din partea de jos, iar în vederea front, vom selecta poligoanele spre dreapta marginii care ne interesează. După ștergere, selectăm opțiunea Vertex pentru a aranja punctele fiecarui poligon în funcție de imaginea de fundal.

Pentru a realiza componenta arcuită a aripii față se vor modifica pozițiile punctelor, muchiilor sau poligoanelor folosind diferitele vederi disponibile.

Se vor clona anumite muchii pentru a continua modelarea aripiilor. Acest lucru se realizează prin selectarea muchiilor dorite cu ajutorul selecției Edge, apoi se ține apasată tasta Shift și se mută/scalează grupul de muchii (figura …).

Pentru aripa spate se va proceda analog, astfel, rezultatul va fi precum în figura … .

Am selectat una din componentele realizate până acum și, din secțiunea Modify, Edit Geometry, am ales Attach și am selectat cealaltă componentă cu mouse-ul, astfel cele 2 obiecte devin unul singur.

În continuare vom „lega” cele două componente (figura …). Selectăm opțiunea Edge din secțiunea Modify și selectăm cu click marginile dorite. Apoi aplicăm proprietatea Bridge, aceasta creând un plan între cele două componente arcuite.

Continuăm prin selectarea marginilor superioare ale obiectului realizat și vom aplica metoda exemplificată mai sus, menținerea butonului Shift apăsat cât timp se muta grupul de muchii selectat. Apoi se modelează noile geometrii în fiecare vedere folosind Vertex. Acest lucru ne permite ca geometriile să ia forma caroserie autevehiculului.

Se procedează similar pentru aripa spate, bara spate, portbagaj, aripa față, bara frontală, capota și componenta de sub mașina care reprezintă „podeaua”.

Elemetele enumerate vor deveni obiecte individuale, primul pas este detașarea podelei de restul obiectului și schimbarea culorii acesteia. Pentru aceasta se folosește opțiunea Polygon din secțiunea Modify; se vor selecta polgoanele care reprezintă podeaua, apoi se va alege din meniul Edit Geometry opțiunea Detach, după care schimbam culoarea podelei într-o nuanță de gri închis.

După cum se observă, modelarea autovehiculului se face decât pentru jumatatea stangă sau dreaptă, iar la final se vor clona aceste componente „în oglindă”.

O altă observație este faptul că totul este realizat din poligoane, iar modelul nu are o fidelitate a suprafeței foarte bună, însă se vor utiliza opțiunile din secțiunea Modify, meniul Subdivision Surface. Vom bifa căsuța Use NURMS Subdivision, iar în panelul Display vom alege cât de netedă va deveni suprafețele obiectelor (figura …).

În funcție de numărul de iterații pentru calcularea indicelui de netezire, suprafața va avea o calitate mai ridicată sau mai scăzută. Cu cât numărul de iterații este mai mare, cu atât netezirea se face cu o calitate mai ridicată, dar inconvenientul este că fișierul rezultat va avea o dimensiune mult mai mare.

Obiectele realizate până în acest moment încă au erori de modelare, anumite secțiuni ale acestora necesită mai multe detalii (mai multe muchii). În figura …, se observa pe bara din față, sub zona farului, o adâncitură rotunjită, dar autovehiculul, în realitate, prezintă acea zonă cu margini mai ascuțite și drepte.

Un exemplu elocvent pentru a arăta tehnica de ralizare a acestor muchii se face construind un cub (box), acesta va fi convertit într-un Editable Poly și vom aplica Use NURMS Subdivision cu un număr de iterații egal cu 3 pentru a netezi la o calitate ridicată acest cub.

Se observă că acesta a devenit o sferă, neexistând așa numitele detalii de modelare. Pentru acest lucru, vom selecta din secțiunea Modify, opțiunea Edge și vom selecta cu mouse-ul marginile verticale ale cubului. Apoi vom aplica opțiunea Connect, va apărea o fereastră cu opțiunile: Segments (numărul segmentelor), Pinch (distanța dintre segmente) și Slide (poziția segmentelor). Această opțiune va realiza muchii perpendiculare cu cele selectate de noi; realizăm două segmente cu Pinch de 80, astfel muchiile vor fi poziționate sus și jos, aproape de baza și vârful cubului.

Aplicând din nou, opțiunea de netezire, va rezulta un cilindru. De aceea vom realiza muchii în același mod ca mai sus și pentru celelalte două direcții și va rezulta un cub cu margini netezite, puțin rotunjite.

Acest tip de adăugare de detalii nu va fi folosit niciodată pentru un cub sau orice geometrie simplă, întrucât nu este economic, obiectul rezultat având o formă foarte apropiată de original, exportând în .obj, dimensiunea fișierului obiectului netezit fiind de două ori sau chiar mai mare decât dimensiunea fișierului obiectului inițial.

Folosind această tehnică, am putut realiza detaliile dorite (figura …).

În continuare, folosind tehnicile prezentate anterior, vom face ajustările necesare astfel încât obiectul final să fie asemănător cu modelul de autovehicul din realitate.

Vom adăuga detalii precum: realizarea semnalizării față, interiorul farului, proiectoarele de pe bara din față, modelarea fidelă a portbagajului, a barei spate, crearea stopului spate și detaliilor laterale (figura …).

Trebuie realizată partea superioară a autovehiculului, iar aceasta debutează prin desenarea unei linii (Line din secțiunea Create, submeniul Shapes) în viewport-ul cu vedere laterală (Left), apoi se vor modifica punctele (Vertex) și în celelate vederi, întrucât această componentă are o formă curbată pe toate cele trei axe.

Pentru realizarea componentei superioare se aleg trei poligoane la baza acestei linii create, iar în secțiunea Modify, Edit Polygons se va akege opțiunea Extrude Along Spline, apare o nouă fereastră, se va selecta linia creată mai devreme și se va apăsa OK (figura …).

Utilizând, din nou tehnicile exemplificate în acest capitol se va realiza această componentă superioară, plafonul, geamurile, se vor detașa ușile, se vor crea mânerele ușilor și capacul rezervorului de combustibil.

Vom continua cu realizarea roților și a axelor de susținere. În viewport-ul Left, construim un tub (Tube) cu optsprezece (18) fețe, în funție de imaginea de fundal a mașinii. Se va converti în Editable Poly și se vor sterge poligoanele din interiorul tubului creat. Pentru a face selecția mai ușor, selectăm trei margini din interior, aplicăm opțiunea Loop pentru a selecta marginile pe toată suprafața, după care ținând apăsată tasta CTRL selectăm modifier-ul Polygon, astfel se vor selecta numai poligoanele din interiorul tubului. Apoi vom șterge poligoanele selectate.

Selectăm marginile exterioare ale roții, vom aplica Chamfer pentru a da aspectul rotunjit al marginilor anvelopelor.

În continuare aplicăm tehnici prezentate anterior, rezultatul putând fi vizualizat în figura … .

Pentru crearea jantei se procedează similar construirii cauciucului, se pornește de la un tub, dar de această dată va avea 60 de fețe, apoi se creează în centru un cilindru cu 30 de fețe.

Pentru crearea brațelor jantei, vom face câteva calcule. Am creat un tub cu 60 de fețe și un cilindru cu 30 de fețe, iar eu doresc 5 brațe.

poligoane pentru fiecare braț (tub)

poligoane pentru fiecare braț (cilindru)

Am ajuns la concluzia ca fiecărui braț îi corespund 12 poligoane de-a lungul cercului format de tub și 6 poligoane de-a lungul cercului format de cilindru. Brațul consider că foloseste 2 poligoane cu spațiu de un poligon între ele (figura …).

Aplicăm Bridge asupra poligoanelor selectate și va rezulta brațul dorit.

Analog, se va proceda cu celelalte 4 brațe, apoi se vor face mici modificări pentru a crea detaliile necesare, astfel, în final, roata va arăta precum în figura … .

Ultimele componente ce se vor realiza pentru model sunt axele de susținere, discurile de frană și frânele.

Puncul de pornire este un cilindru realizat în viewport-ul Left. Se vor aplica tehnici ultilizate anterior, astfel se vor realiza axul de susținere, discul de frână, frâna și suruburile care vor susține janta.

1.3.2. Construirea robotului

Mi-am dorit ca robotul industrial pe care îl realizez să aibă un design și o comportare cât mai aproape de realitate, iar pentru aceasta a trebuit să caut tipurile de sisteme robotice care se folosesc la ora actuală și să studiez modul în care acționează fiecare grad de libertate: folosește rotație sau translație pentru mișcare sau limitele de rotație/translație ale gradelor de libertate.

În acest sens, după o perioadă am ajuns la concluzia că roboții de la Kuka Robotics sunt cei mai apropiați de ceea ce am vrut. Site-ul acestei firme (http://kuka-robotics.com/) pune la dispoziție o documentație foarte bine structurată pentru fiecare sistem robotic disponibil în gama de modele. Am ales două modele după care m-am ghidat: modelul KR 90 R2700 PRO (figura …), un robot compact cu o sarcină utilă de 90 kg, cu 6 grade de libertate (RRR-RRR) și modelul KR 60 HA (figura …), un robot cu sarcină utilă între 30 kg și 60 kg, având tot 6 grade de libertate (RRR-RRR). Diferența dintre aceste două modele este greutatea ce poate fi manipulată și câteva elemente de design și structură.

De asemenea, sunt puse la dispoziție și modelele 3D ale acestor roboți sub extensia .dxf pentru AutoCAD, însă nu pot fi utilizate în alte scopuri decât vizualizarea lor sub diferite unghiuri sau vederi. Acest lucru mi-a permis ca pentru anumite componente să pot realiza blueprint-uri, fiindu-mi utile în crearea la scară a modelului dorit.

Practic, robotul a fost construit pe componente, apoi componentele au fost reunite, creând obiectul final, spre deosebire de autovehicul, care a fost construit ca un obiect, pe parcurs detașând porțiuni și definidu-le ca și componente.

Am setat blueprint-urile pentru componenta batiu și am început modelarea prin realizarea unui box. Am utilizat mai multe segmente pe lățime și lungime pentru a putea modifica punctele pentru ca box-ul să preia forma batiului.

Convertim box-ul în Editable Poly, apoi modificăm punctele (Vertex) din vederea de sus (top) după forma bazei batiului. Apoi selectăm marginile exterioare ale box-ului și aplicăm modifier-ul Chamfer cu pasul de 0,05 centimetri; acest lucru permite adăugarea detaliilor astfel încât, la netezire, să se păstreze marginea și forma obiectului (figura …).

Modificăm pozițiile punctelor astfel încât muchiile să urmeze formele din imaginea de background, apoi selectăm muchiile necesare, îar în vederea din față (Front) sau din lateral (Left) le vom muta pe axa y. De asemenea, vom adăuga detalii la marginile nou create astfel, prin netezire, obiectul prinde forma dorită.

În continuare, am utilizat tehnici exemplificate anterior pentru a realiza orificiile pentru șuruburi și orificiile de pe planele înclinate create. Astfel, ne poziționăm în vederea Top și creăm un cilindru cu 8 fețe și îl poziționăm și scălăm astfel încât pe imaginea de fundal să acopere unul din orificiile pentru șuruburi. Apoi selectăm batiul, iar din secțiunea Modify, meniul Edit Geometry folosim opțiunea Cut și vom desena forma cilindrului pe geometria batiului. Ștergem poligoanele create desenând forma cilindrului, apoi conectăm muchiile utilizând opțiunea Bridge și va rezulta un orificiu.

Analog, se vor realiza celelalte orificii.

De asemenea, utilizând aceleași tehnici prezentate se vor realiza celelalte elemente ale batiului, astfel, în final acesta va avea o formă fidelă a batiului original.

După realizarea batiului, blueprint-urile celorlalte componente este mai puțin important deoarece realizarea acestor componente depinde de batiu. Bineînteles, vom mai utiliza blueprint-uri pentru anumite elemente, mai complexe.

Pentru construirea brațului 1, vom crea un cilindru cu 21 de fețe de același diametru ca și platforma circulara a batiului și îl vom poziționa deasupra batiului.

Conform vederii din lateral a brațului 1, cilindrului creat trebuie să îi aducem câteva modificări, astfel în partea de jos a cilindrului vom crea cu ajutorul muchiilor trei cercuri de diametre mai mici, apoi vom aplica Inset pentru a crea încă un cerc de diametru mai mic cu 0,05 cm, apoi aplicăm Extrude. În partea de sus a cilindrului vom aplica Extrude, apoi suprafața rezultată o scalăm pe axele XZ și o rotim pe axa X cu aproximativ 2,5 grade.

În continuare, construim o cutie (Box), apo o convertim în Editable Poly și, folosind tehnicile prezentate anterior, modelăm partea superioară a brațului 1.

Pentru brațul al doilea urmăm aceiași pași facuți pentru brațul 1, cu câteva excepții. Pornim de la un cilindru și realizăm modificări ale geometriei, astfel ajungem la pasul în care am creat partea cilindrică de jos a brațului 2, o clonăm și o micșorăm (întrucât este similară) pentru a realiza partea cilindrică superioară a brațului.

Ultima parte a modelări acestui braț constă în crearea brațului dintre cele două secțiuni cilindrice. Folosind selectorul Polygon, selectăm poligoanele care ne interesează, după care folosim opțiunea Extrude, apoi utilitarul scale și vom da forma brațului. La fel procedăm și pentru componenta cilindrică superioară, urmând ca la jumătatea distanței dintre cele două componente să unim brațele. Am realizat o scalare a poligoanelor selectate pentru ambele componente astfel încât în poziția de contopire punctele de pe ambele brațe să se afle unul lângă celălalt (două câte două). Apoi cu opțiunea Vertex, selectez câte 2 puncte aflate pe aceeași muchie și folosesc Weld pentru a le „suda”.

În final, brațul 2 va arăta ca în figura … .

Trecând la modelarea brațului 3, se poate observa ca avem nevoie de un cilindru și o cutie (Box). Cilindrul îl avem deja realizat la celelalte două brațe, așă că îl voi refolosi clonând unul din cilindrii folosiți la brațul 1 sau 2, dar sunt necesare ajusări privind proporțiile și partea cilindrică exterioară care va avea contact cu motorul.

Pentru finalizarea brațului, în vederea din față, vom crea un cilindru căruia îi vom aplica tehnici prezentate anterior, astfel realizându-se și brațul 3.

Motoarele necesare acestui sistem robotic, sunt de 2 tipuri: motoarele pentru mișcarea brațelor și cele pentru componentele mobile ale end-effector-ului.

Se procedează similar pentru ambele motoare. Am realizat 3 Box-uri ca în figura …, apoi am sters doar poligoanele/fețele care vor fi suprapuse la contopirea box-urilor. Vom „suda” box-urile utilizând opțiunea Weld pentru puncte, apoi vom crea o muchie în partea frontală.

Selectăm poligoanele precum în figura … și aplicăm Extrude, astfel se crează marginea frontală a motorului. Următorul pas este să selectăm punctele din colțurile marginii frontale create, apoi folosind opțiunea Scale, micșorăm scara pe axa XZ astfel încât punctele să se poziționeze pe diagonala pătratului format înainte.

Pentru realizarea cilindrului frontal, folosim tehnica prezentată în acest capitol, creăm un cilindru cu 8 fețe (octogon) și, cu opțiunea Cut, „desenăm” pe suprafața frontală a motorului, modelul exact al octogonului. Această tehnică ne permite să realizăm un cilindru sau un orificiu rotund (la netezire), mai simplu și mai eficient.

Dacă aplicăm în acest moment Turbo Smooth, obiectul cilindrul creat va arată perfect, însă motorul va fi prea rotunjit, ceea ce înseamnă că este nevoie de adăugare de detalii. Am prezentat anterior această metoda, astfel, la final motorul va arăta ca în figura …

Se procedează în mod similar pentru crearea celuilalt tip de motor.

1.3.3. Aplicarea materialelor

Cele 2 componente principale ale proiectului sunt create, iar ultima parte a modelări acestor obiecte este reprezentată de „fabricarea” și aplicarea materialelor pe suprafețe.

Am început prin crearea materialului pentru caroserie. Am ținut cont de faptul că, fiind o mașină din gama “Muscle Car” am aplicat o vopsea metalizată de culoare „verde electric”. Deschidem Material Editor (apăsăm tasta M), iar în prima căsuță, vom alege opțiunea Get material și vom alege din gama prestabilită, Pro Materials: Metallic Paint.

După realizarea setărilor materialului (culoare, tipul de finisare al suprafeței etc.), vom aplica materialul pe fiecare componentă a caroseriei autovehiculului cu tehnica Drag&Drop.

La fel procedăm pentru celelate tipuri de materiale, pentru jante am folosit acelasi tip de material, Metallic Paint, dar cu efect cromat, pentru geamuri, am folosit un material simplu, mat, închis la culoare, întrucât autovehiculul este modelat decât în exterior, iar aplicarea unui material transparent nu este necesară. Pentru lupele farurilor din față, în schimb, am folosit un material transparent, iar pentru interiorul farului (partea relfexivă) am folosit un material cu efect oglindă.

Așa cum se observă și în imagine, în viewport nu se redă culoarea exactă, ci doar o culoare intuitivă, fără reflexii ridicate. În schimb, la randarea scenei efectele materialelor devin vizibile și spectaculoase (realiste).

Robotul, a primit un material metalic de culoare galben-camaro cu reflexii ridicate pentru brațele 1, 2 și 3, un efect metalic de culoare gri pentru batiu și unul din elementele end-effector-ului, iar motoarele, un efect metalic mat de culoare gri închis.

După setarea motorului de randare al scenei, se aplică click pe butonul Render, iar rezultatul final al modelării autovehiculului și al robotului pot fi vizualizate în figura … .

Există câteva observații pentru cele două modele și, anume, faptul că ele vor fi convertite sub extensia .obj, ceea ce înseamnă că se vor crea 2 fișiere: unul cu extensia .obj care conține coordonatele fiecărui punct definit al obiectului respectiv și un alt fișier cu extensia .mtl care conține toate datele despre materialele folosite pe respectivul obiect.

În capitolul următor, voi prezenta modul de implementare al mișcării robotului, platformei pe care se va afla mașina, tehnicile de manipulare folosite și detecția coliziunilor, însă pentru ca aplicația să aibă un timp de răspuns decent, modelele create trebuie modificate, astfel încât să micșorăm numărul de detalii, iar materiale aplicate vor fi mai simple.

Capitolul II
Elemente de programare grafică 3D în Java

2.1. Limbajul Java

Java reprezintă o tehnologie lansată de compania Sun Microsystems și a avut un impact major asupra tuturor comunităților de dezvoltatori software, caracteristicile precum simplitatea, robustețea și portabilitatea au adus o inovație tehnicilor de programare.

Java este limbajul de programare folosit la dezvoltarea aplicațiilor din cele mai diverse domenii. Aceste tehnologii sunt grupate în platforme de lucru (seturi de librării și alte programe utilitare). Distingem mai multe categorii:

J2SE (Standard Edition)

Aceasta este platforma standard de lucru și oferă suport pentru crearea aplicațiilor software independete și applet-uri.

J2ME (Micro Edition)

Platforma ce oferă suport pentru dezvoltarea aplicațiilor pentru dispozitive mobile.

J2EE (Enterprise Edition)

Platforma aceasta oferă API-ul pentru dezvoltarea de aplicații complexe, ce au componente care trebuie să ruleze în sisteme eterogene, având informații stocate în baze de date distribuite etc.

Toate aceste distribuții sunt oferite gratuit .

În funcție de cum se execută aplicațiile, limbajele de programare se împart în două categorii:

Interpretate: un program numit interpretor „citește” instrucțiunile linie cu linie și îl traduce în cod mașină. Utilizându-se această metodă se asigură portabilitatea aplicației pentru că este interpretată direct sursa programului.

Compilate: instrucțiunile sunt convertite în cod ce poate fi executat de procesor. Această soluție asigură execuția foarte rapidă, însă portabilitatea suferă deoarece codul compilat într-un format de nivel scăzut nu poate fi rulat decât pe platforma pe care a fost compilat.

Limbajul Java combină aceste soluții, instrucțiunile unui program în Java sunt atât interpretate cât și compilate. În acest sens, compilatorul este responsabil de convertirea codului sursă în cod de octeți, iar interpretorul va executa acel cod rezultat.

Codurile de octeți sunt seturi de instrucțiuni care seamănă cu codul scris în limbaj de asamblare, fiind generate de compilator independent de mediul de lucru, iar codul mașină este executat direct de către procesor și poate fi folosit doar pe platforma pe care a fost dezvoltat. În Java codul de octeți este interpretat și, astfel, poate fi rulat pe orice platformă pe care este instalat mediul de execuție Java. Acest mediu de execuție se numește JVM (Java Virtual Machine) sau, în traducere liberă, mașina virtuală Java.

Un program este conceput, editat și construit de către programatori cu scopul de a ajuta utilizatorul să atingă anumite obiective (sarcinile job-ului, educație sau divertisment). Conceperea unui produs software încpe cu o schiță a codului, cu diagrame și o echipă se ocupă de acest lucru. Se folosesc limbaje UML și chiar metodologii complicate (Inginerie Software Orientată spre obiecte). Toate programele Java conțin o clasă principală care va conține metoda main. Clasele aplicațiilor se pot găsi fie într-un fișier, fie în mai multe.

Seturi de caractere

Java folosește setul de caractere Unicode, un standard internațional care înlocuiește setul ASCII. Setul Unicode poate reprezenta 65536 semne, față de ASCII, unde era posibilă reprezentarea a 256 caractere.

Setul Unicode are încă o caracteristică și, anume, întreg intervalul de reprezentare al simbolurilor este împărțit în blocuri (subintervale) precum: Basic Latin, Greek, Arabic, Gothic, Currency, Mathematical, Arrows etc.

La fel ca și limbajul C++, limbajul Java deține cuvinte rezervate, acestea neputând fi utilizate ca nume de clase, interfețe, metode sau variabile. Mai există true, false și null care nu sunt cuvinte rezervate, însă nu se pot folosi nici acestea ca nume în programe. Tabelul următor prezintă cuvintele rezervate ale limbajului Java:

Tipuri de date

Tipurile de date în limbajul Java se împart în două categorii: tipuri primitive și tipuri referință. În Java se consideră că „orice este un obiect”, astfel tipurile de date ar trebui să fie de fapt definite de clase, iar fiecare variabilă trebuie să memoreze instanțe ale claselor. Totuși, pentru ușurința programării, există și tipurile primitive de date care sunt uzuale:

Aritmetice:

Întregi: byte, short, int, longș

Reale: float, double

Caracter: char

Logic: boolean

Vectorii, clasele și interfețele sunt tipuri de referință. Valoarea unei variabile de acest tip este o referință (adresă de memorie) către valoare sau mulțimea de valori reprezentată de variabila respectivă.

Există trei tipuri de date care nu sunt acceptate în Java deși în limbajul C sunt. Acestea sunt: pointer, struct și union. Pointerii nu există în Java deoarece erau o sursă de erori, iar struct și union nu își au rostul.

Obiecte și clase

La fel ca în orice limbaj de programare orientat-obiect, și în Java crearea obiectelor se face prin instanțierea unei clase, iar pașii sunt prezentați în continuare:

Declararea – trebuie specificat tipul obiectului, adică se specifică clasa acestuia

( NumeClasa numeObiect; ).

Instanțierea – se face prin utilizarea operatorului new, practic, se creează efectiv obiectul cu alocarea spațiului de memorie

( numeObiect = new NumeClasa(); ).

Inițializarea – se realizează prin intermediul constructorilor clasei. Inițializarea, de fapt, face parte din procesul de instanțiere, astfel imediat după alocarea memoriei este apelat constructorul specificat. Parantezele rotunde de la sfârșitul numelui clasei arată că acolo se face un apel la unul din costructorii clasei.

Odată ce a fost creat, un obiect poate fi folosit în următoarele cazuri: aflarea de informații despre obiect, schimbarea stării sale sau executarea unor acțiuni.

Majoritatea limbajelor de programare impun programatorului să țină evidența obiectelor și să le distrugă în mode explicit atunci când nu mai au nevoie de ele. În practică, s-a demonstrat că această tehnică este o constantă furnizoare de erori, iar această consecință s-a resfrâns asupra limbajului Java.

Astfel, programatorul nu mai are aceaastă responsabilitate în Java, întrucât în momentul rulării unei aplicații, în același timp cu interpretorul, rulează un proces care se ocupă de distrugerea obiectelor nefolosite, acesta numindu-se Garbage Collector, prescurtat gc. Acest proces are o prioritate scăzută și se execută periodic, scanează dinamic memoria ocupată de aplicația în Java care se află în execuție și marchează obiectele care au referințe directe sau indirecte. După ce sunt parcurse toate obiectele, cele rămase nemarcate sunt eliminate automat.

În Java, tipuri noi de date se pot introduce fie prin intermediul Interfețelor, fie al Claselor. Declararea unei clase respectă următorul format:

[public] [abstract] [final] class NumeClasa

[extends NumeSuperClasa]

[implements Interfata1 [, Interfata2 … ]]

{

// Corpul Clasei

}

Modificatorii clasei sunt:

public – implicit, o clasă poate fi utilizată doar de clase care sunt în aceeași librărie. O clasă declarată cu public poate fi folosită din orice altă clasă, indiferent din ce librărie face parte.

abstract – se declară o clasă șablon. O clasă șablon nu poate fi instanțiată, fiind folosită doar pentru a crea un model comun pentru mai multe subclase.

final – declară faptul că o clasă nu poate avea subclase. Declararea acestor clase are două obiective: securitate și programare în spirit orientat-obiect.

Constructorii unor clase sunt metode speciale care au același nume cu cel al clasei, nu vor returna nicio valoare și sunt folosiți pentru inițializarea obiectelor acelei clase. O clasă poate avea unul sau mai mulți constructori care trebuie să difere prin argumentele primite. Constructorii sunt apeați automat la instanțierea unui obiect.

Modificatorii de acces al constructorilor unei clase:

public – se pot crea instanțe ale clasei respective în orice altă clasă.

protected – pot fi create obiecte doar in subclase.

private – nu se pot instanția obiecte ale acestei clase în nicio altă clasă.

implicit – numai în clasele din același pachet se pot crea instante ale acestei clase.

2.2. Elemente de grafică 3D și platforma jMonkeyEngine

În grafica 3D se folosește o reprezetare în trei dimensiuni a figurilor geometrice, pornind de la randarea imaginilor bidimensionale. În mediul tridimensional, după cum deducem și din numele său, există 3 axe (sistemul de coordonate tridimensional), iar axele sunt orientate în funcție de unghiul în care se privește, dar implicit sunt orientate astfel: axa x este orientată spre dreapta, axa y în sus, iar axa z în adâncime (înapoi).

Pentru limbajul Java, există API-ul Java 3D, cu ajutorul căruia se pot crea elemente de grafică 3D cu efecte spectaculoase într-o oarecare măsură și rulează pe baza OpenGL.

API-ul Java 3D oferă suport pentru sunet și o implementare, la nivel grafic, a conceptelor programării orientate-obiect, astfel, orice aplicație Java 3D se desfășoară într-o scenă virtuală compusă din structuri arborescente care cuprind modele 3d, lumini, sunete, fundal, camera etc.

Deși este o tehnologie utilă și a avut un start promițător, librăriile Java 3D nu au mai fost actualizate din anul 2008, astfel folosind tehnologie veche de aproximativ 5 ani, nu crează efectul dorit.

S-au dezvoltat în această perioadă alte API-uri mai bune, cu efecte mai spectaculoase și cu un grad de redare a grafici realiste mai ridicat. Astfel distingem JOGL (Java Binding for the OpenGL), LWJGL (Lightweight Java Game Library) și jMonkeyEngine (Java OpenGL Game Engine).

Observam ca toate aceste API-uri se bazează pe tehnologia OpenGL, acest lucru fiind firesc datorită faptului că DirectX (deși are avantaje mai multe în anumite condiții) este dezvoltat de Microsoft, ceea ce înseamnă că este disponibil numai pe sistemele de operare ale colosului Microsoft, astfel rămânând în afara discuției sisteme de operare Mac, Linux și diferite versiuni sau sisteme de operare derivate.

OpenGL oferă dezvoltatorilor acces la redarea 3D cu ajutorul componentelor hardware fiind foarte utilizat în programarea componentelor grafice 2D și 3D ale aplicațiilor.

OpenGL îndeplinește două obiective principale:

Folosește un singur API uniform pentru a ascunde complexitatea interfațării cu diferite acceleratoare 3D

Toate implementările trebuie să accepte caracteristica OpenGL ca un set complet pentru a ascunde capabilitățile diferitelor platforme hardware.

OpenGL a fost primul mediu pentru dezvoltare portabilă, iar de la introducerea sa în 1992, OpenGL a devenit cel mai răspândit API pentru dezvoltarea aplicațiilor grafice 2D sau 3D. OpenGL inovează și crează un mediu de dezvoltare din ce în ce mai rapid prin încorporarea seturilor de randare, maparea texturilor, efecte speciale și alte funcții de vizualizare. Orice aplicație grafică ce are nevoie de o performanță maximă (de la animații 3D, modelare 3D până la simulări realiste) poate exploata capabilitățile OpenGL.

jMonkeyEngine

La un nivel simplist, jMonkeyEngine este o colecție de librării. Împreună formează „un sistem software proiectat pentru crea și dezvolta jocuri video” (Wikipedia).

Acest motor a fost rescris complet pentru a introduce standardele modern în dezvoltarea jocurilor video.

jME3 utilizează tehnologii precum OpenGL Shading Language, librării Shader și poate recrea toate tipurile de iluminare, coliziuni realiste, efecte speciale (fum, foc, explozii, suprafața apei, ceață etc.).

Motorul jME3 este scris în totalitate în Java, inclusiv platform proprie de dezvoltare. De asemenea, are sisteme de import ale diferitelor elemente de design, posibilitatea creării unei interfețe grafice, lucrul în rețea.

jMonkeyEngine are propria platform de dezvoltare (SDK). Numită “jMonkey Platform”, SDK-ul se bazează pe platform NetBeans.

Principalele caracteristici ale jME3 sunt:

Este open-source

Necesită adaptări minimale pentru a asigura compatibilitatea cu toate platformele

Construit în jurului unei arhitecturi bazate pe tehnologia Shader

Are un mediu de dezvoltare completcu editoare vizuale, utilitare integrate și plug-in-uri unice

Complet și modular

Motorul jME3 are o comunitate online activă și documentație completă, incluzând tutoriale pentru începători și până la programatori avansați.

Orice proiect de dezvoltare este conceput pe anumite secțiuni: planificare, dezvoltare, testare și lansare. La un anumit interval trebuie aduse actualizări elementelor multimedia și, implicit, codului.

Clasa de bază a lui jME3 este com.jme3.app.SimpleApplication. SimpleApplication ne dă acces la caracteristicile standard, precum Scene Graph (scena/mediul virtual) cu nodul de baza rootNode, un Assets Manager (manager de fișiere), un GUI (interfața grafică), având nodul guiNode, Audio Manager, simulări fizice și camera. Pentru a porni sau închide aplicația folosind un cod simplu precum app.start() sau app.stop().

În fiecare joc creat, oricât de simplu este acesta, clasa SimpleApplication va fi extinsă. Practic, clasa SimpleApplication extinde clasa Application, o aplicație jME3 generică de randare 3D în timp real. În mod normal, nu se folosește direct clasa Application pentru a crea un joc. Clasa SimpleApplication ușurează modul de scriere a codului pentru jocul respective pentru că adaugă anumite funcționalități:

Camera de tip First-Person

Scena care conține modelele 3D randate

O maparea implicită a tastelor de control: tasta ESC închide aplicația, Tastele W, A, S, D, Q, Z pentru mutarea în scenă, sagețile sus, dreapta, jos și stânga se folosesc pentru rotații (sau putem folosi mouse-ul).

Elemente de optimizare

Trebuie avut în vedere faptul că este o cerință absolut necesară ca aplicația să aibă un timp de răspuns bun, iar acest lucru se realizează reducând pe cât posibil detaliile obiectelor introduse în scenă, cu cât există mai multe detalii cu atât mai dificil va devein controlul acestora. Motivul pentru care se procedează așa este că randarea se face pentru toate elementele atunci când scena se crează, iar acest lucru crează un trafic de date foarte mare între procesor și placa video.

Elemente matematice

Un sistemul de coordonate este reprezentat de origine (un singur punct în spațiu) și trei axe de coordonate care au lungimea de exact o unitate fiecare și sunt perpendiculare. Axele pot fi scrise ca și coloane ale unei matrici, R = [ U1 | U2 | U3 ], în acest fel funționează poziționarea obiectelor, camerelor în scenă.

Așadar, pentru setarea sistemului de coordonate, putem crea 3 vectori astfel:

Vector3f vectorA = new Vector3f(0,1,0);

Vector3f vectorB = new Vector3f(1,0,0);

Vector3f vectorC = new Vector3f(0,0,1);

Definirea sistemului de coordonate este strâns legat de proprietățile camerei. Nu există metode de verificare a erorilor pentru a spune dacă axele sunt perpendiculare, astfel dacă utilizatorul setează axele incorect, vor experimenta randări ciudate (dispariții aleatoare ale anumitor elemente geometrice etc.).

Putem modifica orice obiect din scenă folosind instrucțiuni specifice. Astfel, există trei tipuri de transformări:

Scalarea – este reprezentată de un vector cu trei elemente, dacă elementele sunt mai mici decât cifra 1, atunci obiectul va fi mai mic decât originalul, iar daca elemetele vectorului sunt mai mari decât 1, obiectul va crește. Nu este neapărat necesar ca elementele vectorului să fie egale, însă dacă nu se păstrează o egalitate, pentru un model ca robotul creat în 3ds Max, obiectul rezultat va fi distorsionat;

Rotația – matricea de rotație necesită ca transpusa și inversa matricei să fie identice (). Matricea de rotație poate fi calculată ca:

, unde S este:

Translația – matricea de translație este de dimensiun 4×4, iar vectorul (x,y,z) este identificat cu (x,y,z,1) pentru multiplicare.

Aceste calcule complicate sunt realizate de către software-ul din spatele interfeței platformei jME3 pentru fiecare instrucțiune de rotație sau translație dată de către programator.

Așa numita scenă sau Scene Graph este spațiul virtual în care se desfășoară acțiunea jocului. Obiectele din interiorul acestei scene se numesc Spatials, acestea având proprietăți specifice precum translație (locație), rotație și scalare. O geometrie (a geometry) este un obiect vizibil în scenă și are o suprafața care ii determină forma și un material.

Nodurile este un obiect care nu este vizibil (Spatial), dar care poate avea alte obiecte vizibile sau nu ca descendenți. Un descendent al unui nod este mutata și rotit relativ cu nodul parinte. Scena (Scene Graph) folosește un nod de baza (rootNode) la care sunt conectate toate celelalte obiecte (Spatials).

Spre exemplu, avem un nod numit node (figura…), iar acestuia îi atașăm un obiect numit spatial (node.attachChild(spatial);).

Dacă mutăm obiectul (spatial.move(0, 1, 0);) acesta va realiza o translație pe axa y. Apoi, dacă mutăm nodul (node.move(1.5, 0, 0);), observăm faptul că obiectul va realiza o translație de 1.5 unități pe axa X, la fel ca și nodul.

Același principiu se aplică și pentru rotație și scalare.

Pentru aplicația mea, utilizarea nodurilor este esențială, întrucât în funcție de noduri realizez translația/rotația sau detașarea/atașarea unui obiect/nod.

Modelele 3D cu care lucrează jME3 pot avea încorporate și animații ale obiectelor. Luăm, spre exemplu, un model similar unui corp uman și dorim ca acesta să arate ca și cum ar merge și, totodată, să parcurgă o anumită distanță. Astfel, dacă se realizează animația care simulează mersul, după importare și poziționare, practic, la apăsarea unei taste pe care o desemnăm ca fiind butonul de acționare modelul va reda animația realizată în programul de modelare (Blender sau 3ds Max), iar în jME trebuie specificat doar ce distanță va parcurge la fiecare update al aplicației.

Deși acesta este un mod foarte eficient de optimizare, aplicația realizată de mine nu poate beneficia de realizarea animației în 3ds Max și specificarea în jME doar a distanței, deoarece implică anumite mișcări mai complicate, astfel, presupunând că am aplicat o animație brațului 3 de rotație, la detecția unei coliziuni va trebui să fiu capabil să întrerup animația și să o continui cu un alt tip de animație, ceea ce nu se poate realiza.

Capitolul III
Manipularea obiectelor 3D folosind limbajul Java

3.1. Pregătirea mediului de programare

Platforma de dezvoltare a jMonkeyEngine (SDK) se poate descărca gratuit de la adresa http://hub.jmonkeyengine.org/downloads/. Instalarea acesteia este simplă, existând un wizard de instalare.

Ecranul e pornire se poate vedea în figura … :

La prima rulare, SDK-ul cere locația pe disc unde va stoca proiectul/proiectele ce vor fi realizate. Apoi se va deschide fereastra platformei de dezvoltare, asemănătoare platformei Eclipse, dar și NetBeans (figura …).

Se va crea un nou proiect prin alegerea opțiunii New Project …, din meniul File. Alegem categoria JME3 și proiect de tip BasicGame, apăsăm Next, iar în următoarea fereastră introducem numele proiectului și apăsăm Finish. În tabul Projects a fost creat un nou proiect cu numele „Licenta_Alexandru_Pilica”.

3.2. Realizarea programului aplicației

3.2.1. Adăugarea luminilor

În primul rând, pentru ca obiectele să fie vizibile în scenă este necesar să setăm iluminarea scenei. Fără iluminarea scenei, obiectele/modelele realizate nu vor putea fi vizibile. Astfel, există o metodă specială, numită setUpLight(), iar în interiorul ei am adăugat o iluminare de tip AmbientLight și două iluminări de tip DirectionalLight astfel: am setat lumina ambientală cu o culoare de gri inchis, iar cele doua lumini direcționale cu o culoare gri deschis și am poziționat una dintre acestea să acționeze din dreapta-față spre stanga-spate, iar cealaltă acționează din stânga-sus. Pentru ca iluminarea să devină activă în clasa simpleInitApp(), metoda principală a clasei Main, apelăm metoda setUpLight().

3.2.2. Crearea mediului virtual

Realizând tutorialele existente în documentația online, am descoperit anumite modele 3D care m-au ajutat să adaug scenei un aspect mai realist, astfel am folosit un model 3D,numit town, realizat în programul de modelare Blender. Acest model reprezintă un mic orașel cu câteva străzi și cladiri. Modelul l-am inspectat în JME SDK, cu utilitarul SceneComposer, am șters anumite elemente ce nu erau necesare și am adaugat teren (terrain) cu textura de iarbă (figura …).

Pentru a introduce acest model în scenă, în primul rând am setat culoarea fundalului intr-un blue deschis precum cerul.

Apoi, am realizat player-ul (camera de tip First-Person): flyCam.setMoveSpeed(10);, după care am importat modelul în scenă folosind managerul de fișiere (assetManager) și am setat scalarea scenei la valoarea de 2.1f (float), adică modelul se va mări:

Pentru acest model vom crea RigidBodyControl, practic, suprafețele devin rigide, iar pentru player-ul (camera) vom crea CapsuleCollisionShape, o capsulă care va reprezenta corpul player-ului (camerei), astfel, când ne apropiem de orice suprafața a modelului importat în sceneModel, când capsula atinge suprafața nu vom mai înainta. Acest tip de coliziune este de tip fizic, este foarte precis, însă pentru modele complicate precum autovehiculul sau robotul industrial nu vom putea aplica aceeași metodă, ci vom realiza matematic detecția coliziunilor.

3.2.3. Adăgarea robotului și autovehiculului

Figura … ilustrează modul de organizare al scenei după adăugarea tuturor elementelor.

Așa cum putem observa din figura, nodul rădăcină (rootNode) conține toate elementele conținute în scenă. Modelul town și modelul clădirii sunt descendenți direcți ai nodului rădăcină deoarece nu vom atribui nicio mișcare acestor elemente. Am introdus în scenă, pe rând, mașina și robotul.

Mașina va fi formată din două componente (obiecte diferite) fiecare fiind descendent al unui nod: caroseria (împreuna cu celelalte 3 roți și platforma de susținere sunt atașate nodului carNode) și roata din dreapta-față care va fi descendent al nodului wheelNode (care la rândul său este descendent al nodului carNode).

Robotul va fi introdus în scenă, fiecare componentă având propriul nod, iar fiecare nod având doi descendenți: un obiect și un alt nod.

nodul batiu conține obiectul batiu.obj și nodul brațului 1

nodul brațului1 conține obiectul segment01.obj și nodul brațului2

nodul brațului2 conține obiectul segment02.obj și nodul brațului3

nodul brațului3 conține obiectul segment03.obj și nodul elementului 1 al end-effector-ului

nodul elementului 1 al end-effector-ului conține obiectul end-effector-01.obj și nodul elementului 2 al end-effector-ului

nodul elementului 2 al end-effector-ului conține obiectul end-effector-02.obj și nodurile elementelor 3 și 4 al end-effector-ului

nodurile elementelor 3 și 4 al end-effector-ului conțin obiectele end-effector-03.obj și end-effector-04.obj

Pentru a introduce un model procedăm ca în cazul importării modelului town, însă, de această dată, nodurile le vom poziționa (translata) pe fiecare în parte, astfel încât componentele robotului sau autovehiculului să se afle în poziția corectă.

După cum se observă în fragmentul de cod, în primul rând, se setează locația nodului carNode, această locație este relativă la poziția nodului rootNode întrucât nodul mașinii este descendent direct al nodului rădăcină, iar instrucțiunea setLocalTranslation() se interpretează: „vreau ca elementul să fie poziționat la coordonatele X, Y și Z, dar în raport cu nodul rădăcină”.

Spre exemplu, presupunem ca avem două noduri (nod1 și nod2), nod2 este descendent al lui nod1, iar nod1 are locația caracterizată de coordonatele (3.5f, 0.0f, 2.0f). Dorim ca nod 2 să se afle la coordonatele (5.0f, 3.0f, 0.0f) în raport cu nod1, iar instrucțiunea nod2.setLocalTranslation(5.0f, 3.0f, 0.0f); mută nod2 la coordonatele respective, în raport cu nod1. Astfel dacă apelăm nod2.getWorldTranslation();, iar rezultatul îl vom introduce într-un Vector3f, vom constata că nod2 se află la coordonatele (8.5f, 3.0f, 2.0f). instrucțiunea getWorldTranslation() ne dă coordonatele elementului, dar relativ la nodul rădăcină.

Apoi, se importă modelul utilizând managerul de fișiere, se scalează obiectul astfel încât, vizual, raportul de mărime dintre modele să fie realist. În cele din urmă se atașează nodului mașina (carNode) modelul autovehiculului (obiectul car.obj).

Pentru toate celelate obiecte se procedează la fel, față de codul de mai sus, diferă doar valorile translației și numele folosite pentru obiect sau nod.

În final se fac legăturile între noduri astfel încât ierarhia să fie exact ca în figura … .

3.2.4. Setarea tastelor de acționionare a obiectelor

Implicit, clasa SimpleApplication setează o cameră care permite navigarea în scenă folosind tastele W, A, S, D, săgețile și mouse-ul. Vom avea nevoie de mult mai multe taste definite pentru anumite acțiuni.

Deși, navigarea în scenă este deja realizată, am rescris aceste comenzi. Astfel:

cu ajutorul tastelor W, A, S, D ne deplasăm în față, spate, stânga și dreapta;

tastele R și F ne permit deplasarea pe verticală a camerei;

Tastele T și G vor avea ca efect ascensiunea / coborârea platformei

Tastele din zona Numpad vor acționa robotul:

1 și 4 vor translata robotul (batiul) pe axa Z;

2 și 3 vor realiza rotația brațului 1;

5 și 6 vor realiza rotația brațului 2;

iar 8 și 9 vor realiza rotația brațului 3;

Y și H vor realiza rotația primului element al end-effector-ului;

U și J, rotația celui de-al doilea element al end-effectorului;

I și K, translația celui de-al doilea element al end-effectorului;

iar O și L, translația brațelor cleștelui end-effectorului;

Tastele 1 și 2 vor seta viteza cu care se vor realiza mișcările obiectelor.

Setarea tastelor se face în interiorul metodei setUpKeys() și implică definirea tastei și adăugarea unui listener pentru ca aplicația să „asculte” dacă tasta respectivă a fost apăsată.

Se folosesc două tipuri de listeneri: actionListener și analogListener, diferența dintre aceștia fiind că actionListener desemnează o acțiune de tip deschis/închis, pe când analogListener desemnează o acțiune graduală. Astfel, dacă folosim un meniu de pauză al ecranului, trebuie să folosim actionListener, altfel pauza va dura doar cât timp este apasată tasta respectivă.

Fiecărei taste i se atribuie și un nume (ex. „left”) pentru a putea fi identificată de listener și atunci când i se atribuie acțiunea.

3.2.5. Implementarea acțiunilor

Pentru implementarea acțiunilor la apăsarea tastelor se folosesc două metode pentru fiecare tip de listener: ActionListener cu metoda onAction() și AnalogListener cu metoda onAnalog().

Atribuirea mișcărilor se face prin setarea instrucțiunii seg01Node.rotate(x, y, z);, însă trebuie avut în vedere restricțiile de mișcare ale elementelor. Luăm acest exemplu de rotație al brațului 1 care se rotește pe axa Y, dacă nu îi impunem o restricție de rotație, elementul se va roti în jurul axei Y cât timp ținem apăsată tasta atribuită acestei acțiuni (tasta Numpad 3). După cum se observă în fragmentul de cod de mai sus, am impus o restricție, astfel dacă valoarea rotației coboară până la valoarea -0.72, brațul să nu mai execute rotația chiar dacă tasta este apăsată.

Se procedează similar pentru atribuirea acțiunilor celorlalte taste.

Pentru aceste acționări se folosește AnalogListener, iar pentru deplasarea camerei (player-ului) se impune listeneri de tip ActionListener.

În primul rând, atribuim valoarea booleană isPressed atunci când tasta este apăsată, apoi în interiorul metodei simpleUpdate(), specificăm acțiunea ce va fi întreprinsă la apăsarea tastelor atribuite. Vom declara vitezele de deplasare și locația camerei, apoi setăm similar mișcării obiectelor cu control analog, însă nu mai introducem restricții deoarece camera trebuie să poată fi poziționată oriunde în scenă.

3.2.6. Detecția coliziunilor utilizând coordonatele matematice

Anterior, am realizat detecția fizică a coliziunilor pe modelele simple ale acestei scene; o sarcină ușoară pentru că folosește un număr mic de instrucțiuni. Aceasta metoda de detecție a coliziunilor, practic, clonează suprafața modelului (această suprafață nou creată fiind invizibilă), iar pentru modelele robotului și al mașinii nu este o metodă eficientă deoarece aceste obiecte conțin detalii complexe, iar clonarea suprafețelor mărește considerabil timpul de răspuns al aplicației și, implicit, va crea un timp de așteptare la încărcare mai mare și o mișcare sacadată a aplicației în momentul în care se detectează o coliziune.

Modul de detecție fizică a coliziunilor se poate aplica în jocurile convenționale (ex. curse de mașini), întrucât coliziunile nu cer o precizie foarte mare, astfel în locul mașinilor se pot crea box-uri cu aceleași dimensiuni (care la randare vor fi ascunse, doar mașina va fi vizibilă). În aplicația mea, este nevoie de o precizie mare, întrucât simulez o manipulare fină a unor obiecte.

Astfel, am recurs la un artificiu și anume, am creat mai multe box-uri care să fie ascunse la randarea scenei, iar aceste box-uri le voi folosi la detecția coliziunilor, nu modelele în sine.

În continuare, în interiorul metodei simpleUpdate(), am declarat rezultatul coliziunilor (variabilă care specifică numărul de coliziuni detectate) pentru mașină și pentru roată, senzorul de detecție (unul din box-urile realizate special pentru această sarcină), apoi se adaugă instrucțiunea ce are ca efect incrementarea rezultatului coliziunilor atunci când senzorul (box-ul) intră în coliziune cu mașina (car) sau cu roata (wheel).

Se procedează similar pentru fiecare box.

Mai departe, am declarat, variabile pentru fiecare coordonată a fiecărui obiect al robotului sau mașinii. Teoretic, principiul de funcționare al detecției funcționează în modul următor:

La fiecare update al metodei simpleUpdate(), se verifică dacă există coliziune:

Dacă nu se detectează nicio coliziune, atunci se „citesc” coordonatele tuturor nodurilor ce aparțin robotului sau mașinii (trebuie avut în vedere tipurile de mișcări ale diferitelor noduri) și se stochează în variabilele declarate global în clasa Main

Dacă se detectează coliziune, atunci fiecărui nod i se atribuie mișcările și coordonatele stocate la update-ul anterior.

Practic, dacă se detectează coliziune, robotul sau mașina vor reveni la poziția anterioară, în care nu exista coliziune. Codul aferent acestui procedeu are aproximativ 150 linii cod.

Pentru ca utilizatorul să cunoască unde a fost detectată coliziunea, am implementat un procedeu de atenționare prin care se scrie un mesaj în care se specifică unde a fost detectată coliziunea, iar în funcție de acest mesaj, utilizatorul va putea manipula robotul sau mașina astfel încât să deblocheze și să repoziționeze robotul.

3.3. Vizualizarea aplicației

Concluzii

Bibliografie

Frăsinaru C.: „Curs practic de Java”, Ed. Matrixrom, București, 2006;

Duță L.: „Inginerie Informatică în Java”, note de curs, platforma online:

http://moodle.fie.valahia.ro/course/enrol.php?id=153

Moraru F.: note de curs (Universitatea Politehnică, București)

Ghionea I. G.: „3D Studio Max Multimedia și modelare asistată”, București, 2002

http://thenewboston.org/list.php?cat=31 (Accesat la data: 5 aprilie 2013)

http://www.autodesk.com/products/autodesk-3ds-max/overview (Accesat la data: 23 aprilie 2013)

http://jmonkeyengine.org/engine/ (Accesat la data: 11 mai 2013)

http://www.carbodydesign.com/tutorials/3d/3ds-max-tutorials/ (Accesat la data: 14 mai 2013)

http://hub.jmonkeyengine.org/wiki/doku.php/jme3 (Accesat la data: 5 iunie 2013)

http://www.digitaltutors.com/tutorial/3560-Automotive-Modeling-in-3ds-Max (Accesat la data: 10 iunie 2013)

Similar Posts