Mihai Sprinceana
Un forum de programare cu de toate. Va astept sa va inscrieti si sa deveniti moderatori. Oricine este binevenit aici sa se inscrie si sa aiba acces la informatie free! Fiecare este liber sa adauge proiecte programe free etc. Ajutati acest forum sa devina o comunitate puternica unde fiecare invata de la fiecare! Tot ce trebuie sa faceti este sa va inregistrati si fiecare contributie se poate dovedi utila in timp! Forumul este free informatia free dk aveti timp liber ajutati si pe ceilalti si invatati si voi in acelasi timp! Haideti sa facem ceva pt.a ne ajuta intre noi! Cititi regulament postare forum inainte de a posta!
Lista Forumurilor Pe Tematici
Mihai Sprinceana | Inregistrare | Login

POZE MIHAI SPRINCEANA

Nu sunteti logat.
Nou pe simpatie:
andreea_bianca24
Femeie
24 ani
Mures
cauta Barbat
24 - 58 ani
Mihai Sprinceana / Vrml / Documentatie VRML limba romana Moderat de BlaxxunRomania, Marius Romeo, fireratbat, profu.info, sade5000
Autor
Mesaj Pagini: 1
mihaispr
Administrator

Inregistrat: acum 18 ani
Postari: 2142
VRML
Virtual Reality Modeling Language




4.1    Generalităţi ………………………………………………………
4.2    Noţiuni de bază ale limbajului VRML  ……….…………………
3.2.1    Noduri ………………………….……………………………
3.2.2    Grupara nodurilor ……………...……………………………
3.2.3    PROTOtipuri ………………………..………………………
4.3    Animaţie în VRML ………………………………………………
3.3.1    Rute ………………………….………………………………
3.3.2    Etapele unei animaţii …….….………………………………
3.3.3    Noduri de tip Engine …………………………………………
4.4    Noţiuni avansate ……………………….…………………………
3.4.1    Forme complexe …………………..…………………………
3.4.2    Culori. Surse de lumină. ………..……………………………
3.4.3    Normale …………………………..…………………………


Obiective

•    Însuşirea noţiunilor de bază a limbajului VRML
•    Ce sunt şi cum se folosesc nodurile
•    Definirea nodurilor utilizator
•    Realizarea unor animaţii simple
•    Introducerea tehnicilor avansate pentru crearea de scene 3D







Acest capitoul este dedicat prezentării limbajului de modelare 3D VRML 2.0 (Virtual Reality Modeling Language) utilizat în crearea de pagini WEB interactive. În primele două secţiuni vor fi prezente noţiunile şi conceptele de bază ale limbajului. Secţiunea a treia prezintă atât modul de realizare al animaţiilor 3D simple cât şi tehnicile utilizate în realizarea unor animaţii complexe. Ultima secţiune expune succint anumite tehnici avansate în modelarea 3D, cum ar: descrierea unor suprafeţe complexe, specificarea surselor de lumină sau simularea umbrelor în VRML 2.0.


4.1.     Generalităţi

Denumirea inţială a limbajului a fost Virtual Reality Markup Language. Specificaţiile VRML au fost dezvoltate iniţial de către firma Silicon Graphics Inc. (SGI), pornindu-se de la un set de clase care încapsulau biblioteca de funcţii grafice OpenGL (Open Inventory). Treptat s-a ajuns la dezvoltarea unei noi tehnologii, numită Virtual Reality Modeling Language. Prima versiune a limbajului a fost standardizată în anul 1995, şi anume VRML 1.0. În momentul de faţă standardul este VRML 2.0 (cunoscut şi sub denumirea de VRML97), cea mai importantă diferenţă faţa de versiunea anterioară este că lumile VRML 1.0 sunt statice, pe când cele create cu VRML 2.0 pot interacţiona cu vizitatorul acestora. Tehnic vorbind, pentru a oferi posibilitatea realizarării lumilor 3D dinamice, standardul 2.0 a fost îmbogăţit cu noi tipuri de noduri şi noi concepte, cum ar fi: PROTOtipuri, switchuri, senzori, scripturi, interpolatori, rute, elemente multimedia (sunete, texturi animate).
Conform definiţiei date de WEB Consortium (organismul internaţional pentru standardizarea acestei tehnologii),

