Sunteți pe pagina 1din 6

LABORATOR

Controlul vizualizrii scenelor


Nodul Viewpoint

Puncte. Linii. Suprafete. Forme complexe.

Nodul ElevationGrid
Nodul PointSet
Nodul IndexedLineSet
Nodul IndexedFaceSet

Controlul vizualizrii scenelor


Nodul Viewpoint
Nodul Viewpoint specific localizarea celui care vizualizeaz scena. Implicit observatorul unei scene este localizat n
punctul de coordonate (0, 0, 10). Cel care creeaz un fiier VRML poate specifica alt localizare implicit sau poate defini alte
localizri alternative pe care utilizatorul fiierului le poate selecta astfel nct s vad mai bine anumite detalii ale scenei.
Sintaxa este urmtoarea :

Viewpoint {
position 0 0 10
orientation 0 0 1 0
fieldOfView 0.785398
description "Entry view"
jump TRUE
}
position...... specific poziia observatorului care vizualizeaz scena.
orientation 0 0 1 0 determin direcia n care observatorul privete. Primele 3 valori determina axa n lungul creia

privete iar a 4a valoare unghiul sub care se privete in sensul negativ al axei Oz.
- fieldOfView specifica lrgimea cmpului vizual. Unghiuri mici corespund unor lentile photo, unghiuri mai mari de 3.14
rad sunt echivalente cu lentile largi. In acest ultim caz apar deformri ale imaginii.
- description este o descriere a perspectivei. Cele mai multe browsere permit n momentul in care este afiata scena sa
alegem intre mai multe perspective definite acionnd asupra unui buton numit view i care apare n josul paginii.
- jump permite observatorului sa selecteze intre perspectivele definite . Daca valoarea este definita TRUE atunci practic
scena este vizualizata ca i cnd observatorul ar avea o micare continua intre vechea perspectiva si noua perspectiva. Dac este setat
FALSE perspectiva se modific fr ca observatorul sa aib o micare continua intre vechea si noua poziie.
Daca se definesc mai multe perspective atunci prima definita este cea afiata iniial de browser.

Puncte. Linii. Suprafete. Forme complexe.


Nodul ElevationGrid
Nodul ElevationGrid este utilizat de regul la construirea unor obiecte complexe i neregulate precum forme de relief, rauri,
etc. Sintaxa general este urmtoarea:

ElevationGrid {
xDimension 0
zDimension 0
xSpacing 1.0
zSpacing 1.0
height []
ccw TRUE
color NULL
solid TRUE
colorPerVertex TRUE
creaseAngle 0
normalPerVertex TRUE
normal NULL
texCoord NULL
}
1

Nodul ElevationGrid construiete o reea rectangulara a crei dimensiune n planul Oy poate s varieze . Aceasta variaie este descris
de un vector de scalari care precizeaz coordonata y a reelei n fiecare nod al su.

Figura 1

