Les tortues amicales

Formes collectives qui émergent de comportements individuels.
28 avril 2018

L’animation ci-dessus est inspirée des idées derrières Heroes and Cowards, un modèle à base d’agents créé par William Rand et Uri Wilensky, mais il s’agit d’une altération tout de même très distante de ce modèle. Le code écrit pour réaliser cette animation est contenu dans la branche second-version de l’arborescence Git du projet, qui se trouve sur GitHub.

Les principes de l’animation sont simples : chaque point noir représente une tortue qui peut recevoir des instructions et qui possède aussi un certain comportement. Lorsque l’animation démarre, chacune des tortues est associée à deux amies (deux autres points parmi le groupe). Ensuite, entre chaque nouvelle image de l’animation, chacune des tortues s’approche très légèrement du point équidistant entre ses deux amies.

Les tortues ont donc toutes un comportement individuel identique, mais puisque la position initiale de chacune d’elles est différente, il en résulte un comportement de groupe complexe : l’ensemble des tortues cherche à ne former qu’une seule boucle. Lorsqu’une nouvelle spirale est ajoutée, elle est « mise en contact » avec les autres tortues et se mêle rapidement au tracé général.

Une variation

L’animation ci-dessous est construite avec la même mécanique, mais les tortues sont maintenant représentées par de petites taches d’encre de Chine que j’ai numérisées. Le code de cette animation se trouve dans la branche master de l’arborescence du projet. De plus, l’apparition des tortues est ici contrôlée à la main, par des gestes faits avec la souris de mon ordinateur.

Feuilles d’animation

Ces courtes animations m’offrent aussi une opportunité de réfléchir un peu aux feuilles d’animation (en anglais, exposure sheets ou x-sheets), un outil qui a une grande importance dans le domaine de l’animation traditionnelle mais qui, à ma connaissance, est rarement transposé en cinéma algorithmique.

Il arrive souvent, lors de la création d’une animation algorithmique, que l’on veuille ajouter un évènement précis à un moment précis (donc, intervenir dans le processus de l’animation en cours). Il est très simple de réaliser ceci avec une expression conditionnelle :

if (frameCount == 200) { intervene(); }

Cependant, une accumulation de telles expressions conditionnelles devient rapidement désagréable et difficile à gérer, et il est intéressant de réfléchir à de potentielles alternatives à cette méthode. Le modèle ci-dessous, appelé eventSheet, est un exemple qui pourrait servir dans plusieurs situations.

let eventSheet = {
    10: function(){
        console.log("Ten frames!");
    },
    20: function(){
        console.log("Twenty frames!");
    },
    run: function(f) {
        if (this[f]) {
            this[f]();
        }
    }
};

function draw() {
    eventSheet.run(frameCount);    
}

Cette construction est plutôt rigide ; il pourrait être intéressant de pouvoir altérer la durée des scènes d’une façon plus fluide. Ci-dessous, j’ai écrit un autre brouillon d’eventSheet un peu bizarre.

let eventSheet = {
    slowScene: {
        t: () => 10, 
        f: function(){
            console.log("Ten frames!");
        },
    },
    fastScene: {
        t: () => eventSheet.slowScene.t() + 10,
        f: function(){
            console.log("Twenty frames!");
        },
    }
    // run: function(f) {
    //     if (this[f]) {
    //         this[f]();
    //     }
    // }
};

Il pourrait aussi être intéressant de définir une eventSheet de façon à ce qu’elle puisse être elle-même générée algorithmiquement. Je pourrais créer algorithmiquement des séquences d’évènements et ensuite, sélectionner les plus intéressantes séquences et les sauvegarder dans des fichiers json. Une feuille d’animation pourrait même être imaginée comme étant un génotype qui peut avoir des mutations et des croisements.

Notes éparses

Serait-il possible de faire apparaître les nouvelles spirales de façon progressive ? En apparaissant de façon progressive, peut-être se déformeraient-elles suffisamment en chemin pour ne jamais ressembler à des spirales. Ou peut-être que pendant son apparition, une nouvelle spirale pourrait être déconnectée du reste des tortues. Pourrais-je imaginer différents groupes de tortues entre lesquels les « amitiés » seraient impossibles ?

Dans son cours « Construire vers une question. » Introduction à la modélisation à base d’agents, William Rand explique qu’il est important, dès la conception d’un modèle, de chercher à « construire vers une question », c’est-à-dire qu’un modèle doit répondre à une question précise (il s’agit, après tout, d’un outil scientifique). Évidemment, ce point est difficile à considérer lors de la création de modèles à buts artistiques — il peut sembler ici qu’on ne construit pas vers des questions, mais je crois que c’est une impression fausse. Les questions sont simplement différentes, et peut-être plus floues.

Par exemple, si je veux enchaîner différentes scènes animées semblables à certains égards à celles ci-dessus afin de créer un court film d’animation, je peux me demander : « Quels types de comportements pourraient générer des “danses géométriques” de diverses natures mais dont l’ensemble aurait une cohérence ? » Ou : « Comment la couleur pourrait-elle être intégrée dans ce type de danse ? Des tortues de couleurs différentes auraient-elles des mouvements différents ? Si oui, quelles pourraient être ces différences et quelles conséquences auraient-elles sur les animations obtenues ? Les tortues pourraient-elles changer de couleur ? »

En regardant ces animations, Considérations
sonores.
j’ai aussi envie d’en créer de nouvelles versions qui répondraient au son. Par exemple, divers moments d’une pièce de musique pourraient faire apparaître de nouvelles tortues, et la hauteur et la vélocité des notes jouées pourraient déterminer certaines propriétés des nouvelles tortues.

Contexte

Cette note de blog fait partie de mon projet de recherche Vers un cinéma algorithmique, démarré en avril 2018. Je vous invite à consulter la toute première note du projet pour en apprendre davantage.