VRML este un standard deschis pentru 3D multimedia şi lumi virtuale partajate în Internet.

VRML este inclus sau citat în standardul MPEG-4, precum şi în Java3D sau alte standarde de dezvoltare. Lumile VRML sunt partajate prin intermediul Internet-ului. Limbajul VRML este în continuă modificare şi extindere, existând câteva direcţii noi promovate de diferite firme sau organizaţii, cum ar fi: Moving Worlds susţinută de către SGI sau Living Worlds promovată de către WEB Consortium. Preocupări recente includ dezvoltarea API-ului VRMLScript şi pentru suportul multi-user.

VRML este utilizat în modelarea aplicaţiilor medicale, modelarea structurilor complexe în chimie (a moleculelor de exemplu), în design, arhitectură, jocuri sau publicitate. În secţiunea cu referinţe bibliografice pot fi găsite legături către site-uri WEB bazate pe VRML.

VRML permite descrierea de obiecete 3D şi combinarea lor în scene şi lumi virtuale. El poate fi folosit la crearea de lumi interactive, care să conţină: imagini, animaţii, clipuri audio şi/sau video. Într-o lume VRML utilizatorul şi nu computerul are controlul. Obiectele dintr-o scenă pot interacţiona unele cu altele prin evenimente sau pot interacţiona cu evenimente utilizator. Lumile pot fi legate între ele sau cu alte documente HTML. O lume creată poate fi distribuită pe Internet, văzută şi explorată interactiv de mai mulţi utilizatori în acelaşi timp.
Pentru a putea vizualiza o lume VRML, Internet browserul (Internet Explorer, Netscape Navigator, HotJava, Opera etc.) are nevoie de un VRML plug-in, ce permite “vizitatorului” să navigheze în lumea virtuală, să obţină diferite vederi ale scenei în funcţie de punctul de vedere ales, să interacţioneze cu diferite elemente din scenă, ş.a.m.d. Facilitătile oferite depind de la un plug-in la altul. Unele plug-in -uri sunt distribuite şi ca aplicaţii standalone, situaţie în care sunt numite VRML Browsers. În continuare, vom folosi această denumire pentru a desemna browser-ul de VRML, fie că e vorba de versiunea standalone sau plug-in. La ora actuală există VRML browsere disponibile pentru cele mai cunoscute şi răspândite sistemele de operare. O listă cu cele mai cunoscute browsere VRML pentru sistemul de operare Windows se găseşte la adresa:



4.2.     Noţiuni de bază ale limbajului VRML

Limbajul de modelare VRML este un limbaj case-sensitive. Un document VRML este un fişier text cu extensia .wrl care trebuie să înceapă cu linia
#VRML V2.0 utf8
care indică un document VRML în versiunea 2.0, iar setul de carctere utilizat este UTF-8 (posibil şi ASCII). Un fişier VRML poate fi compresat utilizând gzip pentru a mări viteza de acces în cazul unor fişiere mari. Documentele VRML sunt colecţii de obiecte (instanţe ale nodurilor standard sau noduri utilizator), definiţii de noduri utilizator (PROTOtipuri) sau rute.

Nodul este blocul de construcţie fundamental în VRML. Nodurile sunt abstractizări ale conceptelor şi obiectelor din lumea reală. Nodurile conţin câmpuri şi evenimente.

Câmpul reprezintă o proprietate sau un atribut a unui nod. Fiecare tip de nod are un număr fix de câmpuri.

Evenimentele semnalizează stimulii externi, modificările în valorile unui câmp şi interacţiunile dintre noduri. Un eveniment e compus dintr-un timestamp şi o valoare pentru un câmp.

Denumirea tuturor nodurilor începe cu majusculă, iar numele câmpurilor cu literă mică, câmpurile unui nod fiind închise între acolade. Clasificarea nodurilor VRML :
•    Shapes (ex: Box, Cone, Sphere, Text, IndexedFaceSet, Extrude)
•    Grouping (ex: Transform, Anchor, Inline, LOD, Switch)
•    Lighting (ex: DirectionalLight, PointLight, SpotLight)
•    Sensors (ex: TouchSensor, TimeSensor, PlaneSensor)
•    Animation (ex: CoordinateInterpolator, ColorInterpolator)
•    Multimedia (ex: AudioClip, PixelTexture, ImageTexture, Sound)

