Les tentacules de la grammaire

Les tentacules de la grammaire

Après avoir imaginé des paysages fantastiques avec Bryce, exploré des fractales tridimensionnelles au sein du Mandelbulb et sculpté un temple égyptien (celui d’Hatchepsout, Môssieur) dans MagicaVoxel, je m’attaque au dessin spéculatif avec Structure Synth.

Ce petit logiciel gratuit propose une manière originale de dessiner : pas de souris, pas d’interface graphique en dehors de la fenêtre dans laquelle on visualise le fruit de ses cogitations, tout est codé. A charge pour le néophyte d’ingurgiter la syntaxe du langage proposé, dénommé EisenScript.  

Découvrons-le en dessinant une méduse (ou une pieuvre, ça dépendra du nombre de tentacules).

Tout d’abord, Structure Synth permet de dessiner des formes simples, qu’on peut appeler primitives : « box » dessine un cube plein, « sphere » une… sphère. La liste complète est très courte, on la trouve sur l’onglet LEARN du site.

EisenScript permet très simplement de dessiner la forme choisie en lui attribuant une taille et une couleur.

Pour dessiner la tête de la méduse, on écrira

{ s 2 color random } sphere   

EisenScript comprend qu’il faut dessiner une sphère (attention sans accent, c’est de l’anglais) de taille 2 (s pour size, deux unités) et d’une couleur aléatoire (color random, ça ne s’invente pas). Attention il faut écrire « s 2 » avec un espace entre la transformation et sa valeur et non « s2 » sous peine d’essuyer un refus obstiné du débogueur qui surlignera en jaune la ligne fautive. On ne badine pas avec la grammaire chez EisenScript.  

Pour éviter d’avoir un monstre bariolé (il fera déjà assez peur comme ça) on prend la précaution de définir une liste limitée des teintes espérées. On écrit :

set colorpool list:#A3F9D2,#53D576,#A4BAF1

Alors là, je vous voir venir, trop c’est trop, EisenScript c’est pire que du chinois, j’abandonne. Pas de panique, la seule chose à savoir c’est qu’il faut écrire un « # » pour signaler à l’intelligence artificielle dans la machine qu’il s’agit d’une couleur. Le code, on le trouve le plus simplement du monde en baladant sa souris sur la teinte choisie grâce au site htmlcolorcodes.com. Elle-est-pas-belle la vie ?

Avant de dessiner les tentacules, on va définir une variable qui en précisera le nombre (donc très facile de le modifier ensuite) et qu’on appellera « NbrePodes » (mais oui, vous pouvez l’appeler « Nombre_de_bras » si ça vous chante, promis). On écrit donc à la ligne suivante

#define NbrePodes 8 

Vous l’avez compris on aura une pieuvre (si on choisit 8 bien sûr) 😊.

Maintenant, on va dessiner les tentacules. Pour cela, la primitive de base sera un cube, qu’on va malaxer dans tous les sens. L’originalité (géniale !) d’EisenScript, c’est qu’une seule ligne de code permet de donner l’ordre de dessiner une suite de cubes qui seront chacun plus petit que le précédent, d’une couleur aléatoire (toujours piochée dans le panier initial), et victime d’une rotation qui va donner son arrondi au tentacule. Cet ensemble de transformations (taille, couleur, rotation) s’appelle une règle (rule), qui commence et se finit toujours par une accolade et dont le nom commence par une lettre et pas un chiffre. Sa propriété remarquable est qu’elle peut s’appeler elle-même (on parle de récursivité). On écrira :

Rule R1 {
{ x 0.9  s 0.95 rx 15 ry 15 color random }  R1   box
}

Cette règle R1 va enfiler des cubes décalés de 0,9 unités sur l’axe des x (horizontal) par rapport au précédent, dont ils font 95% de la taille (s 0.95), chaque cube tournant (r pour rotation) de 15 degrés par rapport à l’axe des x (rx) et des y (ry). La couleur sera là encore aléatoire (color random) parmi les trois qu’on a prédéfinies. La transformation complète est elle-même entre accolades, la règle R1 s’appelle elle-même pour dessiner la primitive suivante, et « box » précise que c’est un cube.

Si on s’arrêtait là, Structure Synth ne dessinerait qu’un seul tentacule tirebouchonné, tout rigide et ridicule, chaque cube effectuant par rapport au précédent une rotation identique.

L’astuce (on dira toute la subtilité de la syntaxe), c’est de décrire une seconde procédure R1. J’ai bien dit R1 les amis, pas R2.

Oui, mais pourquoi ?

Si on a deux procédures R1, à chaque boucle, Structure Synth décidera à d’emprunter aléatoirement l’un ou l’autre des chemins proposés. L’astuce, donc, c’est d’écrire la règle suivante :

Rule R1 {
{ x 0.9  s 0.95 rx 15 ry -15 color random }  R1   box
 }

On voit que cette fois, le cube tournera de 15 degrés dans l’autre sens (rx -15, attention, jamais d’espace entre le signe moins et le chiffre !).

C’est l’ensemble des deux procédures R1 qui va dérouler aléatoirement les rotations des éléments des tentacules et leur donner la belle souplesse qu’on leur connait. Vous remarquerez que la sphère a changé de couleur, c’est bien le moins puisqu’on l’a définie par la commande « color random ».

Il ne reste plus qu’à appeler la procédure R1 le nombre de fois qu’on veut de tentacules. Mais attention, on ne pourra pas écrire « 8 * R1 ». Ça ne marche pas et le débogueur vous renverra dans vos buts (j’y ai passé du temps à aller rechercher le ballon). Il faut écrire

8 * {} R1

Pour dessiner notre pieuvre. EisenScript demande ces parenthèses vides (on pourra toujours y mettre d’autres commandes si besoin) pour appeler 8 fois la (les) règle(s) R1. Vous noterez la grammaire minimaliste puisque le nombre de fois est symbolisé par le signe multiplier du clavier (*).

Pour faire encore plus joli, on définira une couleur de fond pour l’image, un beau bleu des mers du Sud (cette fois vous ne convulsez pas) :

set background #A3DDF9

Mais un peu d’ambition que diable ! On pourra dessiner toutes les méduses de la création si on se rappelle notre petite variable NombrePodes définie plus haut. Ça s’écrit alors :

NbrePodes * { } R1

Si vous fixez NbrePodes = 1 (#define NbrePodes 1 pour ceux qui n’ont pas suivi), ben vous aurez quand même un spermatozoïde. Comme quoi l’évolution ne s’est pas beaucoup cassé la tête. 

Mis bout-à-bout ça donne ceci :

set background #A3DDF9
set colorpool list:#A3F9D2,#53D576,#A4BAF1
#define NbrePodes 8
 

            // tête de la méduse :

{ s 2  color random } sphere  // couleur aléatoire piochée dans la liste

NbrePodes * { }  R1

Rule R1  {
{ x 0.9  s 0.95 rx 15 ry 15 color random }  R1   box
}

Rule R1  {
{ x 1  s 0.95 rx 15 ry -15 color random }  R1   box
}

Voilà, vous en savez autant que moi, ou presque.

Enjoy.

Share Button