Introduction
VRML (Virtual Reality Markup ou Modeling
Langage): langage de description de scènes
Extension à la 3D de ce que permet de faire
HTML en 2D
Fonctionnalités
(VRML 1.0)
Modélisation et affichage de
scènes 3D texturées
Mise en évidence de zones cliquables
permettant de réaliser:
- le lien vers dautres mondes
VRML ou pages WEB,
- le chargement dimages fixes et animées, de sons, ...
Concepts et syntaxe de la
modélisation
Larborescence de scène
Document VRML: liste de nuds
(objets) organisés sous forme hiérarchique (listes et inclusions -> arborescences)
Tout nud possède un type
(Sphere, Cube, WWWInline, Separator,...).
Deux importantes classes de
nuds:
- les nuds de forme (cube,
sphère, lumière, ...)
- les nuds propriété (matériau, transformation, ...)
Les nuds propriété modifient
létat interne du processus daffichage de telle manière que le nouvel état
reste actif pour tous les nuds de forme définis après lui (jusquà nouvelle
modification).
Les
nuds
Un nud peut comporter des champs
qui permettent dindiquer les informations le concernant.
Exemples: Sphere contient un champ
radius.
Sphere {
radius r
}
Cube {
width w
height h
depth d
}
Les champs non renseignés sont
initialisés à une valeur par défaut.
Exemple
#VRML V1.0 ascii
Sphere {
radius 10 }
Scène composée d'une unique boule
blanche

Le nom du nud est suivi, entre
accolades, des noms et des valeurs de ses différents champs.
Les
nuds de groupe
nuds de groupe:
nud pouvant contenir d'autres nuds
Tout le contenu d'un nud de
groupe est vu comme un seul objet
-> manipulation d'un grand nombre
d'objets comme un seul objet.
Separator: nud
de groupe destiné à contenir d'autres nuds et tel que les modifications apportées
aux éléments à lintérieur du nud ne sont plus prises en compte une fois
ressorti.
Exemple: Voir plus loin, voir plus loin, voir plus loin
Nuds
dusage courant
Transformations géométriques (propriété)
Tout ce qui se trouve dans un
nud de groupe, faute d'indications contraires, est situé dans le même repère.
Les transformations géométriques
pourront être réalisées au moyen des nuds:
- Translation
Translation {
translation tx ty tz
}
- Rotation
Rotation {
rotation ax ay az a
}
- rotation: rotation de l'angle a autour de l'axe
(ax,ay,az)
- Scale
Scale {
scaleFactor fx fy fz
}
- MatrixTransform
MatrixTransform {
matrix m00 m01 m02 m03
m10 m11 m12 m13
m20 m21 m22 m23
m30 m31 m32 m33
}
- Transform
Le nud Transform définit une
transformation géométrique consistant dans l'ordre en un zoom par rapport à un point
arbitraire, une rotation autour d'un point et d'un axe arbitraire et une translation.
Transform {
translation tx ty tz
rotation ax ay az a
scaleFactor fx fy fz
scaleOrientation ax ay az a
center x y z
}
- translation: translation terminale
- rotation: rotation intermédiaire
- scaleFactor: zoom initial
- scaleOrientation: orientation du zoom
- center: centre du zoom
Transform {
translation T1
rotation R1
scaleFactor S
scaleOrientation R2
center T2
}
est équivalent à la séquence
Translation { translation T1 }
Translation { translation T2 }
Rotation { rotation R1 }
Rotation { rotation R2 }
Scale { scaleFactor S }
Rotation { rotation -R2 }
Translation { translation -T2 }
Exemple
#VRML V1.0 ascii
Separator {
Sphere {
radius 10 }
Separator {
Transform {
translation 10 0 15 }
Sphere {
radius 2 } }
Separator {
Transform {
translation -10 0 5 }
Sphere {
radius 1.5 } } }

Material
(propriété)
Material: Spécifie les
caractéristiques optiques d'une surface.
Material {
ambientColor r v b
diffuseColor r v b
specularColor r v b
emissiveColor r v b
shininess f
transparency f
}
- ambienteColor: couleur ambiante
- diffuseColor: couleur diffuse
- specularColor: couleur spéculaire
- emissiveColor: couleur émise
- shininess: réflectivité
- transparency: transparence
Exemple
1
#VRML V1.0 ascii
Separator {
Material {
diffuseColor 1 1 0 }
Sphere {
radius 10 } }
La sphère définie après Material
est affectée de la couleur jaune. Il s'agit de la couleur quelle diffuse.