- Planul Oxz (orizontal) este divizat ntr-o reea, xDimension i zDimension preciznd numrul de noduri ale reelei in
fiecare direcie a axelor de coordonate Ox respectiv Oy. Ambele valori trebuie sa fie mai mari dect 0 .
- xSpacing i zSpacing indic distantele ntre dou noduri consecutive ale reelei. Trebuie sa aib valori mai mari ca 0.
- height [ ] indica coordonata y a fiecrui nod. Poate avea valori pozitive sau negative.
solid indica daca sunt afiate de browser ambele fete ale suprafeei desenate. Daca valoarea este setata pe TRUE att fata exterioara
cat si cea interioara sunt afiate. Daca este setata valoare FALSE este vizualizata doar fata exterioara.
- cmpul ccw specifica daca punctele care definesc o fata a unei suprafee sunt afiate in sens invers acelor unui ceasornic,
counterclockwise, valoarea este TRUE, sau in sensul acelor unui ceasornic, valoarea este FALSE. O suprafaa are doua fete si uneori
este important de tiut care este "fata" si care este "spatele". Daca de exemplu presupunem ca avem o suprafaa perpendiculara pe axa
Oz si cmpul ccw este setat pe TRUE atunci "fata" suprafeei este cea dinspre dvs. Altfel daca valoarea cmpului este setata FALSE
atunci fata dinspre dvs. este "spatele". In figura de mai sus valoarea cmpului ccw este setata pe TRUE iar normala pozitiva (suprafaa
considerata "fata") este orientata in sensul pozitiv al axei 0y.
- creaseAngle specific un unghi limit n funcie de care sunt desenate suprafeele aflate n contact i culorile aplicate
acestora. Astfel dac normalele a dou fee adiacente formeaz un unghi a crui valoare este mai mic dect valoarea creaseAngle
(unghiului limita) atunci mbinarea celor dou suprafee se face lin, n caz contrar delimitarea celor doua suprafee este clar , apar
coluri. Acelai lucru se petrece n cazul culorilor aplicate. Culorile pot aprea distinct sau n gradient n funcie de valoarea unghiului
limit definit.
- campurile color si colorPerVertex specifica modul de colorare al suprafetelor. Color defineste o list de culori care se
aplica fiecrui vrf al reelei sau fiecrei fee. Acest camp este optional , n cazul n care nu este specificat se aplica culorile definite in
nodul Material ca emissive color. Daca nici in acest nod nu este definita o culoare se aplica culoare implicita . Campul
colorPerVertex este un camp boolean care defineste modul n care se aplica culoarea n cazul n care campul color are definite mai
multe culori . Dacvaloarea colorPerVertex este setata TRUE culoare se aplica fiecarui varf in parte, suprafetele fiind colorate in
gradient n functie de culorile varfurilor. Unele browsere interpreteaz aceasta prin definirea unei culori medii prin care se coloreaz
suprafata. Dac valoarea colorPerVertex este setata FALSE practic fiecare faa a retelei este colorat ntr-o singur culoare. n acest
caz numarul de culori care trebuiesc definite este mai mic decat numarul de varfuri (noduri) ale retelei si anume acest numar se
calculeaza astfel: (xDimension - 1)* (zDimension - 1).
- Celelalte campuri definite in sintaxa generala sunt optionale .
Exemplul 1
#VRML V2.0 utf8
Viewpoint {
position 1.2 0.9 4.0
orientation 1.0 0.0 0.0 -0.2
description "Entry view"
}
Shape {
appearance Appearance {
material Material {
}
}

geometry ElevationGrid {
xDimension 16
zDimension 16
xSpacing 0.12
zSpacing 0.12
solid TRUE
ccw
TRUE
#creaseAngle
1.02
#creaseAngle
1.57
height [
0.019608,
0.031373,
0.043137,
0.050980,
0.054902,
0.054902,
0.066667,
0.062745,
0.062745,
0.062745,
0.058824,
0.054902,
0.047059,
0.047059,
0.035294,
0.031373,
0.035294,
0.035294,
0.039216,
0.054902,
0.062745,
0.066667,
0.070588,
0.070588,
0.070588,
0.070588,
0.098039,
0.129412,

0.086275,
0.078431,
0.066667,
0.043137,
0.039216,
0.050980,
0.058824,
0.074510,
0.066667,
0.062745,
0.054902,
0.062745,
0.058824,
0.066667,
0.145098,
0.274510,
0.227451,
0.168627,
0.074510,
0.050980,
0.035294,
0.058824,
0.070588,
0.074510,
0.062745,
0.058824,
0.047059,
0.039216,
0.054902,

0.058824,
0.211765,
0.356863,
0.325490,
0.223529,
0.074510,
0.050980,
0.054902,
0.070588,
0.074510,
0.078431,
0.054902,
0.047059,
0.035294,
0.027451,
0.086275,
0.129412,
0.231373,
0.372549,
0.321569,
0.231373,
0.082353,
0.058824,
0.054902,
0.066667,
0.082353,
0.074510,
0.035294,
0.023529,

0.027451,
0.058824,
0.454902,
0.517647,
0.239216,
0.121569,
0.094118,
0.078431,
0.058824,
0.058824,
0.062745,
0.066667,
0.074510,
0.047059,
0.023529,
0.027451,
0.129412,
0.474510,
0.815686,
0.701961,
0.317647,
0.054902,
0.035294,
0.050980,
0.066667,
0.066667,
0.066667,
0.062745,
0.066667,

0.050980,
0.031373,
0.082353,
0.274510,
0.780392,
0.956863,
0.827451,
0.250980,
0.054902,
0.035294,
0.047059,
0.062745,
0.058824,
0.078431,
0.078431,
0.058824,
0.054902,
0.113725,
0.074510,
0.282353,
0.858824,
0.945098,
0.745098,
0.203922,
0.031373,
0.027451,
0.031373,
0.043137,
0.062745,

0.070588,
0.094118,
0.109804,
0.117647,
0.192157,
0.282353,
0.231373,
0.517647,
0.925490,
0.929412,
0.423529,
0.027451,
0.031373,
0.050980,
0.058824,
0.066667,
0.058824,
0.082353,
0.160784,
0.223529,
0.329412,
0.329412,
0.458824,
0.733333,
0.901961,
0.858824,
0.607843,
0.164706,
0.054902,

0.047059,
0.062745,
0.062745,
0.058824,
0.090196,
0.180392,
0.254902,
0.243137,
0.164706,
0.443137,
0.768627,
0.796078,
0.772549,
0.701961,
0.298039,
0.290196,
0.152941,
0.098039,
0.066667,
0.050980,
0.066667,
0.101961,
0.152941,
0.086275,
0.094118,
0.341176,
0.611765,
0.662745,
0.584314,

0.596078,
0.470588,
0.396078,
0.282353,
0.137255,
0.058824,
0.047059,
0.054902,
0.062745,
0.070588,
0.058824,
0.066667,
0.152941,
0.388235,
0.368627,
0.474510,
0.439216,
0.380392,
0.325490,
0.164706,
0.058824,
0.050980,
0.035294,
0.050980,
0.058824,
0.062745,
0.066667,
0.074510,
0.133333,

0.192157,
0.172549,
0.098039,
0.290196,
0.274510,
0.133333,
0.105882,
0.054902,
0.047059,
0.035294,
0.043137,
0.050980,
0.054902,
0.062745,
0.066667,
0.054902,
0.082353,
0.098039,
0.074510,
0.098039,
0.078431,
0.062745,
0.062745,
0.054902,
0.039216,
]
}
}