Modelul de culoare utiliazat în VRML este RGB, cu valori pentru cele trei componente cuprinse în intervalul [0, 1] ((0, 0, 0) pentru negru, (1, 1, 1) pentru alb). Unităţile de măsură VRML sunt considerate în mod implicit a fi exprimate în metri. Unghiurile sunt măsurate în radiani, nu în grade. Comentariile încep cu simbolul ‘#’ şi se extind până la sfârşitul linei. Sistemul de coordonate este cartezian, cu valorile pozitive ale axei Oz “înspre” privitor.


4.2.1.    Noduri VRML

În această secţiune vor fi prezentate cele mai utilizate noduri în construcţia lumilor virtuale. Descrierea completă a tuturor nodurilor VRML, precum şi alte elemente ale limbajului, pot fi găsite în manualul de referinţă pentru VRML.
Unul dintre cele mai folosite noduri este nodul Shape. Deoarece valorile câmpurilor sale pot fi alte noduri, se spune că este un nod container. Nodul Shape are două câmpuri:
•    appearance ce precizează proprietăţile obiectului (culoare, textură etc.)
•    geometry ce defineşte forma geometrică a obiectului (sferă, cilindru, cub etc.)

Exemplu: Crearea unei scene compusă dintr-o sferă roşie de rază 2.5 centrată în orgine

Shape {
appearance Appearance {
material Material {
diffuseColor 1.0 0.0 0.0
}
}
    geometry Sphere {
radius 2.5
}
}

Definirea propreităţilor legate de culoarea obiectelor se face folosind nodul Appearance prin intermediul câmpului material ce poate fi instanţiat cu un obiect de tipul Material. Cele mai utilizate câmpuri ale nodului Material sunt:
•    diffuseColor, defineşte culoarea obiectului
•    ambientIntensity, precizează cantitatea de lumină reflectată de suprafaţa obiectului
•    shininess, controlează intensitatea strălucirii pentru zonele strălucitoare

Pentru specificarea unei texturi asociate unui obiect, nodul Appearance expune câmpul texture care poate fi instanţiat cu unul din tipurile de texturi suportate de VRML şi anume: ImageTexture, MovieTexture sau PixelTexture.

În legătură cu specificarea formei obiectului, nodul Shape conţine câmpul geometry care poate fi creat folosind un nod de tip geometrie. Acestea pot fi clasificate în două categorii:
•    primitive: Box, Cone, Cylinder, Sphere, Text, FontStyle
•    complexe: IndexedFaceSet, IndexedLineSet, PointSet, Extrude, ElevationGrid

Exemplu: Afişarea unui text

Viewpoint {
    position    55 0 65
    description "Primul Viewpoint"
    jump        FALSE
}

Shape {
geometry Text {
        string    "Hello, VRML World!"
    fontStyle FontStyle {
            size   14
            family "SERIF"
        style  "ITALIC"
        }
    }
}

Nodul Viewpoint indică poziţia şi unghiul de vedere. Într-o scenă VRML pot exista mai multe Viewpoint-uri. Browser-ul VRML crează o listă cu toate viewpoint-urile unei scene folosind textul din câmpul description al nodului, utilizatorul putând alege viewpoint-ul dorit. Un exemplu în care se folosesc două viewpoint-uri este fişierul Planets2.wrl.
Nodul IndexedFaceSet defineşte o mulţime de feţe plane în sistemul de coordonate local. Câmpul coord specifică punctele formei, iar câmpul coordIndex defineşte feţele formei prin precizarea vârfurilor fiecărei feţe ca indecşi în lista de puncte conţinută în câmpul coord. Exemple de folosire a acestui tip de nod se pot găsi în fişierele Colors.wrl sau Normals.wrl.


4.2.2.    Gruparea nodurilor în VRML

