X3D - regroupement et transformations
Cet article est une ébauche à compléter. Une ébauche est une entrée ayant un contenu (très) maigre et qui a donc besoin d'un auteur.
Introduction
Un fichier X3D fonctionne comme un "arbre". Dans ce type de fichier, on retrouve les concepts de noeuds parents et noeuds enfants.
Le regroupement des nœuds organisent des objets dans X3D. Pour cela, il existe plusieurs possibilités:
- Group et StaticGroup: regroupe des noeuds ensemble.
- Transform : c'est probablement le noeud le plus important. Il contrôle la position, l'orientation et l'échelle (scale) des noeuds enfants.
- Inline: ce noeud permet d'importer d'autres objets X3D (scene).
- LOD (level of detail): ce noeud fournit différents niveaux de qualité géométrique selon le point de vue de l'utilisateur (proche ou éloigné).
- Switch: ce noeud peut être utilisé pour changer facilement le contenu d'une scène ou pour cacher certains nœuds
- Anchor: ce noeud permet de d'insérer des liens URL vers une autre scène de X3D ou une autre page dans un navigateur Web. En cliquant sur l'ancre, le contenu est remplacé par un autre contenu.
- Billboard: ce noeud de groupement qui peut contenir plusieurs noeuds. En clair, imaginons un contenu faisant face à un utilisateur. Ce noeud permet de définir un axe autour duquel l'objet fera des rotations.
- Collision: Le nœud de collision est un nœud de regroupement qui spécifie les propriétés de détection de collision pour les noeuds enfants. Les noeuds de collision peuvent être utilisés pour générer des événements lorsque le spectateur et les objets entrent en collision. Ils peuvent aussi être utilisés pour désigner que certains objets ne doivent pas être considérés comme étant soumis à la détection de collision.
Regroupement (grouping)
Le noeud Group recueille les noeuds ayant un but connexe. Souvent, ces nœuds sont proches les uns des autres dans l'espace 3D.
Si un DEF (DEF defini un ID unique pour le noeud), le groupe de noeuds peut être réutilisés. (voir en:X3D shape and geometry).
Ci dessous, voici un exemple de scène faite avec seulement 3 formes. Nous définissons une maison avec un cube et le cylindre que nous réutilisons deux fois.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.2//EN" "../../schemas/x3d-3.2.dtd">
<X3D profile='Interchange' version='3.1' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='http://www.web3d.org/specifications/x3d-3.1.xsd'>
<head>
<meta content='house.x3d' name='title'/>
<meta content='Example for Group node' name='description'/>
</head>
<Scene>
<!-- Creation d'un fond blanc pour l'impression -->
<Background skyColor='0.9 0.9 0.9'/>
<!-- Definir une maison: un cube avec un cône sur le dessus -->
<Group DEF='House'>
<Transform translation="0 1 0">
<Shape>
<Appearance>
<Material diffuseColor='1 1 0'/>
</Appearance>
<Box/>
</Shape>
</Transform>
<Transform translation="0 2.5 0">
<Shape DEF='Roof'>
<Appearance>
<Material diffuseColor='1 0 0'/>
</Appearance>
<Cone bottomRadius="2" height="1">
</Cone>
</Shape>
</Transform>
</Group>
<!-- Réutilisation: réduction de la forme et positionnement sur le dessus de la maison -->
<Transform translation="0 2.5 0" scale="0.5 0.5 0.5">
<Shape USE="House"/>
</Transform>
<!-- Réutilisation : compresser la forme et la mettre à côté -->
<Transform translation="3.5 0 0" scale="1.0 0.5 0.5">
<Shape USE="House"/>
</Transform>
<Inline Center="0.0 0.0 0.0" bboxSize="10.5 10.5 10.5" url="../common/coordinates.x3d"/>
<Transform translation="0 -0.05 0">
<Shape DEF="floor">
<Appearance>
<Material diffuseColor='0 1 0'/>
</Appearance>
<Cylinder height="0.1" radius="5"/>
</Shape>
</Transform>
<Inline url='"../common/coordinates.x3d" "http://tecfa.unige.ch/guides/x3d/ex/common/coordinates.x3d"'/>
</Scene>
</X3D>
Transformations (Transform)
Le noeud Transform est un noeud de regroupement qui permet de définir les coordonnées (axe X, Y, Z) des noeuds enfants. En clair, ce noeud offre la possibilité de faire des translations, des rotations et des mises à l'échelle.
La racine d'une scène graphique ainsi que toutes les formes que vous créez dans X3D se réfèrent X3D est toujours aux coordonnées (0 0 0). Gràce au noeud Transform , vous pouvez transférer le système de coordonnées d'origine vers un autre système de coordonnées que vous définissez.
- Exemple: si vous souhaitez créer deux cubes l'un à côté de l'autre avec la Shape Box, l'un des deux cubes devra être défini à l'intérieur d'une balise Transform.
Dans X3dom documentation, on peut lire :
- La balise center défini le décalage par rapport au système de coordonnées initial (0,0,0)
- La balise Rotation défini la rotation du système de coordonnées
- La balise Scale spécifie l'échelle du système de coordonnées. Les valeurs de l'échelle peuvent être positive, négative ou égale à zéro (la valeur zéro indique que toute la géométrie du noeud enfant ne doit pas être affiché).
- La balise Scale orientation spécifie la rotation du système de coordonnées avant de procéder au redimensionnement. L'orientation ne s'applique qu'à l'échelle définie.
Ainsi, la balise Transform peut positionner, faire tourner autour d'un axe et redimensionner la taille du/des oibjet(s)(scale) quelconque et de l'échelle. C'est probablement le noeud le plus couramment utilisé pour la mise en page d'une scène 3D.
Voyons maintenant quelques transformations
Translations
Pour comprendre comment fonctionne les translations, il faut comprendre le système des coordonnées expliqué notamment dans en:X3D graphics principles.
Translation = 'x y z'
- Les translations sont en mètres depuis l'origine du système de coordonnées (0 0 0)
- Attention : Si X3D-edit reconnaît le placement d'une forme 2D sur l'axe z dans la scène, le navigateur ne le reconnaîtra pas et n'affichera pas la forme 2D, il faut ainsi passer par son homologue 3D et l’aplatir au mieux possible (valeur de z=0.01 par exemple)
Rotations
Les rotations sont plus difficiles à comprendre que les translations car il est possible de définir un axe de rotation arbitraire.
Rotation = 'angle x y z'
- x y z détermine l'axe de rotation, l'angle détermine la valeur de la rotation en radians (ie 180 degrees = Pi)
La tableau ci-dessous montre la conversion en radians de quelques valeurs (en degrés):
30: | 0.5236 |
60: | 1.0472 |
90: | 1.5708 |
180: | 3.1416 |
270: | 4.7124 |
Pour faciliter vos conversions, utilisez notre
Pour obtenir la rotation que vous souhaitez, nous vous suggérons de faire pivoter un objet seulement autour de l'axe principal (le cas échéant un axe après l'autre) et donc utiliser le code comme par Don Brutzman dans ses diapositives:
<Transform rotation='0 1 0 yaw'>
<Transform rotation='0 0 1 pitch'>
<Transform rotation='1 0 0 roll'>
<!-- Shape (le long de l'axe X et Y) -->
</Transform>
</Transform>
</Transform>
Yaw, Pitch et Rool sont les noms d'angles; ces noms ont été empruntés à la navigation à la voile.
La direction de la rotation utilise la règle de la main droite comme cela est expliqué dans la page en:X3D graphics principles.
Rappelez vous juste que vous pouvez imaginer la rotation autour de l'axe avec votre main droite.
Redimensionnement (scaling)
Scale = 'x y z'
- (potentiellement non-uniforme). Scale change la taille de l'objet pour le rendre plus petit ou plus grand.
scaleOrientation = 'x y z angle'
- La rotation est appliqué prioritairement au redimensionnement.
Ordre d'exécution
L'ordre d'exécution dans un noeud élémentaire Transform :
- (éventuellement) une mise à l'échelle non-uniforme autour d'un point ;
- une rotation autour d'un point autour d'un axe;
- une translation
Comprendre l'ordre dans lequel s’opèrent les transformations complexes n'est pas facile. Par conséquent, le résultat est vraiment différent si vous faites d'abord une translation, ensuite une rotation dans l'un ou l'autre sens.
Pour parvenir à réaliser vos transformations, vous devez vous rappeler du principe suivant : Utilisez des noeuds Transform imbriqués et rappelez-vous que la première transformation est le noeud le plus profond (le dernier enfant si on part de la racine).
La documentation X3D utilise le parallèle avec VRML pour expliquer l'ordre dans lequel se produise les transformations :
- Étant donné un point en 3 dimensions P et un noeud Transform. P se transforme en point P' dans le système de coordonnées de son noeud parent par une série de transformations intermédiaires.
Ainsi, dans la notation de transformation où C (centre), SR (Orientation de l'échelle), T (traduction), R (rotation), et S (échelle) sont les matrices de transformation équivalentes, on obtient P
P' = T * C * R * SR * S * -SR * -C * P
Ainsi, le noeud Transform suivant
Transform { center C rotation R scale S scaleOrientation SR translation T children [ # Point P (or children holding other geometry) ] }
Est équivalent à la séquence suivante:
Transform { translation T children Transform { translation C children Transform { rotation R children Transform { rotation SR children Transform { scale S children Transform { rotation -SR children Transform { translation -C children [ # Point P (or children holding other geometry) ] }}}}}}}
Insérer d'autres scènes 3D (inline)
Le noeud Inline permet d'ajouter une scène 3D dans la scène actuelle.
Les formats pris en charge dépendent du navigateur X3D de l'utilisateur: XML encodé .x3d, VRML classique encodé .x3dv, binaire compressé encodé .x3db , parfois VRML97 .wrl.
- Les scènes inline doivent être positionnées, tournés (rotation) et mise à l'échelle pour correspondre aux coordonnées du système dans lesquelles elles sont importées.
- Le cadre de référence local est déterminé par les transformations des noeuds parents c'est à dire l'endroit où ils sont téléchargés.
- Le point de vue de l'utilisateur ne change pas automatiquement en fonction du point de vue de la scène 3D.
Le noeud Inline peut prendre les champs suivants (et quelques autres). Bien sûr, l'attribut URL est obligatoire mais tous les autres champs sont facultatifs.
url 'liste d'URLs'
- Une ou plusieurs URL qui rediirige vers le même objet dans un ou plusieurs endroits. Chaque URL est récupérée et évaluée dans l'ordre jusqu'à ce que le fichier Inline désiré soit récupéré avec succès. Les adresses relatives fonctionnent aussi bien sur localhost que sur serveur. Cependant, les adresses absolues fournissent une sauvegarde fiable.
bboxCenter "0 0 0"
- Modification de la bounding box = décalage par rapport à l'origine du système de coordonnées local.
bboxSize "-1 -1 -1 la taille de la bounding box est calculé automatiquement, mais elle peut être spécifiée comme ici.
Exemple (modèle):
<!-- position -->
<Transform translation='x y z'>
<!-- rotation around one more more axes -->
<Transform rotation='x y z radian'>
<!-- Scale ->
<Transform scale='facteurx facteury facteurz'>
<!-- attention: URLs are for the same content) -->
<inline url= ' "URL1", "URL2", ..../>
</Transform>
</Transform>
</Transform>
Example:
source lang="xml">
<Transform translation='10 10 0'>
<Transform rotation='1 0 0 1.5'>
<Transform scale='0.01 0.01 0.01'>
<inline url= ' "mon_objt.x3d" '/>
</Transform>
</Transform>
</Transform>
Exemple
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.1//EN" "http://www.web3d.org/specifications/x3d-3.1.dtd">
<X3D profile="Immersive" version="3.1" xsd:noNamespaceSchemaLocation="http://www.web3d.org/specifications/x3d-3.1.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance">
<head>
<meta content="buste_albert_einstein-dks.x3d" name="title"/>
<meta content="Generated from Meshlab X3D Exported" name="description"/>
<meta content="6 April 2016" name="created"/>
<meta content="Meshlab X3D Exported, http://meshlab.sourceforge.net" name="generator"/>
</head>
<Scene>
<!-- Reposition -->
<Transform translation = '0 -10 -30'>
<!-- 90 deg rotation around the y-axis (up/down) -->
<Transform rotation = '0 1 0 1.5708'>
<!-- -90 deg rotation around the x-axis -->
<Transform rotation = '1 0 0 -1.5708'>
<Inline url='"buste_albert_einstein-dks-couleur.x3d"'/>
</Transform>
</Transform>
</Transform>
</Scene>
</X3D>