Sunteți pe pagina 1din 26

Lumea virtuală pe Internet

În lumea IT, apariţia lumilor virtuale se datorează cercetătorilor Universităţii Utah,


conduşi de către Ivan Sutherland care au relizat primul soft cu ajutorul căruia se creea
imaginea unui autovehicul şi tot ei au fost cei care au reuşit să genereze pentru prima oară
imaginea cu umbră, al unui poligon. Ulterior ei au scris soft şi pentru vizualizarea primului
obiect wireframe, pentru simulatoare de zbor.
Următorul pas în lumea graficii a fost făcut de către un grup de cercetări numiţi HITL
(Human Interface Technology Laboratory, fondat in 1989). Aceştia au creat primele resurse
hardware dar şi resurse soft, cum ar fi:
- Aspen Movie Map – simula o călătore în Aspen, Colorado, folosind secvenţe de
imagini filmate în prealabil
- GROPE – aplicaţie folosită în domeniul medical şi bio-chimic.

Primul algoritm de reprezentare 3D a datelor, botezat „Marching Cubes”, a fost creat de Bill
Lorensen şi Harvey Cline. In anii următori în grafica 3D s-a încercareat de a reprezenta datele
cât mai veridic posibil, astfel încât lumea creată să se apropie cât mai mult de lumea reală.
Scenele realizate aveau o complexitate crescută . Bill Reeves, este cel care a introdus noţiunea
de „sisteme de particule”, fiecare scenă 3D fiind construită din elemente indivizibile, numite
particule. Fiecare particulă posedând anumite caracteristici de bază, de exemplu poziţionare
în spaţiu, viteză şi direcţie în mişcare, culoare, timp de viaţă etc., care creau dinamism în
cadrul scenei. Exemplul clasic de utilizare al sistemului de particule reprezintă filmul
„Aventurile lui Andre şi al lui Wally B.”, unde pădurea este creată cu ajutorul acestei
tehnologii.
Toate cercetările ulterioare se bazează pe noţiunea de sistem de particule:
- Craig Reynolds a redefinit particula, considerând-o un poligon care posedă sistem
de coordonate propriu. Cu ajutorul noii particule el a încercat să modeleze
migraţia păsărilor şi peştilor, punând accent pe comportamentul specific al
populaţiei migratoare.
- Dave Haumann şi James Hahn au creat prima scenă virtuală care poate fi
modificată de către utilizatorul softului, prin interacţiune directă.
- Demetri Terzopaulos este primul care a creat lumi virtuale complexe: a
„construit” animale virtuale cu modelarea comportamentului specific, şi a modelat
şi faţa umană, modelul fiind folosit de către chirurgi pentru pregătirea
intervenţiilor chirurgicale reconstructive.
- Loren Carpenter a folosit teoria fractalilor expusă de Mandelbrot şi Julia pentru a
crea un lanţ muntos virtual în filmul „Vol Libre”

Începând din anii 1990 cercetările referitoare la grafica 3D au urmărit fie fluidizarea
mişcării în cadrul scenelor virtuale, fie îmbunătăţirea acestor scene cu ajutorul efectelor de
lumină.

Prezentăm pe scurt unele tehnologii şi produse soft pentru realizarea graficii 3D:

3ds Max
Este o aplicaţie dezvoltată de Autodesk Media & Entertainment pentru platformele Win
32 şi Win 64.
Numele aplicaţia a fost iniţial de 3D Studio şi a funcţionat numai pe platforma DOS.
După achiziţionarea ei de către Autodesk şi-a schimbat denumirea (mai întâi în 3ds max, apoi

1
în versiunea actuală) şi s-a îmbogăţit din punctul de vedere al funcţionalităţii. Este o aplicaţie
răspândită, dispunând de unele unelte speciale, limbaj de scriptare propriu şi altele cum ar fi:
- unelte pentru modelarea unui sistem de particule şi unelte de animare ale
sistemului creat;
- unealta Surface Tool pentru crearea de peisaje complexe cu ajutorul sistemului
de particule;
- MAX Script, limbaj de script propriu;
- posibilitate de modelare prin:
- sistem de poligoane (şi primitive clasice)
- NURBS (nonuniform rational B-splins);
- Particle Flow, unealtă de dinamizare a scenei 3D create;

3ds Max este folosit în special în industria jocurilor PC (contribuind la crearea


jocurilor „Battlefield Vietnam”, „Battlefield 1942”, „Call of duty” etc.) şi în cinematografie
(se pot menţiona filemele „Black hawk down”, „Harry Potter and the prisoner of Azbakam”,
„Lara Croft: tomb raider” etc.)