Exemplul 2
#VRML V2.0 utf8
Viewpoint {
position 4.5 4.0 15.0
orientation 1.0 0.0 0.0 -0.2
description "Entry view"
}
NavigationInfo {
type [ "EXAMINE", "ANY" ]
headlight TRUE
}
Shape {
appearance Appearance {
material Material { }
}
geometry ElevationGrid {
xDimension 10
zDimension 10
xSpacing 0.8
zSpacing 0.8
solid
TRUE
ccw
TRUE
creaseAngle
1.57
height [
0.0, 0.0, 0.5, 1.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 2.5, 0.5, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.5, 0.5, 3.0, 1.0, 0.5, 0.0, 1.0, 0.1,
0.0, 0.0, 0.5, 2.0, 4.5, 2.5, 1.0, 1.5, 0.5, 0.2,
1.0, 2.5, 3.0, 4.5, 5.5, 3.5, 3.0, 1.0, 0.0, 0.0,

0.5, 2.0, 2.0, 2.5, 3.5, 4.0, 2.0, 0.5, 0.0, 0.0,
0.0, 0.0, 0.5, 1.5, 1.0, 2.0, 3.0, 1.5, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 1.5, 0.5, 0.3,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.0, 0.0, 0.0,
]
colorPerVertex FALSE
# colorPerVertex TRUE
color Color {
color [
0.0 0.3 1.0, 0.0 0.3 1.0, 0.0 0.5 0.1,
0.2 0.6 0.0, 0.0 0.5 0.1, 0.0 0.3 1.0,
0.0 0.3 1.0, 0.0 0.3 1.0, 0.0 0.3 1.0,
0.0 0.3 1.0, 0.0 0.3 1.0, 0.0 0.3 1.0,
0.0 0.3 1.0, 0.5 0.4 0.0, 0.0 0.5 0.1,
0.0 0.3 1.0, 0.0 0.3 1.0, 0.0 0.3 1.0,
0.0 0.3 1.0, 0.0 0.3 1.0, 0.0 0.5 0.1,
0.0 0.5 0.1, 0.5 0.4 0.0, 0.2 0.6 0.0,
0.0 0.5 0.1, 0.0 0.3 1.0, 0.2 0.6 0.0,
0.0 0.3 1.0, 0.0 0.3 1.0, 0.0 0.5 0.1,
0.4 0.3 0.1, 0.7 0.7 0.7, 0.5 0.4 0.0,
0.2 0.6 0.1, 0.3 0.6 0.6, 0.0 0.5 0.1,
0.2 0.6 0.0, 0.5 0.4 0.0, 0.5 0.4 0.0,
0.7 0.7 0.7, 0.8 0.8 0.8, 0.5 0.5 0.7,
0.5 0.5 0.7, 0.2 0.6 0.0, 0.0 0.3 1.0,
0.0 0.5 0.1, 0.2 0.6 0.1, 0.2 0.6 0.1,
0.2 0.6 0.1, 0.5 0.5 0.7, 0.7 0.7 0.7,
0.5 0.4 0.0, 0.0 0.5 0.1, 0.0 0.3 1.0,
0.0 0.5 0.1, 0.0 0.3 1.0, 0.0 0.5 0.1,
0.2 0.6 0.1, 0.2 0.6 0.0, 0.5 0.4 0.0,
0.5 0.5 0.7, 0.2 0.6 0.0, 0.0 0.3 1.0,
0.0 0.3 1.0, 0.0 0.3 1.0, 0.0 0.3 1.0,
0.0 0.3 1.0, 0.0 0.3 1.0, 0.0 0.5 0.1,
0.5 0.4 0.0, 0.2 0.6 0.0, 0.0 0.5 0.1,
0.0 0.3 1.0, 0.0 0.3 1.0, 0.0 0.3 1.0,
0.0 0.3 1.0, 0.0 0.3 1.0, 0.0 0.3 1.0,
0.0 0.5 0.1, 0.0 0.3 1.0, 0.0 0.3 1.0,
0.0 0.3 1.0, 0.0 0.3 1.0, 0.0 0.3 1.0,
0.0 0.3 1.0, 0.0 0.3 1.0, 0.0 0.3 1.0,
0.0 0.5 0.1, 0.0 0.3 1.0, 0.0 0.3 1.0,

]
}
}
}

