![]() |
|

Installation.
Obtenir un viewer 3d:
Utiliser les formulaires:x-tp/x-vrml97. Donc,
utilisez le menu preferences->applications de votre navigateur pour
ajouter votre helper à la liste.
Introduction.
VRML (Virtual Reality Modeling Langage)
Conventions géométriques:
Structure d'un fichier VRML 97:
#VRML V2.0 utf8
MOT_CLÉ { PARAMÈTRES ... } et permet de produire des
formes ou des transformations géométriques, spécifier l'apparence
des objets, rajouter du texte ... Tous les paramêtres sont
optionnels, et des valeurs par défaut sont garanties. Si vous ne
voulez que les valeurs par défaut, vous êtes cependant obligés de
mettre les accolades. Ainsi, pour créer un cube, vous pouvez
écrire simplement ceci: Box { }
Les noeuds du langage ne peuvent pas s'utiliser n'importe comment
et à n'importe quelle place dans le fichier. Il existe en
particulier des «noeuds de groupe» qui peuvent contenir certains
autres noeuds dans leur paramètres. Nous en verrons certains.
DEF cube Box { size 3 3 3 }
Ensuite, au lieu d'être obligé de réécrire le noeud et l'ensemble
de ses paramêtres à chaque fois que vous en avez besoin, vous
pouvez simplement écrire: USE cubeNote: L'appel à DEF exécute réellement le noeud en question. Il ne s'agit donc pas seulement d'une définition, car le noeud défini prend effet immédiatement.

Production des objets.
Un objet au sens VRML est compose de deux éléments principaux: une géométrie et une apparence. Ce couple défini ce que l'on appelle une "forme" en VRML. Pour pouvoir utiliser un objet, on est donc obligé de passer par le noeud correspondant, le noeud Shape:
Spécification
de «Forme»:
Le champ appearance, si non nul, contient un noeud Appearance qui permet de définir la couleur, les textures etc. Ceci sera vu plus tard, dans la section "Apparence". Le champ geometry contient un noeud spécifiant une géometrie d'objet, par exemple les primitives géométriques décrites dans la section suivante.

Primitives géométriques.
VRML 97 reconnait 4 objets de base: boîtes, cônes, cylindres et
sphères.
A l'aide du champ ci-dessous:

Apparence des objets.
Le noeud Appearance dont nous avons déja parlé contient deux champs, permettant de définir un "matériau" (couleur de l'objet, réflexion de la lumière) et une texture (image à plaquer sur l'objet). Sa syntaxe est la suivante:
Spécification
d'«Apparence»:
Les champs material et texture contiennent des noeuds que nous allons voir immédiatement. Si le champ material est nul, aucune lumière n'est prise en compte. Si le champ texture est nul, l'objet n'est pas texturé.
Maintenant que nous avons les formes, nous allons donner une apparence aux objets. Il existe deux manières essentielles de modifier l'apparence d'un objet: définir un «matériau» (couleur de l'objet, manière dont il réfléchi la lumière etc.), et définir une «texture» (image calquée directement sur l'objet).
Définir un matériau.
- Les paramètres sont soit des composantes de couleurs en RVB
comprises entre 0 et 1, soit des coefficients également compris
entre 0 et 1.
- diffuseColor défini la couleur de l'objet, au sens le
plus général du terme. Les lumières de la scène influent sur
l'apparence de l'objet grâce à cette couleur, en fonction de l'angle
de réflection de la lumière sur l'objet.
- ambientIntensity correspond à l'influence de la lumière
ambiente de la scène sur l'objet. La lumière ambiente est aussi
produite par les lumières de la scène, mais ne dépend pas des
diverses réflections (lumière isotropique).
- specularColor défini la couleur des rayons lumineux
réfléchis sur la surface de l'objet et renvoyés vers le point de vue
de l'utilisateur. C'est ce qui sert à produire les reflets localisés
sur des boules métaliques par exemple.
- emmissiveColor défini une couleur propre à l'objet, comme
s'il était luminescent. C'est à dire qu'en l'abscence de
lumière, l'objet emet cette couleur.
- Les champs shininess et transparency ne
nécessitent sans doute pas plus de détail que leur propre nom n'en
donne...
À l'aide du champ ci-dessous,
Définir une texture.
- url contient l'URL d'une image devant servir pour texturer
l'objet.
Ce noeud permet de définir une image pixel par pixel directement dans le code VRML. Le format du champ image est le suivant:
width height size [pixels ...]- width et height spécifient la taille de l'image (en pixels)
À l'aide du champ ci-dessous,