Lightwave 3D
Este un program folosit pentru modelare şi animaţie 3D şi a fost creat în 1988 de către
programatorii Allen Hastings şi Stuart Ferguson, purtând numele de Videoscape. Iniţial
softul a fost creat exclusiv pentru placa video Amiga 2000 în cadrul proiectului Video
Toaster. Ulterior a fost îmbunătăţit, astfel încât să fie compatibil pe platforme multiple (Mac
OS X, Windows, Linux şi SGI IRIX.
Fiind achiziţionat de către compania Newtek, a fost redenumit în Lightwave.
Lightwave 3D are caracteristici care îi conferă unicitate în comparaţie cu alte softuri de
grafică 3D, şi anume:
- conţine funcţii multi-thread – acestea pot utiliza simultan până la 8 procesoare
pentru efectuarea de calcule matematice complexe;
- are limbaj de scriptare propriu: LScript;
- este alcătuit din 2 pachete soft distincte:
- modelatorul: folosit pentru creare de obiecte tridimensionale
- pachetul cu ajutorul căruia se creează animaţia, efectele de
lumină/umbră, etc.

Maya
Este un soft de grafică 3D folosit cu preponderenţă în domeniul cinematografiei, dar şi la
crearea de jocuri PC şi video. Softul fost creat de către Alias System Corporation, în 2
variante şi anume:
- una cu funcţii limitate: Maya Complete;
- una completă, Maya Unlimited.
Maya, funcţionează pe platforme de Windows, Linux, IRIX şi MAC OS.
Maya dispune de unelte speciale, limbaj de scriptare propriu , ş.a. :
- MEL (Maya Embedded Language)limbaj de scriptare propriu;
- modelare prin: - poligoane şi primitive
- NURBS (la fel ca şi la 3ds Max)
- subdiviziuni (SubD modelling;
- animaţia lumii 3D prin crearea unui „clip de animaţie”, care permite
centralizarea comportamentului unui element din lumea 3D, urmând ca
mişcarea să se realizeze selectând secvenţe din „clip”;

2
Macromedia (Adobe) Flash
Tehnologia Flash a fost introdusă pe piaţă în 1996 şi este binecunoscută pentru
abilitatea ei de a adăuga animaţie şi interactivitate în pagini web. Macromedia Flash cuprinde
2 componente:
- Adobe Flash Player – este o aplicaţie client, folosită în cadrul celor mai
cunoscute browsere (cum ar fi Netscape, Internet Explorer sau AOL)
pentru integrare de animaţii în pagini web;
- Adobe Engagement Platform – softul folosit pentru crearea conţinutului
redat de către Flash Player. Cu ajutorul lui se pot creea, pe lângă animaţii
web, şi filmuleţe sau jocuri (ca exemplu seria Yetisports)

SVG (Scalable Vector Graphics)


Este un limbaj pentru creare de grafică 3D statică sau animată, bazată pe tehnologia
XML; aparţine clasei de limbaje „open standard”, fiind creată de asociaţia World Wide Web
Consortium. SVG a fost construit după introducerea pe piaţă în 1998 a limbajului VML
(Vector Markup Language, asemănător cu XML), de către Adobe şi Microsoft. A cunoscut o
ascensiune rapidă, cea mai recentă versiune a sa fiind SVG Tiny 1.2, lansată în 10 august
2006. SVG are versiuni construite şi pentru platforme mobile (IPOD-uri, telefoane mobile,
PDA-uri), cum ar fi SVG Tiny sau SVG Basic.
Permite crearea a 3 tipuri de obiecte:
- forme grafice vectoriale, construite din linii drepte sau curbe, ele pot fi
grupate, formând obiecte compuse;
- imagini grafice digitale;
- obiecte text;
Grafica creată prin SVG poate fi in acelaşi timp animată şi interactivă, se permite
alocarea oricărui obiect SVG a evenimentelor de tip „onmouseover” şi „onclick”. De
asemenea SVG oferă posibilitatea comprimării elementelor folosite, obţinându-se de tip
„gzip”, astfel îmbunătăţindu-se performanţa rulării acestor fişiere.
Grafica SVG poate fi vizualizată pe multiple browsere Opera, Firefox, OmniWeb,
Konqueror, Internet Explorer şi Safari (pe ultimele două browsere conţinutul SVG poate fi
vizualizat numai dacă se foloseşte un plugin SVG).

3
Avantaje/dezavantaje ale folosirii elementelor grafice pe web
Grafica 3D pe web are avantaje deosebite, deoarece utilizatorii internetului preferă ca
paginile de web vizitate să fie animate, dinamizate şi interactive, ei nu mai sunt satisfăcuţi de
paginile care conţin numai text sau imagini neanimate.
Principalele avantaje ale folosirii graficii pe web sunt:
- efectele vizuale avansate sunt atractive pentru utilizator, el având
posibilitatea de a interacţiona cu lumea virtuală;
- se obţine o redimensionare a paginilor web: efectul 3D este veridic,
controlul conţinutului se poate realiza uşor şi de către utilizator;
- programatorul are o mare libertate în crearea animaţiilor 3D, el având la
dispoziţie pe lângă multiplele limbaje de programare şi multe obiecte 3D
predefinite;
Pe lângă aceste avantaje, există însă şi dezavantaje:
- manipularea lumii tridimensionale se face pe o platformă bidimensională;
- folosirea elementelor grafice îngreunează cu mult lucrul procesorului.;
- în cazul elementelor dinamizate, creşte volumul de cod sursă, de aceea este
foarte greu să se obţină o fluiditate a mişcărilor în lumea virtuală.

Limbajul VRML
- Tehnologia VRML ( Virtual Reality Markup Language) a fost intens folosită încă de la
lansare, în decursul anului 1997 apărând primele pagini web cu grafică 3D VRML (de
exemplu siteurile de chat 3D CyberTown). Datorită succesului cunoscut, a fost preluată de
SGI’s Cosmo Software, iar mai apoi de Platinum Technologies şi Computer Associates
(CA)..

Avantaje/dezavantaje ale folosirii tehnologiei VRML

Folosirea tehnologiei VRML prezintă aceleaşi avantaje şi dezavantaje ca şi utilizarea


celorlalte metode de creare a graficii 3D. Printre avantaje se poate menţiona:
- libertate în crearea de grafică 3D: toate efectele create în VRML sunt la discreţia
utilizatorului, acesta având control deplin asupra graficii create şi multiple
posibilităţi de a o vizualiza (obiectele create pot fi apropiate sau depărtate,
întoarse, răsturnate etc.);
- structurile create în VRML sunt copii fidele ale structurilor reale, efectul vizual
creat fiind unul avansat (datorită lucrului în trei dimensiuni);
Principalele dezavantaje ale tehnologiei VRML sunt:
- dificultăţi în a reprezenta cu exactitate structurile reale: complexitatea lumii reale
este greu de redat în VRML, deoarece se încearcă recrearea şi manipularea unei
lumi tridimensionale într-un mediu bidimensional. Tot din acestă cauză este
dificilă stabilirea şi reprezentarea poziţiei relative a mai multor obiecte 3D.
- timpul de prelucrare a calculelor necesare reprezentării unei lumi VRML este
foarte lung, ceea ce duce la suprasolicitarea procesorului, astfel încât scenele 3D
reprezentate cu multe detalii sau cele foarte dinamice se vor afişa trunchiat.

4
VRML 1.0 vs. VRML 2.0

Prima versiune oficială a tehnologiei VRML este 1.0, aceasta având următoarele
caracteristici:
- a fost construită exclusiv pentru creare de grafică 3D statică, neanimată.
- se foloseşte de anumite forme predefinite (numite primitive), pentru a construi
scenele 3D. Exemple de primitive: cub (box), cilindru (cylinder), sferă (sphere),
con (cone) etc. Programatorul are însă posibilitatatea de a-şi defini propriile forme
complexe, de a le salva şi de a le utiliza în crearea de scene 3D. Toate formele
vizibile şi caracteristicile lor sunt definite în entităţi numite noduri.
- permite operaţii relativ simple pentru manipularea obiectelor create, cum ar fi
transformări, scalări sau rotaţii.
- permite personalizarea lumii 3D construite prin aplicare de culori, texturi şi prin
metode de iluminare a scenei.
VRML 2.0 a păstrat toate funcţionalităţile şi caracteristicile primei versiuni, adăugând
altele noi, cum ar fi:
- posibilitatea de a adăuga anumite comportamente obiectelor create, fără să fie
nevoie de rescrierea întregului cod-sursă. Astfel, din statice lumile 3D au devenit
dinamice. Totodată se pot implementa tipare de comportament pentru
interacţiunea utilizatorului cu scena virtuală, acesta având şi posibilităţi de a
modifica scena deja construită.
- posibilitatea de a încorpora sunete sau fişiere video în lumea virtuală.
- posibilitatea de a folosi limbaje de script (JavaScript) sau limbaje de programare
(Java) pentru perfecţionarea lumii 3D create.

Navigare în lumea virtuală


Odată creată şi integrată într-o pagină HTML, o scenă grafică VRML poate fi vizualizată
de către toţi cei care vizitează acea pagină, cu condiţia ca browserul lor să suporte conţinut
VRML. Browserele compatibile VRML sunt de două tipuri:
- browsere independente (standalone) – acestea oferă posibilitatea de a vizualiza
numai conţinut VRML;
- browsere integrate – folosite în cazul în care se încearcă vizualizarea unei
pagini cu conţinut mixt HTML-VRML. Acestea sunt folosite ca plugin la
browserele clasice HTML.

Exemple de browsere VRML:


 Microsoft ActiveVRML: browser lansat în 1996, folosit pentru o perioadă scurtă
de timp, deoarece prezenta probleme la vizualizarea graficii VRML dinamice.
 Live3D: este un browser VRML independent, folosit cu browserul HTML
Netscape Navigator. El poate fi folosit pentru vizualizare de grafică statică
(VRML 1.0) şi dinamică (VRML 2.0), fiind distribuit împreună cu Netscape,
începând cu versiunea 3.0 al acestuia.
 Intervista’s WorldView: acest browser poate fi folosit atât independent cât şi ca
plugin la Netscape respectiv Internet Explorer. Oferă posibilitatea ca utilizatorul
să-şi salveze anumite puncte de reper pe parcusrul vizualizării lumii virtuale,
puncte ce pot fi revizitate.
 SGI’s CosmoPlayer: este cel mai cunoscut browser VRML, având integrat şi un
convertor pentru transformarea fişierelor VRML 1.0 în VRML 2.0. Este
compatibil şi cu părţile de cod implementate în Java sau JavaScript.

5
 Sony’s CyberPassage: este considerat a fi primul browser creat exclusiv pentru
vizualizare de grafică VRML 2.0 (celelalte au avut mai întâi versiune pentru
VRML 1.0, fiind apoi upgradate pentru conţinut VRML 2.0). Este compatibil şi cu
scripturi JavaScript şi oferă facilităţi de multiuser (lumea virtuală poate fi
analizată în timp real de către mai mulţi utilizatori).

Construcţia scenelor virtuale cu VRML

O scenă virtuală VRML poate fi construită prin 2 modalităţi:


1) folosind un simplu editor text (Notepad) pentru a scrie fiecare linie de cod în parte.
Această metodă este una foarte costisitoare din punctul de vedere al timpului
sacrificat de către programator, oferă însă posibilitatea ca acesta să aibă control
deplin asupra etapelor de creare a graficii.
2) cu ajutorul unui builder VRML: acesta este un pachet soft folosit pentru a construi
orice scenă 3D cu efort minim de programare. Printre principalele buildere aflate la
dispoziţia programatorului sunt demne de menţionat următoarele două:
 VRealmBuilder – pachet soft creat de către IDS Software. Este