În vederea unei mai bune organizări a scenelor şi lumilor VRML au fost introduse nodurile de grupare. Astfel, nodurile VRML se pot organiza în grupuri, care la rândul lor pot alcătui scene, şi mai departe lumi virtuale.

Nodurile de grupare sunt folosite pentru a defini o mulţime de noduri ca un singur obiect.

Câmpul children al nodurilor de grupare care conţine o listă de noduri copii. Fiecare nod de grupare defineşte un spaţiu de coordoate pentru copiii săi. Acest spaţiu de coordonate este relativ la spaţiul de coordonate al nodului părinte pentru nodul de grupare. Nodurile de grupare în VRML sunt: Anchor, Billboard, Collision, Group, Inline, LOD, Transform şi Switch. Noduri precum Appearance, Material, IndexedFaceSet sau Cylinder nu pot fi folosite în câmpul children al unui nod de grupare. În continuare vor fi descrise câteva dintre cele mai folosite noduri de grupare.


Nodul Transform

Acest tip de nod este utilizat pentru gruparea mai multor noduri împreună. De obicei acestei grupări i se aplică şi o transformare geometrică, însă lucrul acesta nu este obligatoriu. Transformările care pot fi specificate într-un nod Transform sunt: translaţia, rotaţia, scalarea sau combinări ale acestora. Ordinea în care sunt aplicate transformările unui obiect este foarte importantă deoarece compunerea tranaformărilor nu este asociativă. De exemplu, aplicarea unei translaţii urmată de o rotaţie asupra unui obiect nu are acelaşi efect total ca în cazul aplicării rotaţiei prima oară şi apoi a translaţiei. Ordinea aplicării transformărilor este următoarea: scalarea, rotaţia şi în cele din urmă translaţia (în cazul în care apar toate cele trei transformări într-un acelaşi nod Transform, indiferent de ordinea în care sunt specificate).

Exemplu: Crearea unui elipsoid cu axele (3, 1, 2) rotit cu 45 în jurul axei Oy şi cu centrul în punctul (2, 2.5, 0)

Transform {
translation 2 2.5 0
rotation    0 1 0 0.785  # PI/4
scale       3 1 2
children [ Shape { geometry Sphere { radius 1 } } ]
}

Prima transformare ce se va aplica va fi scalarea sferei după celei trei axe cu coeficienţii specificaţi, apoi obiectul va fi rotit cu 45 de grade în jurul axei Oy, iar în cele din urmă este translatat în punctul (2 2.5 0).


Nodul Inline

La crearea lumilor virtuale complexe se utilizează dezvoltarea modulară, fiecare scenă a lumii virtuale fiind descrisă într-un fişier separat. Pentru a include un document VRML într-altul se folosesc nodurile Inline, şi anume:

Exemplu: Includerea unei scene deja creată într-o scenă nouă.

Inline {
url “scene1.wrl” # un URL valid de forma
  # http://… sau \\server\…\file1
}


Nodul Anchor

Definiţia standardului VRML spune că: “VRML este un standard deschis pentru 3D multimedia…”. Sub denumirea de multimedia sunt cuprinse: fişiere grafice, fişiere de sunet sau video, pagini HTML. Pentru a permite hyperlink-uri la alte pagini se foloseşte nodul Anchor.




4.2.3.    PROTOtipuri

VRML oferă posibilitatea de a asocina un nume unui nod sau grup de noduri folosind comanda DEF. Pentru a duplica nodurile cu numele respectiv trebuie doar folosită comanda USE cu numele definit anterior.

Exemplu: Definirea unui puc de hochei şi apoi utilizarea lui în alte noduri ale scenei

#definirea nodului
DEF puck Shape { … }

#utilizarea nodului
Transform {
translation 0 0 3
rotation    0 0 1 1.57
children [USE puck]
}

Observaţie: Comanda DEF se utilizează la prima definire a nodului, apoi nodul este referenţiat folosind USE.

Definirea / referirea obiectelor folosind DEF / USE ne oferă posibilitatea creării rapide de scene complexe. Dezavantajul este că proprietătile obiectului  se specifică la definire şi nu pot fi schimbate în construcţiile USE. Pentru a înlătura acest incovenient au fost introduse PROTOtipurile.