Nodul PointSet
Nodul PointSet specific desenarea unor puncte in sistemul de coordonate local. Punctele pot fi colorate prin
specificarea culorilor dorite. Sintaxa este urmatoarea:

Shape {
geometry PointSet {
coord Coordinate { point [... , ..., ...] }
color Color { color [..., ... , ... ] }
}
}
In exemplul de mai jos coordonatele punctelor desenate sunt precizate prin seturi de 3 numere separate prin virgula in interiorul
parantezelor campului point[....]. Cele trei numere reprezint valorile coordonatelor punctului ce urmeaza a fi desenat in raport cu
sistemul de coordonate local. Culorile punctelor sunt precizate in interiorul campului color[....] dupa aceleasi reguli ca si in cazul
colorarii formelor geometrice primitive.

Exemplul 3
#VRML V2.0 utf8
Shape {
geometry PointSet {
coord Coordinate {
point [ 0 -1 1, 1 0 0, -1 2 -1, -2 0 0, -2 2 -1, 1 -2 1, 3 -1 3,
1 1 1, 1 1 0, 0 2 -1, -3 0 0, -1 1 -1, 3 -2 1, 3 0 3, ]}
color Color {
color [ 1 0 0, 0 1 0, 1 1 0, 0 1 1, 1 1 1, 1 0 0, 1 0 0,
1 0 0, 0 1 0, 1 1 0, 0 1 1, 1 1 1, 1 0 0, 1 0 0
]
}
}
}