ideal pentru începători, aceştia având posibilitatea de a comuta
între grafica creată şi codul sursă generat (sunt respectate cu
stricteţe sintaxa şi regulile de construcţie ale fişierului VRML).
Structura fişierului creat nu poate fi modificată, programatorul
neavând posibilitatea de a-şi crea propria ierarhie de noduri sau
obiecte.
 Caligari’s Truespace – este cunoscut şi sub numele de Pioneer sau
Fountain. Acest pachet soft oferă, pe lângă primitivele şi formele
geometrice clasice, posibilitatea construirii de forme grafice 3D
complexe, bazate pe sisteme de poligoane şi conţine instrumente şi
pentru creare de text animat.

Structura şi caracteristicile unui fişier VRML V2.0


Structura generală a unui fişier VRML (fşierul are extensia .wrl) este dată de următoarele
secţiuni:
1. un fişier VRML începe întotdeauna cu următorul header:

#VRML V2.0 utf8


2. comentarii precedate de caracterul #
3. noduri

Identificatorul utf8 din header permite programatorului folosirea unui set de caractere
extins pentru construcţia scenei 3D (litere greceşti, caractere din alfabetul chinez etc.). Orice
linie care începe cu caracterul #, în afară de acest header este considerat a fi comentariu.
Fişierul VRML este salvat cu extensia „.wrl”.
Modelul de culoare folosit în VRML este RGB, astfel încât este nevoie de 3 valori
pentru specificarea unei culori: roşu (RED), verde (GREEN) şi albastru (BLUE), fiecare cu
valori cuprinse în intervalul [0, 1] (de exemplu combinaţia 0.0 0.0 0.0 semnifică culoarea
neagră şi 1.0, 1.0, 1.0 reprezintă culoarea albă). Unitatea de măsură predefinită a distanţei
este metrul, iar unghiurile sunt măsurate în radiani (şi nu în grade).

6
Noduri în VRML V2.0
Mulţimea de bază a obiectelor VRML constă din nodurui.
Dacă nodurile geometrice nu au precizate dimensiunile, atunci vor fi considerate valorile
implicite date în sintaxa nodurilor.

Nodul Shape
Sintaxă:
Shape{
appearance NULL
geometry NULL
}
Semantică:
Toate obiectele vizibile create în VRML sunt definite în interiorul nodului Shape, unde
găsim următoarele câmpuri:
- appearance – specifică un nod de tip Appearance, prin intermediul căruia
stabilim culoarea, textura şi celelalte caracteristici vizuale ale formei geometrice;
- geometry – indică forma geometrică creată. Acestea pot fi de două tipuri:
 forme primitive: Box (cub), Cone (con), Cylinder (cilindru) şi Sphere
(sferă).
 forme geometrice avansate: Elevation Grid, Extrusion,
IndexedFaceSet, IndexedLineSet şi PointSet.

Nodul Box
Sintaxă:
Box {
size 1.0 1.0 1.0
}
Semantică:
Nodul Box defineşte un paralelipiped căruia i se poate stabili lăţimea, înălţimea şi
grosimea. Centrul de greutate el formei create este prestabilit la punctul cu coordonatele
(0,0,0) din sistemul de coordonate local (practi centrul ecranului). Box are un singur câmp,
size, prin intermediul căruia se defineşte mărimea corpului geometric pe axele X, Y şi Z.
Câmpul are valoarea iniţială 1.0, 1.0, 1.0.

Nodul Sphere
Sintaxă:
Sphere {
radius 1.0
}

Semantică:

7
Nodul Sphere defineşte o sferă cu raza predefinită la 1.0 m. Sphere are un singur
camp, radius, iar sfera afişată va avea centrul de greutate în centrul ecranului, în punctul cu
coordonatele (0,0,0).

Nodul Cone
Sintaxă:
Cone {
bottomRadius 1.0
height 2.0
side TRUE
bottom TRUE
}
Semantică:
Nodul Cone se foloseşte pentru definirea unui con şi are 4 câmpuri:
- bottomRadius: reprezintă raza cercului aflat la baza conului. Valoare ei trebuie să
fie mai mare de 0.0;
- height: înălţimea conului;
- side şi bottom: valori booleene, care specifică părţile vizibile ale conului desenat
(de exemplu dacă side e FALSE, se va afişa numai cercul aflat la baza conului);

Nodul Cylinder
Sintaxă:
Cylinder {
radius 1.0
height 2.0
side TRUE
bottom TRUE
top TRUE
}
Semantică:
Nodul Cylinder defineşte un cilindru, şi are 5 câmpuri:
- radius şi height – definesc proporţiile geometrice ale cilindrului. Valoarea lor
trebuie să fie mai mare de 0.0;
- side şi bottom – valori boolene, au aceeaşi funcţie ca şi în cazul nodului Cone;
- top – valoare booleană, este TRUE dacă se doreşte afişarea cercului din partea de
sus a cilindrului („capacul” lui), şi FALSE, dacă acesta e invizibil.

Nodul PointSet
Sintaxă:
PointSet {
color NULL
coord NULL
}
Semantică:

8
Nodul PointSet defineşte o mulţime de puncte 3D din sistemul de coordonate local şi
are 2 câmpuri:
- color – reprezintă un nod de tip Color, fiind un camp opţional, cu valoarea
predefinită la culoarea neagră;
- coord – reprezintă un nod de tip Coordinate, conţinând un set de coordonate 3D.
Numărul componentelor din câmpul color trebuie să coincidă cu numărul celor din coord.

Nodul IndexedLineSet
Sintaxă:
IndexedLineSet {
coord NULL
coordIndex [ ]
color NULL
colorIndex [ ]
colorPerVertex TRUE
}
Semantică:
Nodul IndexedLineSet defineşte o mulţime de drepte din sistemul de coordinate local şi
are 5 câmpuri:
- color şi coord – cu aceleaşi funcţii ca şi la PointSet;
- coordIndex – conţine o mulţime de indecşi de coordinate cu ajutorul cărora se va
desena dreapta 3D. Indecşii se separă cu ajutorul caracterului “ “, un index cu
valoarea -1 reprezentând şfârşitul listei coordonatelor aparţinând dreptei curente.
- colorIndex – are aceeaşi funcţie ca şi coordIndex, însă se referă la culorile aplicate
dreptelor.
- colorPerVertex – camp Boolean prin intermediul căruia se defineşte modul de
aplicare al culorilor. Dacă valoarea lui este TRUE, fiecare segment de linie poate
avea culoare diferită, astfel încât desenarea dreptei poate începe cu o culoare şi se
poate termina cu alta. Dacă valoarea câmpului e FALSE, fiecare dreaptă are o
singură culoare.
Exemplu:
#VRML V2.0 utf8
IndexedLineSet {
coord 0 0 0 1 1 0 -1 0 0 -1 -1 0
coordIndex [3 0 2 1]
colorIndex [0 1 2 0 ]
colorPerVertex TRUE
}

Afişarea textului în VRML