PROTOtipurile sunt tipuri de noduri definite de utilizator. Noul tip de nod poate fi folosit la fel ca nodurile standard.

La crearea unui prototip, definim un tip de noduri, nu şi o instanţă a lui. Prototipul va avea câte un câmp public pentru fiecare intrare specificată prin câmpul field. În field se specifică numele, tipul şi valoarea implicită a proprietăţii respective.

Exemplu: Crearea coloanelor cilindrice de diferite culori

#definire tipului Column
PROTO Column
[ field SFColor columnColor .5 .5 .5 ]
{
Shape {
appearance Appearance {
material Material {
diffuseColor IS columnColor
} }

geometry Cylinder {
radius 4
}
}
}

#utilizare noului tip utilizator (Column)
Column { columnColor 1 0 0 }

Un exemplu complet poate fi documentul VRML de la adresa:

Observaţii:

1.    În PROTOtipuri pot exista oricâte intrări field cu tip, nume, valoare implicită atât timp cât au un nume unic.
2.    Valoarea implictă stabilită la definirea PROTOtipului nu mai poate fi schimbată.
3.    Interfaţa publică este singurul contact dintre interiorul şi exteriorul prototipului.
4.    PROTOtipurile pot fi utilizate în construcţii DEF – USE la fel ca orice nod standard.
5.    Pe lângă câmpuri se pot declara şi evenimentele pe care PROTOtipul le poate trimite/recepţiona, folosind declaraţiile eventIn şi eventOut. Acestea sunt utlizate de cele mai multe ori pentru a schimba valorile diferitelor câmpuri ale obiectului în mod dinamic.


4.3.    Animaţie în VRML

4.3.1.    Evenimente. Rute

Evenimentul reprezintă un mesaj trimis de la un nod la altul prin intermediul unei rute.

Ruta reprezintă conexiunea dintre un nod care generează un eveniment şi un nod care primeşte evenimentul.
Evenimentele semnalizează stimuli externi, modificări în valorile câmpurilor unui nod sau interacţiuni între noduri. Un eveniment este alcătuit dintr-un timestamp şi o valoare pentru un câmp. Fiecare nod poate trimite sau recepţiona evenimente. Evenimentele care vin înspre nod sunt etichetate cu eventIn, iar cele care sunt generate de un nod cu eventOut. Nodurile pot include evenimente set_ (eventIn) cu care se modifică un câmp şi _changed (eventOut) cu care se transmite noua valoare a câmpului unui alt nod. Unele noduri conţin ambele tipuri de evenimente (eventIn şi eventOut): când un câmp primeşte  un eveniment, valoarea câmpului ia valoarea evenimentului, iar când transmite un eveniment valoarea evenimentului ia valoarea câmpului.
Există noduri senzori ce reacţionează la un anumit eveniment într-un anumit mod. Adesea senzorii sunt legaţi de noduri de Script ce rulează un program când senzorul îi transmite un mesaj.
Fiind conexiunea dintre două noduri, câmpurile unei rute trebuie să fie de acelaşi tip. Pentru câmpuri de tip exposed fields există aceste două evenimente implicite. De exemplu: câmpul translation al nodului Transform este un câmp exposed. Pentru aceste câmpuri, browser-ul decide dacă e vorba de evenimente set_  sau  _changed, numele lor ne mai trebuind explicitat.

Exemplu: Fie Nod1, Nod2 două noduri de tip Transform. Pentru a seta câmpul translation a nodului Nod2 cu valoarea câmpului translation a nodului Nod1, putem proceda în următoarele moduri:

ROUTE Nod1.translation_changed TO Nod2.set_translation
ROUTE Nod1.translation TO Nod2. set_translation
ROUTE Nod1.translation_changed TO Nod2. translation
ROUTE Nod1.translation TO Nod2. Translation

Observaţie: Toate cele patru construcţii de mai sus sunt echivalente.