Nodul IndexedLineSet
Nodul IndexedLineSet deseneaza linii poligonale care unesc puncte definite in raport cu sistemul de coordonate local si care
pot fi colorate in mod divers. Sintaxa generala este:

IndexedLineSet {
color NULL
coord NULL
colorIndex []
colorPerVertex TRUE
coordIndex []
}
Exemplul 4
#VRML V2.0 utf8
Shape {
appearance Appearance {
material Material {
diffuseColor 1.0 1.0 1.0
emissiveColor 1.0 1.0 1.0
}
}
geometry IndexedLineSet {
coord Coordinate {point [0.0 0.0 0.0, 5.0 0.0 0.0, 0.0 5.0 0.0]}
coordIndex [
0, 1, -1, 0, 2, -1
]
}
}
Exemplul de mai sus ilustreaz modul n care opereaz cele dou cmpuri coord si coordIndex. Cmpul coord este un nod care
definete coordonatele punctelor intre care se traseaz linia. Astfel n exemplu sunt definite punctele (0,0,0) care urmeaz s fie
centrul axelor de coordonate, (5,0,0) care definete axa orizontala si (0,5,0) care definete axa verticala. Aceste puncte formeaz un
vector n interiorul cmpului point[ ] care are 3 elemente , cele 3 elemente ocupnd n ordine poziiile 0, 1, 2. Cmpul coordIndex
precizeaz modul n care se unesc aceste 3 puncte genernd linia corespunztoare. Astfel n cazul de mai sus se unete punctul
ocupnd poziia 0 n vectorul point[ ] cu punctul ce ocupa poziia 1, -1 indica ntreruperea liniei , apoi se genereaz o noua linie prin
unirea punctelor care ocupa in vector poziia 0 i poziia 2, valoarea -1 indica din nou faptul c se termina linia. Aceste doua linii apar
colorate n alb, culoare definita n nodul material.

Nodul IndexedFaceSet
Nodul IndexedFaceSet genereaz o suprafata tridimensionala construita din mai multe suprafete generate la randul lor de
punctele n spatiul tridimensional precizate de campul coord. Modul n care sunt alese punctele ce genereaza suprafata este definit de
campul coordIndex. Pentru a genera o suprafata este nevoie sa fie definite cel putin 3 puncte iar coordIndex precizeaza care din aceste
puncte sunt alese pentru a genera suprafata si in ce ordine. De aceea acest camp trebuie sa contina valori intre 0 si N-1 , unde N
reprezinta numarul de puncte definite. Valoarea -1 indica faptul ca o suprafata generata se termina si incepe o alta. Pentru a desena o
suprafa trebuiesc definite cel putin 3 puncte diferite, punctele s genereze un poligon plan, linia poligonala sa nu se autointersecteze.
Exemplul 5:

#VRML V2.0 utf8


