Du code au réel — Week Final : La dernière ligne droite

Vincent Largillet
5 min readFeb 27, 2022

--

Dernier article avant d’attaquer le récapitulatif de tout ce projet et enfin, le tutoriel.

Février est passé une vitesse de folie, tellement que je n’ai même pas eu l’impression de voir arriver le dernier créneau où je devais finir ma projection.

2 jours avant ce jeudi 24 février, je n’avais toujours pas trouvé la solution pour faire s’attirer les planètes entre elles (ou bien chaque test n’était pas concluant, les galaxies ne bougeaient pas, j’avais des erreurs d’objets, bref, un enfer). En plus de ça, je n’avais pas calculé une chose : la représentation de la fusion des galaxies. J’étais parti d’un gif magnifique quand j’ai eu cette idée, sans me poser une seule fois la question de la faisabilité. (Spoiler : je n’ai pas réussi ce point, tout du moins, pas complètement.)

— Amélioration de la visualisation

Le point principal de la projection était : deux galaxies qui s’attirent l’une l’autre, entre en collision pour au final formé une galaxie au centre de l’écran.

La première amélioration par rapport au script était de créer un objet galaxie, qui allait gérer les étoiles ainsi que tous les paramètres, aléatoire pour avoir un effet de deux galaxies bien distinctes.

Le code était donc le suivant :

La variable `noOfGalaxies` était égale à 2, pour aller plus vite, j’ai placé de manière précise les galaxies, en utilisant la hauteur et largeur de l’écran.

Ensuite, on a un nombre d’étoiles (donc d’ellipse, d’axe de rotation sur lequel allait se placer l’étoile) qui est choisi aléatoirement entre 2 000 et 4 000, avec un écart entre chaque ellipse, aussi déterminé de manière aléatoire.

La variable `negOrPos` allait définir le sens de rotation de la galaxie (horaire ou antihoraire)

Enfin, la variable rng (aléatoire) était un nombre entre 1 et 2.5, qu’on allait multiplier à notre formule du rotationGradient, qui gère la spirale et l’apparence des bras de notre galaxie.

Et grâce à ça, on obtient donc deux belles galaxies, qui peuvent avoir des similarités, mais qui seront quasiment toujours différentes.

Exemple de deux galaxies générées aléatoirement par le programme

— Dernière danse

Jeudi 24 février, 10 h. Je me pose dans la salle showroom, je récupère tout le matos et là, illumination.

Je test quelque chose et les galaxies se déplacent. Elles sont sensées s’attirer, mais au lieu de ça, elles partent dans une direction assez similaire.

Après avoir joué pendant 40 minutes sur le souci de direction, j’arrive à le résoudre, mais elle ne s’attire pas exactement comme je le souhaiterais. Elles prennent de l’accélération avec la formule d’attraction gravitationnelle, et finissent, inévitablement, par sortir de l’écran à un moment ou un autre, et ne plus jamais y revenir. Or, le but est qu’elles entrent en contact et finissent par se réunir au centre de l’écran.

C’est là que je repense à une fonction que j’avais utilisée dans les tout premiers tutos de The Nature of Code : la fonction `constrain`, qui va permet de contraindre une valeur à rester dans une intervalle précise.

Il fallait donc qu’on parte de la taille complète de l’écran, et réduire petit à petit ; pas trop vite pour par créer des effets de saccades ou d’arrêts complets comme si la galaxie rencontrait un mur, mais trop lent pour pas que la projection dure 15 minutes.

Ma solution a donc été d’utiliser le code qu’on peut retrouver dans The Nature of Code pour l’attraction gravitationnel, en modifiant les paramètres de la fonction `constrain` et en diminuant la force en fonction du nombre d’étoiles pour ralentir l’attraction.

Ensuite, lors de la mise à jour de la position des galaxies, après 2 secondes, et si les bordures étaient plus petites que le centre de l’écran, je faisais progresser les bordures avec un pourcentage de la hauteur et de la largeur.

— La projection

Maintenant que tout était réglé, je passais au vidéo mapping. J’ai fait le mapping avec le logiciel HeavyM, très simple de prise en main. Je suis resté sur la version gratuite, donc sur la projection, on se retrouve avec un watermark qui s’affiche régulièrement.

Le résultat de la projection avec quelques paramètres changé dans le vidéo-projecteur étaient un peu différent des croquis que j’avais fait. En bas, on avait une impression de plat (aucune déformation) alors qu’en haut, on avait la déformation que j’ai illustrée dans l’article précédent.

Pour compenser la déformation, j’ai donc fait en sorte de faire l’inverse de ce qui était projeté, en créant donc ces formes sur HeavyM.

Résultat final accessible ici : https://www.youtube.com/watch?v=Bniu5GcXGnM

(qualité vidéo discutable, je n’avais pas vu les réglages et ai un peu rush pour essayer au moins d’avoir quelque chose de filmé)

— Ressenti final

Je suis très content de ce que j’ai réussi à produire, bien que je sois assez loin de ce que j’avais prévu initialement (la musique n’a pas été composé sur-mesure, mais c’est une musique du label Erased Tapes, il n’y avait pas de LED).

J’ai quand même ressenti une grande fierté au moment de projeté avec la musique par-dessus, et recevoir des avis positifs de la part d’enseignants présents sur place était vraiment sentiment incroyable.

Le prochain article sera l’avant-dernier, sur le récapitulatif de l’expérience.

Cliquer ici pour passer au prochain article.

--

--

Vincent Largillet

Writing about my journey learning creative development (in French) Student at Gobelins - Front developer at My Little Paris