Pentru a şti spre ce nod va fi rutat un eveniment, nodul trebuie definit cu DEF. Ca urmare, evenimentul va fi trimis în toate locurile unde apare nodul respectiv referit prin USE (sau locului în care a fost definit cu DEF). Dacă dorim să transmitem un eveniment într-un singur loc, se pot folosi PROTOtipurile.


4.3.2.    Etapele unei animaţii

Animaţia în VRML constă în modificarea valorilor unor câmpuri prin transmiterea de evenimente în mai multe etape.

Aceste etape sunt următoarele:





•    Trigger –ul (decalanşatorul) generază evenimentele. De obicei este un nod senzor ce generează un eveniment când utilizatorul intreacţionează cu el;
•    Logic realizează prelucrarea evenimentelor de la Trigger, după care este pornit Timer-ul. În această etapă, browserul pasează evenimentele primite de la Trigger unui nod de tip Script, care îl procesează, după care îl trimite mai departe timer-ului. În cazul animaţiilor simple acest pas nu este necesar;
•    Timer –ul generează evenimente de timp pe o anumită durată de timp sau continuu, până la oprirea lui explicită;
•    Engine –ul este constituit dintr-un singur nod (interpolator sau script) sau dintr-o mulţime de noduri şi va determina parametrii animaţiei la un moment dat;
•    Target –ul este nodul din scenă a cărui valori se vor schimba; în cea mai simplă formă, schimbarea poate afecta translaţia, rotaţia sau scalarea unui nod de tip Transform.

Unele etape din şirul de mai sus pot fi exceptate, de exemplu Logic, în cazul unor animaţii simple. Ciclul Timer  Engine  Target se repetă atât timp cât animaţia este în desfăşurare.

Un exemplu de Timer este nodul TimeSensor. Acesta este un “ceas” care generează evenimente time în funcţie de viteza computerului pe care este vizualizat documentul VRML (ca urmare nu este un dispozitiv foarte precis). Aceste evenimente se comportă ca o pompă internă care dirijează activitatea altor obiecte din scenă. Alte evenimente generate de acest nod sunt: fraction_changed, isActive, cycleTime. Câmpurile nodului TimeSensor cele mai folosite sunt:
•    startTime – precizează momentul în care TimeSensor-ul începe generarea evenimentelor şi are valoarea implicită 0
•    stopTime – precizează momentul în care TimeSensor-ul nu mai generează evenimente
•    cycleInterval   –   numărul de secunde ale ciclului
•    loop – implicit FALSE, ceea ce înseamnă că senzorul de timp se opreşte la sfârşitul ciclului; poate lua şi valoarea TRUE iar senzorul rulează până la atingerea timpului specificat  în câmpul stopTime sau rulează la nesfârşit dacă stopTime < startTime.

Exemplu: Mărirea intensităţii luminii la fiecare intrare într-un cub

Viewpoint {
position 0  0  15
}
DEF Detector ProximitySensor {
size 25  25  25
}
DEF Timer TimeSensor {
cycleInterval 2
}
DEF Light PointLight {
intensity 0
      location  3  3  3
}
Inline {
url [ “.wrl”] # obiectul iluminat
}

ROUTE Detector.enterTime TO Timer.startTime
ROUTE Timer.fraction _changed TO Light.intensity

    Am utilizat un nod ProximitySensor pe post de Trigger şi un nod TimeSensor pe post de Timer. În figura de mai jos este ilustrat modul în care sunt rutate evenimentele de la un obiect la altul al scenei.

4.3.3.    Noduri de tip Engine

Animaţia poate fi realizată utilizând două tipuri de noduri pentru Engine-uri: fie noduri de interpolare, fie noduri script.
•    Nod de interpolare: animaţia e bazată pe frame-uri cheie date de utilizator, browser-ul generând frame-urile de trecere de la un frame cheie la altul. Avantajul este simplitatea în programare şi eficienţa. Nu sunt potrivite astfel de noduri când dorim să controlăm mai precis frame-urile intermediare generate.
•    Nod Script: primeşte şi trimite evenimente şi conţine o parte de program (script) (în orice limbaj de programare suportat de browser). Acest tip de nod oferă utilizatorul controlul – prin intermediul scriptului – asupra frame-urilor generate într-o animaţie. Cel mai folosit câmp pentru acest nod este url care conţine scriptul sau un URL către scriptul de executat. Câmpurilor standard ale nodului Script li se pot adaugă şi câmpuri  sau evenimente definite de utilizator ca şi în cazul PROTOtipurilor (mai puţin câmpul  exposed).