Nodul care permite afişarea de şiruri de caractere (stringuri) în lumea VRML este
Text.
Sintaxă:
Text {
string [ ]
fontStyle NULL
length [ ]

9
maxExtent 0.0
}
Semantică:
Nodul Text conţine următoarele câmpuri:
- string – conţine textul care va fi afişat, formatat pe un singur sau mai multe
rânduri, caz în care fiecare linie este considerată ca fiind un string de sine stătător;
- fontstyle – conţine un nod Fontstyle şi se referă la modul de afişare al şirului de
caractere;
- length – reprezintă lungimea fiecărui string în unităţi VRML şi anume: valoarea 0
înseamnă că şirul de caractere rămâne nemodificat, o valoare pozitivă înseamnă
comprimarea unui string considerat lung, iar o valoare negativă se interpretează ca
o expandare al unui string scurt;
- maxLength – setează o limită maximă pentru lungimea stringurilor.

Proprietăţile de afişare al unui şir de caractere se stabilesc prin intermediul nodului


FontStyle.
Sintaxă:
FontStyle {
family "SERIF"
horizontal TRUE
justify "BEGIN"
language ""
leftToRight TRUE
size 1.0
spacing 1.0
topToBottom TRUE
}
Semantică:
Nodul FontStyle are câmpurile:
- family – specifică familia de fonturi şi poate lua valorile SERIF, SANS sau
TYPEWRITER;
- style – se referă la stilul de afişare al caracterelor. Valori posibile: PLAIN, BOLD,
ITALIC sau BOLDITALIC;
- horizontal – câmp cu valori booleene, permite afişarea de text pe orizontală;
- leftToRight – câmp boolean care specifică dacă textul se afişează de la stânga la
dreapta sau de la dreapta la stânga (în stil arab);
- topToBottom – stabileşte direcţia de afişare de sus în jos sau de jos în sus (în stil
chinezesc);
- justify – stabileşte modul de aliniere al textului. Câmpul poate avea valorile
FIRST, BEGIN (ambele însemnând aliniere la stânga), MIDDLE (text centrat) sau
END (aliniere la dreapta);
- language – specifică setul de caractere folosit, de exemplu „en” – engleză,
„en_US” – engleză americană etc.
- size – specifică mărimea caracterelor în unităţi VRML (şi nu în pixeli);
- spacing – folosit pentru a specifica spaţiul între rândurile textului;

10
Nodul Appearance
Formele geometrice – mai simple sau mai complexe – create în VRML vor arăta toate
la fel în cazul în care nu sunt personalizate. Culoarea predefinită în VRML este cea neagră, ea
se va aplica tuturor elementelor lumii virtuale în cazul în care acestea nu sunt complet
definite de către creatorul lor.
Nodul care ajută la definirea caracteristicilor vizuale al oricărui nod de tip Shape este
Appearance.
Nodul Appearance are sintaxa:
Appearance {
material NULL
texture NULL
textureTransform NULL
}
Semantică:
Nodul are 3 câmpuri opţionale:
- material – defineşte un nod de tipul Material, care specifică culoarea corpului
VRML şi modul în care acesta va reflecta lumina;
- texture – va conţine un nod de textură, de tipul ImageTexture, MovieTexture sau
PixelTexture;
- textureTransform – conţine un nod de tipul TextureTransform şi defineşte modul
în care se aplică textura pe forma geometrică;

Nodul Material

Cu ajutorul acestui nod se poate specifica culoarea, modul de reflecţie şi transparenţa


materialului aplicat unui corp geometric. Nodul se poate defini numai în interiorul unui nod
de tip Appearance.
Sintaxă:
Material {
diffuseColor 0.8 0.8 0.8
ambientIntensity 0.2
emissiveColor 0.0 0.0 0.0
specularColor 0.0 0.0 0.0
shininess 0.2
transparency 0.0
}

Semantică:
Nodul Material are 6 câmpuri:
- diffuseColor – se foloseşte pentru definirea culorii aplicate. Câmpul este ignorat
dacă se aplică şi texturi pe corpul geometric;
- emissiveColor – defineşte gradul de strălucire al suprafeţei colorate;
- ambientIntensity – determină volumul de lumină reflectat de către corpul
geometric;
- specularColor – defineşte culoarea „petelor” lucioase de pe materialul corpului
geometric;

11
- shininess – moderează intensitatea cu care strălucesc „petele” lucioase de pe
suprafaţă, valori mici însemnând strălucire moderată, iar valori mari strălucire
intensă;
- transparency – este folosit pentru specificarea gradului de transparenţă al
materialului. Valoarea 0.0 semnifică o suprafaţă complet opacă, iar 1.0 o suprafaţă
total transparentă.
Culorile în nodul Material se reprezintă în mod caracteristic VRML, ca un triplet
RGB, cu valori reale cuprinse între 0.0 şi 1.0.

Texturi

VRML 2.0 permite texturarea formelor geometrice cu ajutorul imaginilor, filmelor


sau imaginilor pixelate. Odată aleasă, textura se va aplica tuturor feţelor formei geometrice.
Se permite redimensionarea texturii alese, dar şi repetarea ei pe orizontală, verticală sau
ambele sensuri astfel încât să acopere faţa/feţele corpului geometric. De asemenea există şi
posibilitatea de a transforma sau roti o textură cu ajutorul nodurilor TextureTransform şi
TextureCoordinate.

Nodul ImageTexture
Permite setarea unei imagini JPEG, GIF sau PNG ca textură, cu ajutorul acestui nod
se poate stabili şi modul în care se va aplica textura (dacă se va repeta pe orizontală sau
verticală şi cum se va aplica pe feţele formei geometrice).
Sintaxă:
ImageTexture {
url [ ]
repeatS TRUE
repeatT TRUE
}
Semantică:
Nodul are următoarele câmpuri opţionale:
- url – specifică locaţia imaginii, se pot da şi liste de locaţii în care browserul să
caute imaginea;
- repeatS – specifică dacă imaginea se va repeta pe verticală, câmpul poate lua
valori booelene;
- repeatT - specifică dacă imaginea se va repeta pe orizontală, câmpul poate lua
valori booelene;

Nodul TextureTransform
Acest nod permite efectuarea de operaţii simple (scalări, transformări, rotaţii sau
translaţii) asupra coordonatelor texturii folosite. TextureTransform poate apărea numai în
interiorul unui nod Appearance.
Sintaxă:
TextureTransform {
scale 1 1
rotation 0
12
center 0 0
translation 0 0
}

3.5. Definirea surselor de lumină

Obiectele create au fost luminate cu sursa de lumină predefinită de către browser,


lumina indicând obiectul examinat la un moment dat. Această sursă de lumină este una de tip
headlight, VRML oferind posibilitatea de a folosi şi alte tipuri de iluminări, şi anume: lumina
direcţionată (directional light), lumina punctiformă (point light) şi lumina de tip bec (spot
light).
Probleme întâmpinate în iluminarea unei scene VRML:
- reflecţia luminii – în realitate în momentul în care un obiect este iluminat acesta
reflectă lumina în funcţie de materialul din care este construit şi de culoarea sa. În
lumea virtuală VRML însă nu este cunoscut conceptual de lumină reflectată, ceea
ce înseamnă că sunt vizibile numai obiectele care sunt illuminate în mod direct.
- atenuarea luminii – VRML are această funcţie prin intermediul căruia se
modelează efectul de scădere în intensitate a luminii odată cu creşterea distanţei
dintre obiectul iluminat şi sursa de lumină (numai în cazul unei surse de lumină
punctiforme sau de tip bec).
- umbrele – VRML nu permite modelarea efectului de umbră, deoarece ar creşte
foarte mult complexitatea graficii create. Umbrele pot fi doar simulate,
manipulând culoarea aplicată elementelor lumii virtuale.
- iluminarea unei suprafeţe plane - prezintă probleme în cazul în care se doreşte
iluminarea doar al unei părţi din totalul suprafeţei, însă aceste probleme se pot
rezolva dacă suprafeţele plane se definesc cu ajutorul unor noduri IndexedFaceSet
sau ElevationGrid, asftel încât ele să fie alcătuite din mai multe sectoare, creându-
se astfel suprafeţe gen meşe.
- lumini colorate – VRML oferă posibilitatea de a color alumina, trebuie însă să se
ţină cont de anumite reguli:
o în cazul în care se definesc culori pure (roşu, verde sau albastru) obiectele
colorate astfel vor reflecta numai lumina de aceeaşi culoare;
o obiectele colorate cu culori pure iluminate cu lumină de altă culoare, vor
rămâne “în intuneric”, nu vor reflecta lumina;
Se recomandă deci folosirea culorilor mixte (amestecuri de roşu, verde şi albastru).
Nodul DirectionalLight
Sintaxă:
DirectionalLight {
on TRUE
intensity 1
ambientIntensity 0
color 0.4 1 0.0
direction 0 1 -1
}
Semantică:
Acest nod defineşte o sursă de lumină aflată la o distanţă foarte mare de lumea
virtuală creată, astfel încât razele de lumină care ajung la obiectele din acea lume sunt deja
paralele pe o anumită direcţie. Lumina definită prin intermediul acestui nod are effect numai

