Vrml_small.gif (1540 octets)

VRML

INTRODUCTION

FONCTION-
NALITES

CONCEPTS ET SYNTAXE

LES NŒUDS
Les nœuds de groupe
Les nœuds d'usage courant
Matières
Transformations géométriques
Lumières
Liens
Caméras
Textures
Ensembles
de facettes

DEF et USE
WWWInline
LOD

RÉCAPITULATIF DES NŒUDS

EXEMPLES

WB01624_.gif (281 octets) RETOUR

Dernière modification
17/04/01 12:57:49

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 d’autres mondes VRML ou pages WEB,
- le chargement d’images fixes et animées, de sons, ...

Concepts et syntaxe de la modélisation

L’arborescence de scène

Document VRML: liste de nœuds (objets) organisés sous forme hiérarchique (listes et inclusions -> arborescences)

Tout nœud possède un type (Sphere, Cube, WWWInline, Separator,...).

Deux importantes classes de nœuds:

- les nœuds de forme (cube, sphère, lumière, ...)
- les nœuds propriété (matériau, transformation, ...)

Les nœuds propriété modifient l’état interne du processus d’affichage de telle manière que le nouvel état reste actif pour tous les nœuds de forme définis après lui (jusqu’à nouvelle modification).

Les nœuds

Un nœud peut comporter des champs qui permettent d’indiquer les informations le concernant.

Exemples: Sphere contient un champ radius.

Sphere {
  radius r
}
  • radius: rayon

Cube {
  width w
  height h
  depth d
}
  • width, height, depth: largeur, hauteur et profondeur

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 nœud est suivi, entre accolades, des noms et des valeurs de ses différents champs.

Les nœuds de groupe

nœuds de groupe: nœud pouvant contenir d'autres nœuds

Tout le contenu d'un nœud de groupe est vu comme un seul objet

-> manipulation d'un grand nombre d'objets comme un seul objet.

Separator: nœud de groupe destiné à contenir d'autres nœuds et tel que les modifications apportées aux éléments à l’intérieur du nœud ne sont plus prises en compte une fois ressorti.

Exemple: Voir plus loin, voir plus loin, voir plus loin

Nœuds d’usage courant

Transformations géométriques (propriété)

Tout ce qui se trouve dans un nœud 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 nœuds:

- Translation

Translation {
  translation tx ty tz
}

  • translation: déplacement de tx en x, ty en y et tz en z

- 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
}

  • scalefactor: zoom de facteurs fx, fy et fz selon les axes x, y et z vis à vis de l'origine

- MatrixTransform

MatrixTransform {
  matrix m00 m01 m02 m03
  m10 m11 m12 m13
  m20 m21 m22 m23
  m30 m31 m32 m33
}

  • matrix: transformation selon la matrice donnée en paramètre (notée en transposition de la convention habituelle)

- Transform

Le nœud 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

  1. Translation { translation T1 }

  2. Translation { translation T2 }

  3. Rotation { rotation R1 }

  4. Rotation { rotation R2 }

  5. Scale { scaleFactor S }

  6. Rotation { rotation -R2 }

  7. 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 qu’elle 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 nœuds 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 d’atté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 nœud WWWAnchor

WWWAnchor est un nœud de groupe.

-> il contient les nœuds à 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

Image09a-p.gif (1853 octets)

  • Visualisation orthographique: projection orthographique avec un grand volume de visualisation -> les objets sont petits à l'écran et non déformés.

Image09b-p.gif (1938 octets)

Image09c-p.gif (6826 octets)

  • Visualisation en perspective de près: projection en perspective. Les objets près de l'observateur sont grands à l'écran et très déformés. Ceux situés plus loin sont petits et peu déformés.

Image09d-p.gif (5026 octets)

Les textures

VRML autorise le texturage des objets d'une scène.

Le nœud 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 nœud 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" }

Image40d.gif (28279 octets)

Les ensembles de facettes

(1) Utilisation du nœud Coordinate3 pour indiquer les coordonnées 3D des sommets

Coordinate3 {
  point [
  x0 y0 z0,
  x1 y1 z1,
  x2 y2 z2,
  ...
  ]
}

  • point: liste des coordonnées définies (entre crochets)

(2) Utilisation du nœud 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 nœud (un objet) de manière que ce nœud 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 nœud WWWInline

WWWInline est un nœud 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

Image48.gif (7564 octets)

Image intermédiaire

Image48.gif (7564 octets)

Image finale

Le nœud LOD

Le nœud 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 nœud LOD

Un nœud LOD contient théoriquement n+1 nœuds.

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 } } } }

Image49a.gif (2890 octets) Image49a.gif (2890 octets) Image49a.gif (2890 octets)

Récapitulatif des nœuds

Les nœuds 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
}

Vrml.gif (13723 octets)