În acest exemplu am folosit ambele tipuri de noduri prezentate mai sus. Astfel, planeta verde se va deplasa pe o traiectorie sinusoidală folsind un nod de tip Script, în timp ce planeta roşie va urma o traiectorie rectilinie controlată fiind de un nod interpolator de poziţie (PositionInterpolator). Folosind rutele se leagă evenimentul de schimbare a zecimalei (fraction_changed) a obiectului timer de cantitate set_fraction a obiectului interpolator. Pe baza acestei valori (situată în intervalul [0, 1]) interpolatorul va determina automat poziţia viitoare în intervalul [startPoint, endPoint] precizat la construirea obiectului interpolator. În cazul utilizării unui nod Script mecanismul este acelaşi, cu deosebirea că acum poziţia viitoare se determină prin codul VRMLscript.



4.4.    Noţiuni avansate

În acest paragraf vor fi prezente câteva noţiuni necesare realizării scenelor mai compleze folosind limbajul VRML, cum ar fi: realizarea formelor complexe, iluminarea scenei sau specificarea normalei pentru o suprafaţă. Toate acestea contribuie la realizarea de lumi şi scene cât mai realiste.


4.4.1.    Forme complexe

Pentru modelarea formelor compleze se pot utiliza nodurile ElevationGrid sau Extrusion.

Nodul ElevationGrid este utilizat la modelarea “terenurilor”. Cu ajutorul acestui tip de nod se specifică un grid dreptunghiular uniform de înalţimi diferite în planul Oxz (adică Y=0), referitor la sistemul de coordonate local. Cele mai utilizate câmpuri ale sale sunt:
•    xDimension, zDimension – definesc dimensiunea gridul în planul Oxz
•    height – listă de înălţimi (se precizează pe rânduri)
•    xSpacing, zSpacing – distanţa între două puncte alăturate pe Ox, respectiv Oz

Nodul Extrusion defineşte forme geometrice 3D pe baza unei secţiuni 2D “împinse” de-a lungul unei curbe liniare în 3D (numită spine) în sistemul de coordonate local. Secţiunea 2D poate fi scalată şi rotită în fiecare punct al spine-ului pentru a produce forme cât mai complexe. Cele mai importante câmpuri ale nodului Extrusion sunt:
•    crossSection reprezintă secţiunea, definită printr-o linie poligonală în planul Oxz
•    spine este o serie de puncte 3D folosite pentru a desena o linie; în loc să folosească o linie obişnuită pentru desenare, browserul va folosi o linie cu secţiunea specificată în câmpul crossSection
•    scale specfică factorul de scalare; acesta poate fi unul pentru întreaga formă, sau o listă de factori de scalare corespunzători punctelor spine-ului

4.4.2.    Culori. Surse de lumină

În exemplele de până acum culoarea a fost specificată la nivel de obiect, adică întreg obiectul avea aceeaşi culoare. Există în limbajul VRML noduri ce permit specificarea culorii la nivel de nod. Acestea sunt: PointSet, ElevationGrid, IndexedFaceSet şi IndexedLineSet. Astfel, diferite feţe ale aceluiaşi obiect pot avea culori diferite. Câmpurile utilizate la specificarea culorii sunt:
•    color precizează culoarea la nivel de vertex (sau muchie)
•    colorPerVertex este de tip boolean şi aparţine nodurilor ElevationGrid, IndexedFaceSet sau IndexedLineSet; dacă ia valoarea TRUE, culoarea se aplică unui vertex, pe când pentru o valoare FALSE culoarea se va aplica întregii muchii.

Luminile din VRML sunt diferite de luminile din lumea reală. Astfel:
•    nu există sursele de lumină, ci doar efectul lor asupra obiectului prin combinarea culorii obiectului cu culoarea luminii; avantajul este că sursele de lumină “nu stau în calea obiectelor”
•    în VRML nu există umbre; ele pot fi create manual, prin determinarea formei umbrei şi simularea printr-un poligon întunecat semitransparent, dar se poate folosi numai dacă nu se deplasează sursa sau obiectele luminate.