13
asupra obiectelor definite în acelaşi grup cu nodul DirectionalLight. Câmpurile acestui nod
sunt:
- on – camp boolean, determină dacă lumina direcţională e sau nu activă;
- intensity – reprezintă intensitatea luminii, poate avea valori între 0.0 şi 1.0;
- ambientIntensity – specifică prin valoarea sa (între 0.0 şi 1.0) măsura în care
lumina direcţională contribuie la iluminarea generală a scenei 3D;
- color – un camp RGB prin care se determină culoarea luminii;
- direction – specifică un vector 3D care setează direcţia luminii;

Nodul PointLight
Sintaxă:
PointLight {
on TRUE
intensity 0.8
ambientIntensity 0.2
color 1 1 0.1
location 0 0 0
attenuation 1 0 0
radius 80
}

Semantică:
Acest nod defineşte o sursă de lumină aflată într-o locaţie exactă, din această locaţie
razele de lumină se împrăştie în toate direcţiile. Se iluminează toate corpurile care se află în
calea de lumină, nu numai cele definite în acelaşi grup de obiecte cu nodul PointLight.
Intensitatea luminii se poate totuşi limita cu atributul radius, care specifică raza sferei în
interiorul căreia obiectele sunt iluminate de către sursa de lumină definită. Alte câmpuri ale
nodului PointLight:
- on - camp boolean, determină dacă lumina punctiformă e sau nu activă;
- intensity – reprezintă intensitatea luminii, cu valori între 0.0 şi 1.0;
- ambientIntensity – specifică prin valoarea sa (între 0.0 şi 1.0) măsura în care
lumina direcţională contribuie la iluminarea generală a scenei 3D;
- color – un câmp RGB care determină culoarea luminii;
- location – specifică un vector 3D care defineşte coordonatele sursei de lumină;
- attenuation – vector 3D care specifică modul în care lumina îşi va pierde din
intensitate odată cu creşterea distanţei de la sursă;

Nodul SpotLight
Sintaxă:
SpotLight {
on TRUE
intensity 1
ambientIntensity 0.2
color 1 0.1 1
location 0 1 0
direction 0 0 0
attenuation 1 0 0
radius 80

14
cutOffAngle 0.78
beamWidth 0.78
}
Semantică:
Acest nod defineşte o sursă de lumină aflată într-o locaţie anume, cu direcţia luminii
bine stabilită, astfel încât razele de lumină emise dintr-o astfel de sursă să formeze un con de
lumină. Acest con este caracterizat de două din câmpurile nodului, şi anume:
- cutOffAngle – defineşte unghiul pe care îl formează generatorii conului, se
specifică în radiani, valoarea sa trebuie să se încadreze în intervalul 0-1,57 (0˚-
180˚);
- beamWidth – defineşte unghiul unui con mai mic, în interiorul căruia lumina are o
intensitate constantă;

Noduri cu funcţie de grupare


VRML oferă următoarele noduri cu funcţie de grupare:
- Anchor – reprezintă o formă complexă construită dintr-o mulţime de alte
forme, preluate printr-un hyperlink dintr-o altă lume VRML, pagină
HTML sau orice altă structură de date ce poate fi interpretată de către
browser;
- BillBoard – reprezintă o mulţime de noduri, care indiferent de poziţia
privitorului sunt vizibile şi apar cu faţa spre privitor;
- Collision – o mulţime de noduri care anunţă browserul momentul în care
se întâlneşte un eveniment de tip coliziune;
- Group – defineşte un nod compus, format de o mulţime de alte noduri,
facilitează reutilizarea acelor noduri;
- Switch – o mulţime de noduri din care poate fi reprezentat cel mult un nod
la un moment dat;
- Transform - defineşte un sistem nou de coordonate pentru lumea virtuală,
diferit de cel predefinit;
În VRML gruparea are ca scop principal limitarea modificărilor ce se pot realiza
asupra nodurilor doar la anumite noduri, cele care fac parte din acelaşi grup. Se permite ca un
grup de noduri să fie inclus în alt grup, astfel încât să se creeze structuri ierarhice de noduri.

Nodul Group
Sintaxă:
Group {
children []
bboxCenter 0 0 0
bboxSize -1 -1 -1
}
Semantică:
Acest nod permite ca o mulţime de noduri să fie tratate ca o singură entitate (nod)
VRML. Conţine următoarele câmpuri:
- children – conţine nodurile (elementele) incluse în grup;
- bboxCenter şi boxSize - cu semnificaţia definită în nodul Anchor;

15
Nodul Transform
Sintaxă:
Transform {
scale 1 1 1
scaleOrientation 0 0 1 0
center 0 0 0
rotation 0 0 1 0
translation 0 0 0
bboxCenter 0 0 0
bboxSize -1 -1 -1
children []
}

Semantică:
Nodul Transform permite definirea unui nou system de coordinate local pentru nodurile ce
fac parte din grup. Cu ajutorul său se pot efectua operaţii de tip rotaţie, scalare sau translaţie,
acestea afectând de asemenea toate nodurile conţinute de grup. Câmpurile nodului Transform
sunt:
- children – conţine toate nodurile ce vor face din grup;
- scale – se referă la o transformare de tipul scalare;
- scaleOrientation – specifică modul de rotaţie al axelor sistemului de coordinate
pentru ca scalarea să se poată realize;
- center – defineşte centrul operaţiei de scalare;
- rotation – defineşte o rotaţie pe una din axe, are 4 valori, primele 3 se referă la
axele de coordinate X, Y, Z, iar cel de-al 4-lea unghiul rotaţiei;
- translation – defineşte o nouă origine pentru sistemul de coordinate;
- bboxCenter şi boxSize - cu semnificaţia definită în nodul Anchor;

3.7. Evenimente
Principala diferenţă între VRML 1.0 şi VRML 2.0 este reprezentată de capacitatea
nodurilor să fie emiţători sau receptori de evenimente, astfel încât în VRML 2.0 se pot defini
obiecte animate care pot avea anumite reacţii la interacţiunea cu utilizatorul. Aceste reacţii se
obţin prin modificarea anumitor câmpuri din nodurile deja create, acestea purtând numele de
„câmpuri expuse” şi putând fi descompuse în 3 subcomponente (fieldName reprezentând
numele câmpului expus):
eventIn set_fieldName
field fieldName
eventOut fieldName_changed
O astfel de definiţie semnifică faptul că nodul declarat are capacitatea de a recepta
evenimente (eventIn), dar în acelaşi timp poate să şi genereze evenimente (eventOut). Prin
eventIn se setează valoarea implicită al câmpului expus, în momentul în care această valoare
se modifică se va genera răspunsul la acea modificare cu ajutorul componentei eventOut.
Exemple de câmpuri expuse: diffuseColor, url, point[], scale, rotation sau translation.
Nodurile VRML pot dispune şi de alte câmpuri de tip eventIn sau eventOut, acestea
însă nu sunt vizibile în definiţia nodului, sunt considerate implicite. De asemenea pot exista

