Atelier : Créer des mondes complexes avec un script

Nous allons apprendre ici à utiliser la fonction javascript CreateVrmlFromString, qui va nous permettre de créer une grande quantité d'objets divers et variés avec seulement quelques lignes de codes. Cette technique, pas très compliquée mais très puissante, se trouve bien illustrée dans le monde VRML City, présentant une ville entière dans un fichier de 3 Ko seulement.

Nota : la technique employée fonctionne avec les plugins Contact, Cortona et CosmoPlayer, ce qui malheureusement est souvent difficile à atteindre lorsque l'on utilise du script en VRML.

 

Étape 1 : Créer une boite en VRML

Vous savez créer une boite en VRML ? Et bien allons y... Un nœud Shape pour la boite, dans un nœud Transform pour la positionner, et le tour est joué.

voir source
voir résultat

 

Étape 2 : Créer une boite en Javascript

Nous allons essayer de faire la même boite, mais en utilisant un script. Ce script utilise la fonction CreateVrmlFromString, qui permet comme son nom l'indique de créer du VRML à partir de texte.

Nous plaçons d'abord dans notre monde un nœud Transform que nous appelons ROOT, par exemple. C'est lui qui contiendra tout ce que nous allons créer par script.

Pour notre script, nous n'allons pas créer de nouvelle fonction, mais utiliser la fonction initialize(), qui est une fonction automatique de vrmlscript, et qui se lance à chaque chargement de la scène.

La première partie du script consiste à définir la chaîne de texte. On la crée en concaténant (=additionnant) plusieurs chaînes sur plusieurs lignes, pour garder la lisibilité du code VRML d'origine. Mais on pourrait très bien stocker cette chaîne sur une seule longue ligne. La chaîne finale reprend exactement le code VRML utilisé lors de l'étape 1 pour créer la boîte.

Enfin, la fonction CreateVrmlFromString permet de créer un nœud VRML, que l'on va ensuite définir comme enfant du nœud principal ROOT.

voir source
voir résultat

 

Étape 3 : Introduire du hasard

Pour rompre la monotonie, nous allons maintenant introduire une dose de hasard dans notre code. Nous créons une fonction R(), utilisant la fonction javascript Math.random(). Elle renvoie une valeur quelconque entre 0 et 1. Puis nous utilisons cette fonction R() pour "aléatoiriser" (hum!) la taille, la position et la couleur de notre boite dans la chaîne de texte. Ce code va créer une boîte dont la longueur et la largeur vont varier entre 0 et 20 m ( 20 x R() ), la hauteur entre 0 et 40 m  ( 40 x R() ), et la positon sera au hasard sur un champ de 100 m x 100 m ( 100 x R() ).

Ce script crée toujours une boite à chaque chargement de la scène, mais celle-ci est différente à chaque fois.

voir source
voir résultat

 

Étape 4 : Multiplier les petites boîtes

A l'aide d'une boucle for... en javascript, nous allons répéter la création de cette boite aléatoire une trentaine de fois.

voir source
voir résultat

 

Étape 5 : Et voilà !

Quelques finitions : une grande dalle transparente, un ciel, des lumières... et en avant pour la Venise Intergalactique !

voir source
voir résultat

 

Exercice : des astéroïdes

Vous allez appliquer le même principe pour consteller d'astéroïdes le ciel de notre Venise Intergalactique. Vous allez donc procéder exactement de la même manière, mais avec :
- des sphères
- au nombre de 100
- de diamètre variant entre 0 et 0.5 m
- dans un champ de 100 m x 100 m
- à une altitude comprise entre 0 et 30 m

Attention : il y a un petit piège ! Vous allez refaire une 2ème boucle for... Il faudra aller de i=30 à i<130, car si on va de i=0 à i<100, les 30 premiers astéroïdes remplacent les 30 immeubles de la boucle précédente.

voir source
voir résultat

 

A vous de jouer !

Vous pouvez utiliser ce principe pour créer toutes sortes d'objets avec du code : des boites, des cylindres, des sphères, des Inlines, qui seront dans votre monde des bâtiments, des arbres, des étoiles... Je vous laisse imaginer les nombreuses possibilités de cette technique.

Vous pouvez pousser plus loin, en fabriquant de la sorte des objets mobiles, pouvant figurer des véhicules, des oiseaux, de la neige. Il faut pour cela utiliser en plus la fonction addRoute.

Attention :  telle qu'elle est utilisée ici, cette technique produit des mondes différents à chaque chargement de la scène. Pour des mondes partagés, cela pourrait avoir avoir pour effet que chaque personne le visitant, même simultanément, verrait un monde différent. A vous de voir si cela convient ou non suivant les cas : cela peut vous gêner que plusieurs visiteurs ne voient pas les mêmes bâtiments au même endroit, alors que cela ne gênera pas pour des flocons de neige ou des oiseaux dans le ciel...

 

Quelques liens

Si cette technique vous intéresse, voici quelques liens essentiels :
(malheureusement tout en anglais !)
- Dynamically Creating VRML par Sandy Ressler
- Random Keys and Keyvalues par Matthew Lewis
- 3D VRML Lab par Evgeny Demidov

 

Vincent Gardet

 
19 internaute(s) sur Web3d-fr
Copyright Web3d-fr 2001-2004