# genereaza o piramida
Shape {
appearance Appearance {
material Material {
diffuseColor 0.0 0.5 1.0
emissiveColor 0.0 0.3 1.0
}
}
geometry IndexedFaceSet {
coord Coordinate {
point [ 1 0 -1, -1 0 -1, -1 0 1, 1 0 1, 0 2 0 ]
}
coordIndex [ 0 4 3 -1 # fata A, dreapta
1 4 0 -1 # fata B, spate
2 4 1 -1 # fata C, stanga
3 4 2 -1 # fata D, fata
0 3 2 1 ] # fata E, baza
}
}
n exemplul de mai sus este generata o piramida cu baza un patrat . Campul point [ ] defineste coordonatele a 5 puncte. Pozitiile
acestor puncte sunt numerotate de la 0 la 4 si utilizate in cadrul campului coordIndex pentru a genera cele 4 fete laterale si baza. De
exemplu fata din dreapta a piramidei este generata de punctele aflate pe pozitiile 0, 4, 3 in vectorul point [ ]. Numarul -1 indica faptul
ca se incheie o suparafata si incepe o alta suprafata.
In exemplele de mai jos este ilustrat modul in care se pot aplica culorile altfel decat n situatia n care culoarea nu este
predefinit n nodul material.
Exemplul 6:
Exemplul 7:
colorPerVertex este FALSE
colorPerVertex este TRUE
#VRML V2.0 utf8
#VRML V2.0 utf8
# genereaza o piramida
# genereaza o piramida
Shape {
Shape {
appearance Appearance {
appearance Appearance {
material Material {
material Material {
}
}
}
}
geometry IndexedFaceSet {
geometry IndexedFaceSet {
coord Coordinate {point [ 1 0 -1, -1 0 -1, -1 0 1, 1 0 1, 0 2 0 ]}
coord Coordinate {point [ 1 0 -1, -1 0 -1, -1 0 1, 1 0 1, 0 2 0 ]}
coordIndex [ 0 4 3 -1 # fata A, dreapta
coordIndex [ 0 4 3 -1 # fata A, dreapta
1 4 0 -1 # fata B, spate
1 4 0 -1 # fata B, spate
2 4 1 -1 # fata C, stanga
2 4 1 -1 # fata C, stanga
3 4 2 -1 # fata D, fata
3 4 2 -1 # fata D, fata
0 3 2 1 ] # fata E, baza
0 3 2 1 ] # fata E, baza
color Color { color [ 0 0 1, 0 1 0, 0 1 1, 1 0 0, 1 0 1, 0.5 1 0.7
color Color { color [ 0 0 1, 0 1 0, 0 1 1, 1 0 0, 1 0 1, 0.5 1 0.7
]}
]}
colorPerVertex TRUE
colorPerVertex FALSE
colorIndex [ 4, 1, 2, 5, 3, ]
colorIndex [ 4, 1, 2, 5, 3, ]
}
}
}
}

n cazul n care colorPerVertex este FALSE culoarea se aplic fiecarei suprafete n parte astfel:
Culorile sunt mai intai definite in campul color Color { color [ 0 0 1, 0 1 0, 0 1 1, 1 0 0, 1 0 1, 0.5 1 0.7 ] }, sa zicem ca avem definite
6 culori.
In cazul in care campul colorIndex nu este gol atunci fiecare fata apare colorata intr-o singura culoare. Trebuie sa fie atatia indici in
campul colorIndex cte suprafete sunt definite . Indicii sunt numere naturale de la 0 la N-1 , unde N reprezint numarul de suprafete
definite. Indicele i indica aplicarea culorii definite pe pozitia i-1 in campul color [ ]
In cazul in care campul colorIndex este gol culorile sunt aplicate fiecarei suprafete in ordine in care sunt definite in nodul Color.
Trebuie sa fie definite cel putin atatea culori cate suprafee exist.

n cazul n care colorPerVertex este TRUE culoarea se aplica fiecarui punct geometric definit (varf) dupa cum
urmeaz:
In cazul in care cmpul colorIndex nu este gol atunci culorile se aplica fiecarui punct (varf) definit in aceeasi maniera in care campul
coordIndex este utilizat pentru a alege coordonatele fiecarui varf din lista definita in nodul Coordinate. Trebuie avut grija ca numarul
de culori definite sa fie compatibil cu indicii definiti in colorIndex
In cazul in care colorIndex este gol , atunci campul coordIndex este utilizat pentru a alege culorile din noul Color.
Culorile se aplica n gradient.