16
noduri care au câmpuri eventIn definite fără să aibă correspondent eventOut (cum ar fi
câmpurile coordIndex[], colorIndex[], orientation sau scale).
Modul de gestionare al evenimentelor este următorul: în momentul producerii unui
eveniment, nodul care l-a generat returnează o valoare sau o mulţime de valori de un anumit
tip (în funcţie de tipul evenimentului). Astfel, producerea de evenimente în VRML poate fi
văzută ca o transmitere de date de la utilizator către nodul care va fi modificat. În funcţie de
valorile transmise de către parametric nodul va răspunde cu o acţiune specifică, acţiune
reflectată de modificare valorilor câmpurilor expuse. Pentru a putea transmite acţiunea dorită
unui nod şi pentru a putea recepta răspunsul său, VRML se foloseşte de scripturi şi de rutarea
evenimentelor (ROUTES).
În VRML există posibilitatea de a genera evenimente şi fără modificarea valorii
câmpurilor expuse, folosind una din următoarele structuri:
- timere – generează evenimente la anumite intervale de timp predefinite;
- senzori – senzori de atingere (touch sensors): generează evenimente atunci când
cursorul mouse-ului este plasat asupra unui obiect/nod definit în acelaşi grup de
noduri ca şi senzorul;
- senzori de vizibilitate (visibility sensors): generează evenimente atunci când un
obiect sau mai multe din grupul în care e definit senzorul este vizibil pentru
utilizator;
- senzori de mişcare (dragging sensors): generează evenimente atunci când
utilizatorul dă click peste un obiect (din acelaşi grup ca şi senzorul) şi îl „trage” pe
ecran, schimbându-i poziţia;
- senzori de apropiere (proximity sensors): evenimentul se declanşează în momentul
în care pointerul mouse-ului se află la o anumită distanţă de obiectul care va
suporta consecinţele evenimentului;
3.7.1. Rutarea evenimentelor (ROUTES)
În VRML un nod poate genera (trimite) sau recepţiona evenimente, legătura între un
eveniment generat de un nod şi nodul care receptează evenimentul fiind realizat de entitatea
ROUTE.
Sintaxă: ROUTE Node.eventOut_changed TO Node.set_eventIn
Prefixul “set_” şi sufixul “_changed” nu sunt obligatorii, este corectă şi următoarea sintaxă:
ROUTE Node.eventOut TO Node.eventIn. După cum se vede, ROUTE nu permite
stabilirea noii valori pentru câmpul expus modificat.
În VRML pot exista adevărate cascade de evenimente, deoarece se generează câte un
eveniment de fiecare dată când un câmp expus îşi schimbă valoarea. Fiecare eveniment
generat are ataşat momentul exact al producerii sale, şi în cazul în care sunt mai multe
evenimente care s-au produs în acelaşi moment, ele au ataşate aceeaşi etichetă temporală. În
cascada de evenimente pot exista evenimente care se repetă nejustificat. Ele sunt automat
eliminate din cascadă în cazul în care au aceeaşi etichetă temporală, deoarece VRML nu
permite astfel de repetiţii.

3.7.2. Senzori
Nodul TimeSensor
Sintaxă:
TimeSensor {

17
cycleInterval 1.0
enabled TRUE
loop FALSE
startTime 0
stopTime 0
}
Semantică:
Acest nod funcţionează ca un cronometru care declanşează unul sau mai multe
evenimente la anumite intervale de timp (creându-se astfel efecte de animaţie). Nodul are
următoarele câmpuri:
- enabled – specifică statutul senzorului (dacă are valoarea TRUE senzorul e activ,
la valoarea FALSE senzorul este inactiv);
- startTime – specifică momentul în care senzorul începe generarea evenimentelor.
Valoarea câmpului este în secunde şi reprezintă numărul de secunde trecute de la
data 01.01.1970, ora 00:00;
- stopTime – specifică momentul în care senzorul va înceta generarea de
evenimente. Valoarea câmpului este în secunde şi reprezintă numărul de secunde
trecute de la data 01.01.1970, ora 00:00;
- cycleInterval – specifică intervalul de timp în carese vor genera evenimentele,
având valoarea măsurată în secunde;
- loop – specifică dacă în momentul în care expiră numărul de secunde definite în
câmpul cycleInterval, TimeSensor va fi sau nu restartat;
Senzorul de timp funcţionează astfel: în momentul în care de la crearea lumii virtuale
a trecut numărul de secunde specificată în câmpul startTime, TimeSensor începe măsurarea
timpului alocat producerii evenimentelor. Se vor produce evenimente până când numărul de
secunde contorizate va fi egal cu valoarea specificată în stopTime sau cu valoarea obţinută
din suma valorii din startTime cu cea din câmpul cycleInterval.
În cazul în care este specificată o valoare validă în câmpul cycleInterval nodul
TimeSensor va genera un eveniment fraction_changed, ce va avea valori cuprinse între 0.0 şi
1.0 (reprezentând fracţiunea de timp consumată din cycleInterval). Un alt eveniment generat
de către nodul TimeSensor este isActive. Acesta va avea valoarea TRUE cât timp
cronometrul măsoară trecerea timpului şi valoarea FALSE atunci când acesta nu mai
funcţionează.

Nodul TouchSensor
Sintaxă:
TouchSensor {
enabled TRUE
}
Semantică:
Este un nod care asigură interactivitatea lumii VRML cu utilizatorul. De obicei nodul
este definit în cadrul unui grup de noduri, având efect asupra tuturor nodurilor definite în
cadrul grupului. Acest senzor este activat în momentul în care pointerul mouse-ului este
poziţionat asupra unui obiect din cadrul grupului şi utilizatorul efectuează un click asupra
acelui obiect.
Nodul TouchSensor are un singur câmp, şi anume enabled, care specifică statutul
senzorului.

18
Evenimente generate de TouchSensor:
- isOver – este un eveniment generat cu valoarea TRUE atunci când câmpul
enabled are valoarea TRUE şi cursorul mouse-ului este mutat deasupra unui
obiect din grup. Evenimentul se generează cu valoarea FALSE dacă senzorul e
activ (adică enabled e TRUE) şi cursorul mouse-ului nu se opreşte deasupra
niciunui obiect din grup. Evenimentul isOver se generează numai în cazul
obiectelor vizibile pentru utilizator.
- evenimente care apar la mişcarea cursorului poziţionat pe un obiect din grup:
o hitPoint_changed – returnează poziţia exactă a obiectului în cadrul
grupului de obiecte;
o hitNormal_changed – returnează normala la suprafaţă, folosind
coordonatele 3D stabilite prin evenimentul hitPoint_changed;
o hitTextCoord_changed – returnează valorile textCoord referitoare
la suprafaţă;
- isActive – este un eveniment generat în momentul în care senzorul este activ şi se
realizează un click asupra unui obiect (valoarea alocată evenimentului va fi
TRUE). În momentul în care mouse-ul nu mai este apăsat isActive ia valoarea
FALSE şi se generează un eveniment touchTime care memorează momentul
înregistrării click-ului.

Nodul VisibilitySensor
Sintaxă:
VisibilitySensor {
enabled TRUE
center 0 0 0
size 0 0 0
}
Semantică:
Acest nod poate fi folosit pentru a detecta modificările aduse în vizibilitatea obiectelor
VRML, răspunzând cu anumite evenimente la aceste modificări de vizibilitate. Rolul său însă
nu este acela de a stabili dacă un anumit obiect este sau nu vizibil, senzorul reacţionează doar
la modificările aduse lumii VRML.
VisibilitySensor are următoarele câmpuri:
- center – reprezintă punctul central al unui cub virtual care cuprinde în interiorul
său obiectele urmărite de către senzor;
- size – reprezintă mărimea laturii cubului;
- enabled – specifică statutul senzorului, valorile sale sunt booleene;
Evenimente generate de către VisibilitySensor:
- enterTime – reţine momentul în care obiectele din interiorul cubului devin
vizibile;
- exitTime - reţine momentul în care obiectele din interiorul cubului devin invizibile
utilizatorului;
- isActive – ia valoarea TRUE atunci când obiectele din interiorul cubului devin
vizibile şi FALSE când acestea devin invizibile;