Exemple 2
#VRML V1.0 ascii
Separator {
Material {
diffuseColor 1 1 0 }
Sphere {
radius 10 }
Separator {
Transform {
translation 10 0 15 }
Material {
diffuseColor 0 0 1 }
Sphere {
radius 2 } }
Separator {
Transform {
translation -10 0 5 }
Material {
diffuseColor 1 0 0 }
Sphere {
radius 1.5 } } }

Exemple 3
#VRML V1.0 ascii
Separator {
Translation {
translation 0 0 -30 }
Material {
diffuseColor 0 0 1 }
Separator {
Translation {
translation 12 0 0 }
Material {
diffuseColor 1 0 0 }
Sphere {
radius 10 } }
Separator {
Translation {
translation -12 0 0 }
Sphere {
radius 10 } } }

Les lumières
Plusieurs nuds lumière sont
possibles en VRML:
- PointLight: Lumière ponctuelle
isotropique
PointLight {
on TRUE
intensity v
color r v b
location x y z
}
- on: allumé ou non
- intensity: énergie émise
- color: couleur de la lumière émise
- location: position de la source lumineuse
- DirectionalLight: Lumière émise
dans une direction (pas datténuation)
DirectionalLight {
on TRUE
intensity v
color r v b
direction dx dy dz
}
- on: allumé ou non
- intensity: énergie émise
- color: couleur de la lumière émise
- direction: direction du vecteur éclairage
- SpotLight: Lumière ponctuelle
émise isotropiquement ou non dans un cône
SpotLight {
on TRUE
intensity v
color r v b
direction dx dy dz
location x y z
dropOffRate v
cutOffAngle v
}
- on: allumé ou non
- intensity: énergie émise
- color: couleur de la lumière émise
- direction: direction du vecteur éclairage
- location: position de la source lumineuse
- dropOffRate: diminution de l'éclairage avec
l'éloignement de la direction privilégiée
- cutOffAngle: dimension angulaire du cône
d'éclairage
Ils éclairent les objets définis
après eux.
Exemple
#VRML V1.0 ascii
Separator {
PointLight {
intensity 1
color 1 1 0.9 }
Material {
emissiveColor 1 1 0 }
Sphere {
radius 10 }
Separator {
Translation {
translation 18 0 0 }
Material {
diffuseColor 0 0 1
shininess 0.9 }
Sphere {
radius 5 }
Separator {
Translation {
translation 10 0 0 }
Material {
diffuseColor 0.7 0.7 0.7
shininess 0.3 }
Sphere {
radius 3 } } } }

Utilisation d'un PointLight au
centre du soleil
Exemple
Material {
diffuseColor 0 0 1
specularColor 0.9 0.9 0.9
shininess 0.9 }
Sphere {
radius 2 }