Transformation et positionnement des objets.
Maintenant que nous savons créer des objets et leur donner une apparence particulière, nous allons pouvoir les transformer et les positionner dans la scène.
Les objets précédents peuvent être
manipulés
Ce noeud fait partie de ce qu'on appelle les «noeuds de groupe». Ce sont des noeuds qui ont la propriété de pouvoir contenir d'autres noeuds du langage dans leur paramètres. Ici, le paramètre children contient d'autres noeuds (en particulier des Shape), auxquels les transformations géométriques seront appliquées.
Les transformations géométriques effectuées par ce noeud sont les
suivantes:
- translation déplace l'objet selon les axes X Y et Z.
- rotation (x y z a) tourne de a (en radians) autour du
vecteur (x y z).
- scale (homothétie) modifie l'échelle selon les 3 axes du
repère défini par scaleOrientation (cet axe fonctionne de la
même manière que le paramètre rotation).
À l'aide du champ ci-dessous,
Pour mieux comprendre le noeud
Transform ...
Considérons que les opérations géométriques effectuées se déroulent dans l'ordre suivant:
| Transform { translation T rotation R scaleFactor S scaleOrientation SR center C } |
<==> | - Translation de -C - Rotation de -RS - Homothétie de S - Rotation de RS - Rotation de R - Translation de C - Tranlsation de T |

Lumière !
En général, les viewers s'occupent de mettre une lumière ambiante dans les scènes, et offrent souvent la possibilité de mettre une head light c'est à dire une lampe collée sur votre front ! Il peut parfois être utile de définir soi-même ses propres sources de lumière. Il en existe trois :
Source ponctuelle:
- intensity spécifie l'intensité de la lumière.
- color spécifie sa couleur.
- location spécifie l'endroit où se trouve la source
ponctuelle.
- radius spécifie la distance (en mètres) à l'interieur de
laquelle cette source lumineuse a un effet sur les objets.
- attenuation donne les 3 coéficients d'une équation du
second degré donnant l'atténuation de la lumière en fonction de la
distance à l'objet éclairé.
- ambientIntensity spécifie la quantité de lumière ambiente
générée par cette source.
Projecteur:
- direction donne la direction, ou l'axe du cône.
- cutOffAngle détermine l'angle d'ouverture du cône (à
l'interieur duquel la lumière est émise). Plus on se rapproche des
bords du cône, plus la lumière est atténuée grâce au champ
attenuation.
- beamWidth détermine un cône interieur dans lequel la
lumière n'est pas atténuée (elle ne commencera à l'être qu'après
franchissement de ce sous-cône).
Source directionnelle:
A l'aide du champ ci-dessous:

Animation
VRML 97 permet d'animer les objets de façon plus ou moins complexe:
Les événements
Les horloges
TimeSensor {
exposedField SFTime cycleInterval 1.0
exposedField SFBool enabled TRUE
exposedField SFBool loop FALSE
exposedField SFTime startTime 0.0
exposedField SFTime stopTime 0.0
eventOut SFTime cycleTime
eventOut SFFloat fraction_changed
eventOut SFBool isActive
eventOut SFTime time
}
Le champ cycleInterval détermine la durée d'un
intervalle de temps en secondes (par défaut, 1 seconde). Le
booléen enabled permet d'activer l'horloge tandis que
loop permet de génèrer continuellement des événements
au lieu de s'arrêter au premier intervalle. Les champs
startTime et stopTime permettent de définir les
dates de début et de fin de génération d'événements à partir
du début de la scène. Les événements en sortie sont utilisés
pour créer des animations; en particulier, l'événement
fraction_changed pourra être récupéré par un
interpolateur.
Les interpolateurs
PositionInterpolator {
eventIn SFFloat set_fraction
exposedField MFFloat key []
exposedField MFVec3f keyValue []
eventOut SFVec3f value_changed
}
Le champ key est la liste des instants-clés de
l'animation (ici, un déplacement), et le champ keyValue
est la liste correspondante des valeurs-clés (ici, des
positions). L'événement en entrée set_fraction permet
de récupérer les fractions de temps générées par un
TimeSensor, et l'événement en sortie
value_changed renvoie la valeur-clé ou la valeur
interpolée correspondant à la fraction de temps reçue.
À l'aide du champ ci-dessous:
Les capteurs
À l'aide du champ ci-dessous:

Quelques autres noeuds ...
Voici en vrac un certain nombre d'autres noeuds intéressants. Attention, tous ne sont pas nécessairement supportés par le viewer que vous utilisez ...
Ancres www:
Billboard:
Collisions:
Texte:

Un exemple complet.
Un bon bout de code vaut mieux qu'un long discours ... Voici donc en cadeau une bille de clown, avec presque tous les noeuds qu'on a pu voir dans ce tutoriel. Triturez, déformez, cliquez-lui sur le nez ...