Senzori de mişcare

19
Aceşti senzori detectează mişcarea obiectelor declanşată de către utilizatori, însă pe
lângă această detecţie senzorii au posibilitatea de a schimba poziţia unui obiect definit în
acelaşi grup de noduri ca şi senzorul. În VRML sunt definite 3 tipuri de senzori de mişcare:
 senzor „de plan” (Plane Sensor) – permite deplasarea obiectelor în sistemul de
coordonate XY;
 senzor “cilindric“ (Cylinder Sensor) – permite deplasarea obiectelor pe
suprafaţa unui cilindru virtual;
 senzor “sferic” (Sphere Sensor) - permite deplasarea obiectelor pe suprafaţa
unei sfere virtuale;
Câmpurile partajate de către aceste noduri sunt:
- enabled – specifică statutul senzorului (valoarea TRUE semnifică senzor
activ, iar valoarea FALSE un senzor inactiv);
- offset – memorează poziţia iniţială a obiectelor a căror poziţie va fi
modificată. Câmpul conţine valori întregi, o valoare 0 ar însemna că
obiectele sunt în poziţia lor iniţială, o valoare mai mare decât 0 înseamnă
că deplasarea obiectelor va începe din poziţia offset+valoare. Valoarea
alocată câmpului va fi ignorată dacă în câmpul autoOffset se regăseşte
valoarea TRUE;
- autoOffset – specifică browserului dacă deplasarea obiectelor se va realize
relativ la poziţia lor iniţială (şi atunci autoOffset are valoarea TRUE) sau
relativ la poziţia lor iniţială, specificată în câmpul offset (în cazul în care
autoOffset are valoarea FALSE);
Evenimentele generate de către senzorii de mişcare:
- isActive – indică faptul că o operaţie de deplasare al unui obiect este în
curs (câmpul ia valori booleene);
- trackPoint_changed – returnează coordonatele actuale rezultate în urma
deplasării obiectului;
- rotation_changed – apare în definiţia nodurilor SphereSensor şi
CylinderSensor şi returnează rotaţia realizată în timpul deplasării
obiectului;
- translation_changed – returnează translaţia realizată pentru deplasarea
obiectelor;
Nodul PlaneSensor
Sintaxă:
PlaneSensor {
enabled TRUE
offset 0 0 0
autoOffset TRUE
maxPosition 1 1
minPosition 0 0
}
Semantică:
Permite o deplasare a obiectelor VRML în sistemul de coordinate local în planul XY,
astfel încât mişcarea se poate limita la o suprafaţă dreptunghiulară. Câmpurile specifice
acestui nod sunt:
- maxPosition – reţine valoarea maximă permisă pentru X şi Y;
- minPosition - reţine valorile minime pentru X şi Y;

20
În cazul în care valoarea specificată de maxPosition este mai mică decât cea din
minPosition, nu există limitare în deplasarea obiectului.

Nodul SphereSensor
Sintaxă:
SphereSensor {
enabled TRUE
offset 0 1 0 0
autoOffset TRUE
}
Este folosit pentru a realiza mişcarea obiectelor pe suprafaţa unei sfere imaginare
(deci în jurul centrului sistemului de coordonate local).

Nodul CylinderSensor
Sintaxă:
PlaneSensor {
enabled TRUE
offset 0
autoOffset TRUE
maxAngle -1
minAngle 0
diskAngle 0.262
}
Semantică:
Este folosit pentru a realize mişcarea obiectelor pe suprafaţa unui cilindru imaginar
(adică în jurul axei Y al sistemului de coordinate local, limitând mişcarea la un anumir unghi
dat).
Câmpurile nodului CylinderSensor sunt:
- offset – cu aceeaşi semnificaţie ca şi în cazul celorlalte noduri de mişcare, însă
mişcarea se realizează relativ la valoarea de pe axa X;
- maxAngle – specifică rotaţia maximă ce poate fi realizată;
- minAngle- specifică rotaţia minimă;
Dacă valoarea specificată în maxAngle este mai mică decât cea din minAngle, atunci
rotaţia care se realizează nu este limitată (unghiul poate fi şi de 360 de grade).

ProximitySensor - Senzori de proximitate


Acest tip de senzori sunt reprezentaţi de către nodul ProximitySensor. Acesta asigură
un anumit grad de interactivitate într utilizator şi lumea VRML, generând anumite
evenimente de fiecare dată câbd utilizatorul intră, iese sau se mişcă în interiorul unui spaţiu
de control, delimitat printr-un cub imaginar. Senzorul nu ajută la determinarea poziţiei
relative al obiectelor din lumea VRML.
Sintaxă:
ProximitySensor {
21
enabled TRUE
center 0 0 0
size 0 0 0
}
Semantică:
ProximitySensor are următoarele câmpuri:
- enabled – specifică statutul senzorului (poate fi activ sau inactiv);
- center – conţine coordonatele centrului cubului imaginar;
- size – specifică dimensiunea laturii cubului;
Evenimente generate de către ProximitySensor:
- isActive – este generat cu valoarea TRUE atunci când senzorul este activ (câmpul
enabled are valoarea TRUE) şi pointerul mouse-ului se deplasează dintr-o poziţie
din exteriorul cubului într-o poziţie din interiorul cubului. Câmpul ia valoarea
FALSE atunci când mişcarea se realizează în sens invers;
- enterTime – este generat atunci când utlizatorul (prin intermediul mouse-ului)
accesează interiorul cubului. În momentul în care utilizatorul părăseşte interiorul
cubului se generează un eveniment exitTime. La orice mişcare a mouse-ului
(accesarea interiorului cubului, schimbarea poziţiei în interiorul cubului sau
ieşirea din cub) se generează următoarele evenimente:
o position_changed – returnează coordonatele 3D ale poziţiei
utilizatorului;
o orientation_changed – returnează orientarea utilizatorului în
sistemul de coordinate;

22
3.8.Definirea şi instanţierea de noduri. Noduri speciale.

3.8.1. DEF – denumirea unui nod în VRML


În VRML se permite denumirea de grupuri de noduri sau redefinirea unor noduri deja
existente prin adăugarea unor câmpuri noi la cele deja existente. Procesul de definire este cu
adevărat folositor atunci când este nevoie de aducerea unor modificări în interiorul definiţiei
nodului, deoarece acestea se vor îmregistra o singură dată (în cadrul definiţiei) şi nu în fiecare
instanţă al nodului definit.
Sintaxă:
{
DEF name node
}
Nodul astfel creat poate fi apelat folosind sintaxa:
{
USE name
}
3.8.2. Nodul Inline
Sintaxă:
Inline {
url []
bboxCenter 0 0 0
bboxSize -1 -1 -1
}

Semantică:
VRML permite ca lumea virtuală să fie “împrăştiată” în mai multe fişiere .wrl, astfel
încât codul să fie mai lizibil şi gradul său de reutilizabilitate să fie crescut. Nodul Inline
permite definirea unui URL de unde browserul poate extrage datele necesare construcţiei
lumii 3D (URL-ul trebuie să conţină calea absolută către un fişier VRML complet şi corect).
Inline conţine următoarele câmpuri:
- url – specifică locaţia fişierului care va fi folosit pentru construcţia lumii VRML,
se permite specificarea listelor de locaţii, unde browserul poate căuta un anumit
fişier .wrl;
- bboxCenter – are aceeaşi semnificaţie ca şi în cazul nodului Anchor;
- bboxSize - are aceeaşi semnificaţie ca şi în cazul nodului Anchor;
Nodurile definite în cadrul unui fişier VRML folosit în construcţia unei lumi 3D
complexe, formate din fişiere multiple, nu sunt recunoscute şi în exteriorul acelui fişier.