Limbajul VRML oferă posibilitatea utilizării a trei tipuri de surse de lumină, identificate prin trei tipuri de noduri diferite: DirectionalLight, PointLight şi SpotLight. Câmpurile comune nodurilor de lumină sunt:
•    on este de tip boolean şi indică dacă lumina e / nu e aprinsă; poate fi modificat folosind evenimente
•    color defineşte culoarea luminii printr-un triplet R  G  B; această culoare este combinată cu culoarea specificată cu nodurile Material rezultând culoarea finală a obiectului
•    intensity indică intensitatea luminii printr-o valoare reală situată în intervalul [0 , 1]
•    ambientIntensity simulează lumina ambientală.

Lumina ambientală a întregii scene este suma valorilor câmpului ambientIntesity a tuturor nodurilor de lumină din scenă.

Exemplu : Definirea unei surse de lumină roşie

PointLight {
on TRUE
intensity  .75     # 3/4 din intensitatea maximă
ambientIntensity  .5
color  1  0  0     # roşie
}

Sursa de lumină contribuie cu   0.75 x 0.5 x 1.0 = 0.375 la lumina roşie din lumina ambientală a scenei.

Observaţie: Unele browsere consideră lumina ambientală o proprietate a scenei şi nu a surselor. Aceste browsere setează lumina ambientală la încărcarea scenei şi nu iau în considerare modificarea luminii ambientale.

Caracteristicile nodului DirectionalLight :
•    sursa e foarte îndepărtată
•    razele de lumină sunt paralele
•    câmpul direction specifică direcţia în care se deplasează lumina (vector din origine paralel cu razele emise de sursă
•    luminează doar obiectele children ale nodului de grupare părinte al nodului luminos

Caracteristicile nodului PointLight:
•    sursa se află într-un punct din spaţiu luminează în toate direcţiile
•    câmpul location precizează locaţia sursei de lumină,
•    câmpul radius delimitează raza efectului ei; sunt luminate doar obiectele scenei aflate în interiorul razei respective
•    câmpul attenuation indică coeficientul de atenuare a luminii în funcţie de distanţa faţă de sursa de lumină

Caracteristicile nodului SpotLight:
•    sursă de lumină se află într-un punct din spaţiu şi luminează în interiorul unui con de o anumită direcţie
•    câmpul radius delimitează raza efectului ei; sunt luminate doar obiectele scenei aflate în interiorul razei respective

4.4.3.    Normale

Normala determină modul în care o suprafaţa reflectă lumina sau modul de “legare” a două suprafeţe adiacente.

Normala este un vector 3D de lungime 1 care reprezintă perpendiculara pe suprafaţa unui obiect într-un punct al acestuia. Modelarea iluminării obiectelor în VRML foloseşte această direcţie pentru a calcula direcţia şi cantitatea de lumină reflectată de obiectele scenei. O altă utilizarea a normalei este în cazul “îmbinării” a două obiecte. Direcţia normalei specifică dacă aceasta se face sub un unghi ascuţit sau trecerea de la un obiect la altul se va face “lin”, obiectele fiind deformare în zona de îmbinare pentru a satisface această cerinţă.

Pentru specificarea direcţiei normalei în cazul nodurilor IndexedFaceSet sau ElevationGrid se foloseşte câmpul normal al acestora. Prin intermediul acestuia se poate specifica direcţia normalei în vertexurile/pentru feţele obiectului.
Dacă nu sunt specificate normalele pentru vertexuri/feţe, browserul VRML generează automat normalele pentru vertexuri/feţe în funcţie de valoarea câmpului  creaseAngle a nodului IndexedFaceSet. Dacă unghiul a două feţe alăturare este mai mare decât creaseAngle, atunci muchia care uneşte cele două feţe va fi ascuţită (evidenţiată; altfel legătura celor două feţe se va face lin.


pus acum 17 ani
   
Pagini: 1  

Mergi la