Modification de la surface de la
Terre et de la Lune par apport d'une réflexion spéculaire
Les liens
Les objets d'une scène VRML peuvent
être rendus cliquables.
-> création de liens vers d'autres
mondes virtuels ou, plus simplement, d'autres pages WEB ou tout autre document.
Le nud WWWAnchor
WWWAnchor est un nud de groupe.
-> il contient les nuds à
lier avec l'URL indiquée.
WWWAnchor {
name "xxx"
description "yyy"
}
- name: URL à lier
- description: texte de description
name et description doivent être
donnés entre guillemets.
Exemple
#VRML V1.0 ascii
Separator {
Material {
emissiveColor 1 1 0 }
WWWAnchor {
name "http://www.univ-fcomte.fr/"
description "Un lien vers la
Franche-Comté"
Sphere {
radius 10 } } }
Les caméras
Les caméras VRML effectue par défaut
une visualisation selon l'axe -z. Il est toutefois possible de définir une rotation de
cette axe.
Il est aussi possible de choisir la
position de la caméra.
Deux types de caméra:
- perspective
PerspectiveCamera {
position x y z
orientation dx dy dz a
focalDistance f
heightAngle a
}
- position: position de la caméra
- orientation: orientation dans l'espace. Rotation de
l'axe de visualisation de la caméra (-z) pour une valeur d'angle a autour de l'axe (dx,
dy, dz)
- focalDistance: distance aux objets à visualiser (à
ne pas confondre avec la distance focale en photographie)
- heightAngle: angle d'ouverture en y de la caméra
- orthographique
OrthographicCamera {
position x y z
orientation dx dy dz a
focalDistance f
height a
}
- position: position de la caméra
- orientation: orientation dans l'espace. Rotation de
l'axe de visualisation de la caméra (-z) pour une valeur d'angle a autour de l'axe (dx,
dy, dz)
- focalDistance: distance aux objets à visualiser (à
ne pas confondre avec la distance focale en photographie)
- height: ouverture en y de la caméra
Ces caméras permettent de définir
des points de vue dans les scènes VRML.
Une caméra peut être définie
globalement pour une scène (définition après l'entête de fichier VRML) ou bien ne
concerner que le contenu des noeuds situés après elle dans dans l'arborescence de
scène. Dans ce dernier cas les objets sont affichés comme visualisés par cette caméra.
PerspectiveCamera {
position 2 375 140
orientation 1 0 0 -1.215
focalDistance 60
heightAngle .06
}

PerspectiveCamera {
position 2 32 12
orientation 1 0 0 -1.215
focalDistance 60
heightAngle 0.8
}

Exemples




Les
textures
VRML autorise le texturage des objets
d'une scène.
Le nud Texture2 permet cette
réalisation.
Une texture peut être donnée sous
deux formes:
- octet par octet pour tous les pixels
de l'image à plaquer,
- un fichier image au format JPEG.
Texture2 {
image rx ry b
...
filename "file"
wrapS v
wrapT v
}
- image: résolution en x, puis résolution en y, puis
nombre d'octet par pixel, puis la liste des octets de l'image
- filename: non du fichier contenant l'image
- wrapS: répétition ou non de la texture selon l'axe
S (REAPEAT ou CLAMP)
- wrapT: répétition ou non de la texture selon l'axe
T (REAPEAT ou CLAMP)
Tous les objets
placés après le nud texture sont texturés.
Champ image
La couleur
des pixels est directement donnée dans le fichier VRML sous la forme de la résolution en
x, puis de la résolution en y, puis du nombre d'octets par pixel (3: RVB), et enfin,
d'une suite de pixels en notation hexadécimale.
Exemple
Texture2 {
image 4 4 3
0xC0C0C0 0x808080 0xFFFFFF 0x404040
0x808080 0x202020 0x808080 0xC0C0C0
0x202020 0x808080 0xFFFFFF 0x808080
0x808080 0xC0C0C0 0x808080 0x202020 }
Dans le SceneViewer

Dans le plugin WorldView
Champ filename
On indique ici l'URL d'un
fichier contenant l'image à mapper.
Exemple
Texture2
{
filename "bugs.jpg" }

Les
ensembles de facettes
(1)
Utilisation du nud Coordinate3 pour indiquer les coordonnées 3D des sommets
Coordinate3 {
point [
x0 y0 z0,
x1 y1 z1,
x2 y2 z2,
...
]
}
(2) Utilisation du nud
IndexedFaceSet pour indiquer la liste des facettes par indexation dans la liste des
sommets
IndexedFaceSet {
coordIndex [
s1 s2 ... sn -1,
s1 s2 ... sm -1,
s1 s2 ... sp -1,
...
]
materialIndex
normalIndex
textureCoordIndex
}
- coordIndex: liste des facettes (entre crochets),
chaque facette est définie par la liste des indices de ses sommets (liste finie par un
-1)
- materialIndex: idem ci-dessus mais pour des
matériaux
- normalIndex: idem pour les normales
- textureCoordIndex: idem pour les coordonnées des
textures
Exemple
#VRML V1.0 ascii
Separator {
Material {
diffuseColor 0.0 1.0 0.0
ambientColor 0.0 0.1 0.0 }
Coordinate3 {
point [
1.0 -1.0 1.0,
1.0 -1.0 -1.0,
-1.0 -1.0 -1.0,
-1.0 -1.0 1.0,
1.0 1.0 -1.0,
-1.0 1.0 -1.0,
-1.0 1.0 1.0,
1.0 1.0 1.0 ] }
IndexedFaceSet {
coordIndex [
2, 1, 0, -1,
2, 0, 3, -1,
4, 1, 2, -1,
4, 2, 5, -1,
5, 2, 3, -1,
5, 3, 6, -1,
6, 3, 0, -1,
6, 0, 7, -1,
4, 5, 6, -1,
4, 6, 7, -1,
1, 4, 7, -1,
1, 7, 0, -1 ] } }

Instanciation
d'objets
DEF
DEF permet d'attribuer un nom à
un nud (un objet) de manière que ce nud puisse être réutilisé par la suite
(cet objet puisse être instancié).
Syntaxe
DEF nom_objet type_de_noeud {
}
Exemple
DEF Soleil Separator {
Material {
diffuseColor 1 1 0 }
Sphere {
radius 10 } }
USE
A tout instant, un appel à USE
permet d'instancier un objet nommé.
Syntaxe
USE nom_objet
Exemple
USE Soleil
Exemple
#VRML V1.0 ascii
DEF Planete Separator {
Material {
diffuseColor 1.0 1.0 1.0
ambientColor 0.1 0.1 0.1 }
Sphere { } }
Translation {
translation 2 3 4 }
USE Planete
Translation {
translation 4 3 2 }
WWWAnchor {
name "http://www.univ-fcomte.fr"
description "Retour sur Terre"
USE Planete }

Le
nud WWWInline
WWWInline est un nud de
groupe permettant l'inclusion par référence d'objets à l'intérieur d'une scène.
-> non construction entière d'un objet,
mais seulement référenciation des parties de cet objet comme provenant d'autre documents
VRML.
WWWInline {
name "xxx"
bboxSize dx dy dz
bboxCenter x y z
}
- name: URL du fichier VRML contenant l'objet à
inclure
- bboxSize: taille de la boite englobant l'objet
référencé
- bboxCenter: position de la boite englobante
La boite englobante est
affichée en filaire tant que l'objet référencé n'est pas chargé.
Elle doit être d'une taille voisine de l'objet
qu'elle représente.
Exemple

Image intermédiaire

Image finale
Le nud LOD
Le nud de groupe LOD
permet l'adaptation d'un objet visualisé à la distance d de visualisation.
LOD {
range [v1,v2,...,vn]
center x y z
}
- range: liste de n distances croissantes
- center: position de référence pour le nud
LOD
Un nud LOD contient
théoriquement n+1 nuds.
Seul le 1er est évalué si d <
v1.
Seul le 2ème est évalué si v1
< d < v2.
...
Seul le n+1ème est évalué si d
> v2.
Exemple
#VRML V1.0 ascii
Separator {
LOD {
range [ 50,100 ]
Separator {
Material {
diffuseColor 1 1 0 }
Sphere {
radius 10 } }
Separator {
Material {
diffuseColor 1 0 1 }
Cone {
bottomRadius 10
height 10 } }
Separator {
Material {
diffuseColor 1 1 1 }
Cube {
width 10
height 10
depth 10 } } } }

Récapitulatif des nuds
Les nuds de forme
Cube {
width 2
height 2
depth 2
}

Sphere {
radius 1
}

Cylinder {
parts ALL
radius 1
height 2
}
parts:
composition de SIDES, TOP, BOTTOM et ALL
Exemple: (SIDES|TOP)

Cone {
parts ALL
bottomRadius 1
height 2
}
parts:
composition de SIDES, BOTTOM et ALL

Les
autres noeuds
Coordinate3 {
point 0 0 0 # M
}
DirectionalLight
{
on TRUE
intensity 1
color 1 1 1
direction 0 0 -1
}
IndexedFaceSet
{
coordIndex 0 # M
materialIndex -1 # M
normalIndex -1 # M
textureCoordIndex -1 # M
}
IndexedLineSet
{
coordIndex 0 # M
materialIndex -1 # M
normalIndex -1 # M
textureCoordIndex -1 # M
}
LOD {
range [ ] # M
center 0 0 0
}
Material {
ambientColor 0.2 0.2 0.2
diffuseColor 0.8 0.8 0.8
specularColor 0 0 0
emissiveColor 0 0 0
shininess 0.2
transparency 0
}
MatrixTransform
{
matrix 1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
}
OrthographicCamera
{
position 0 0 1
orientation 0 0 1 0
focalDistance 5
height 2
}
PerspectiveCamera
{
position 0 0 1
orientation 0 0 1 0
focalDistance 5
heightAngle 0.785398
}
PointLight {
on TRUE
intensity 1
color 1 1 1
location 0 0 1
}
PointSet {
startIndex 0
numPoints -1
}
Rotation {
rotation 0 0 1 0
}
Scale {
scaleFactor 1 1 1
}
SpotLight {
on TRUE
intensity 1
color 1 1 1
location 0 0 1
direction 0 0 -1
dropOffRate 0
cutOffAngle 0.785398
}
Texture2 {
filename ""
image 0 0 0
wrapS REPEAT
wrapT REPEAT
}
WRAP
ENUM
REPEAT Repeats texture outside
0-1 coordinate range
CLAMP Clamps texture coordinates
to lie within 0-1 range
Transform {
translation 0 0 0
rotation 0 0 1 0
scaleFactor 1 1 1
scaleOrientation 0 0 1 0
center 0 0 0
}
Translation {
translation 0 0 0
}
WWWAnchor {
name ""
description ""
map NONE
}
MAP ENUM
NONE Do not add information to the URL
POINT Add object-space
coordinates to URL
WWWInline {
name ""
bboxSize 0 0 0
bboxCenter 0 0 0
}
|