3.8.3. LOD (Level Of Detail )Node


Sintaxă:
LOD {
level []
center 0 0 0
range []
}
23
Semantică:
Nodul LOD permite ca un obiect VRML să fie reprezentat în mai multe versiuni la
care diferă doar gradul de reprezentare ale detaliilor acelui obiect, în funcţie de distanţa la
care acesta se află de utilizator.
Nodul LOD are următoarele câmpuri:
- level – reprezintă multţimea de reprezentări posibile ale obiectului VRML;
- center – conţine coordonatele unui punct 3D în funcţie de care se va calcula
distanţa faţă de obiectul reprezentat;
- range – cuprinde o mulţime de valori reale ce reprezintă distanţele faţp de obiect,
în ordine crescătoare; valorile trebuie să fie mai mari sau egale decât 0.

3.9. Interpolare în VRML

Operaţia de interpolare se referă la definirea unei legături directe dintre o cheie (key)
şi o valoare a cheii (keyValue). Cheia poate avea valori cuprinse între 0.0 şi 1.0, iar keyValue
poate fi reprezentată de orice tip de dată în funcţie de tipul interpolării. VRML permite
următoarele tipuri de interpolări:
- ColorInterpolator
- CoordinateInterpolator
- NormalInterpolator
- OrientationInterpolator
- PositionInterpolator
- ScalarInterpolator
Fiecare din aceste noduri are un eveniment eventIn de tip set_fraction (este acel
eveniment ce produce modificările la nivelul nodului vizat) şi un eventOut value_changed
(care reflectă modificările realizate). Legătura între cele două evenimente este realizată de
către cheie: set_fraction stabileşte valoarea ei, iar value_changed reacţionează verificând
valoarea lui keyValue, direct asociată cheii.
Operaţiile de interpolare combinate cu efectele senzorului TimeSensor rezultă în
apariţia de lumi virtuale animate (lumi care conţin variaţii de culori, obiecte ce se
metamorfozează etc.). Modul de funcţionare al acestor două noduri este următorul:
TimeSensor are un eveniment fraction_changed care poate fi legat de evenimentul
set_fraction, folosind operaţia de rutare a evenimentelor (ROUTE). Interpolatorul va genera
un eveniment value_changed care poate fi legat prin rutare de una din câmpurile expuse ale
unui nod obişnuit. Rezultatul final constă în modificarea unei anumite proprietăţi al
obiectului VRML (culoare, mărime, poziţie etc.), odată cu trecerea timpului.
Câmpurile nodurilor de interpolare sunt key[] şi value[], valorile alocate acestor
câmpuri având următoarea semnificaţie: set_fraction primeşte ca parametru valorile din
key[], atunci valoarile returnate prin eveneimentul value_changed este keyValue.

Nodul ColorInterpolator
Este un nod de interpolare care în câmpul keyValue conţine o listă de valori RGB şi
care are ca efect modificarea culorii obiectului VRML asupra căruia se aplică.

24
Sintaxă:
ColorInterpolator {
key [ ]
keyValue[ ]
}
Nodul CoordinateInterpolator
Este un nod de interpolare care în câmpul keyValue conţine o listă de coordonate 3D
şi care are ca efect un control deplin asupra punctelor ce definesc orice obiect VRML, creând
senzaţia de metamorfoză al acelui obiect.
Sintaxă:
CoordinateInterpolator {
key [ ]
keyValue[ ]
}
Nodul NormalInterpolator
Este un nod de interpolare care în câmpul keyValue conţine o listă de vectori 3D şi
permite utilizatorului să modifice normalele definite în cadrul unui nod Normal.
Sintaxă:
NormalInterpolator {
key [ ]
keyValue [ ]
}
Nodul OrientationInterpolator
Este un nod de interpolare care în câmpul keyValue conţine o listă de parametri de
rotaţie 3D (un set de coordonate 3D şi un unghi de rotaţie). Este folosit pentru crearea de
animaţii prin rotaţia obiectelor VRML asupra cărora se aplică.
Sintaxă:
OrientationInterpolator {
key [ ]
keyValue[ ]
}
Nodul PositionInterpolator
Este un nod de interpolare care în câmpul keyValue conţine o listă de coordonate 3D
şi care are ca efect animaţia obiectelor VRML asupra cărora se aplică prin deplasarea lor pe
ruta definită în keyValue.
Sintaxă:
PositionInterpolator {
key [ ]
keyValue[ ]
}
Nodul ScalarInterpolator

25
Este un nod de interpolare care în câmpul keyValue conţine o listă de valori reale
folosite pentru modificarea oricărui câmp expus cu valori reale (de exemplu: viteza cu care se
redă un film sau sunet – dacă se modifică valoarea câmpului speed).
Sintaxă:
ScalarInterpolator {
key [ ]
keyValue[ ]
}

VRML şi JavaScript. Nodul Script


Folosind doar posibilităţile oferite de către limbajul în sine, VRML s-a dovedit a fi
suficient de flexibil pentru a asigura interactivitatea lumii virtuale cu utilizatorul. Principalele
instrumente pe care VRML le asigură în acest scop sunt reprezentate de către gestionarea şi
rutarea evenimentelor (events şi routes), respectiv de către multitudinea de senzori VRML
(de mişcare, de coliziune, etc.). Totuşi, acestea oferă doar o interacţiune limitată a lumii
virtuale cu utilizatorul ei.
Nodul Script vine în corectarea acestor neajunsuri, adăugând flexibilitate lumii
virtuale prin implementarea posibilităţii de a adăuga elemente comportamentale lumii 3D cu
ajutorul unor limbaje de programare, cum ar fi Java, JavaScript sau VRMLScript. Prin
intermediul nodului Script se pot genera evenimente multiple, se poate specifica un
comportament specific la apelarea fiecărui eveniment în parte şi de asemenea se pot specifica
proceduri de iniţializare, respectiv de distrugere a lumii VRML. Nodul Script este unul
special, deoarece permite definirea evenimentelor recepţionate (ale căror valori se salvează în
variabilele eventIn) şi a evenimentelor proprii generate. La fel ca şi orice alt nod şi nodul
Script este format din câmpuri care funcţionează ca nişte variabile locale, numite persistente.
Nu există câmpuri expuse în nodul Script, el ear putea fi create numai dacă pe lângă definirea
câmpului se vor defini şi evenimentele eventIn, respectiv eventOut corespunzătoare. Se
permite însă definirea unui număr nelimitat de câmpuri.
Exemplu de definiţie de câmp expus:
field myField
eventIn set_myField
eventOut myField_changed

Nodul Script are următoarele câmpuri:


- url – specifică locaţia scriptului care va fi executat (acesta poate fi scris în
limbaj Java, JavaScript sau VRMLScript);
- directOutput – este un câmp Boolean care specifică modul în care scriptul
va modifica lumea virtuală: cu ajutorul unui eventOut, rutând evenimentul
la un alt nod (ceea ce înseamnă că evenimentul creat de către script va fi
folosit în acea rutare, situaţie în care directOutput este FALSE) sau prin
accesarea directă a câmpurilor unui anumit nod (printr-o simplă atribuire,
situaţie în care directOutput este TRUE);
- mustEvaluate – este un câmp Boolean cu ajutorul căruia se va specifica
modul în care browserul va gestiona evenimentele astfel încât ele să nu
influenţeze negative procesul de desenare a graficii pe ecran (în cazul
acesta având valoarea FALSE). Dacă acest câmp are valoarea TRUE,
browserul va procesa evenimentele în momentul în care ele se creează,
scăzând astfel calitatea graficii afişate.

26

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