Voici une création vidéo que j’ai faite pour le festival grenoblois DNA qui a eu lieu en mai 2018. J’ai réalisé cela grâce à un programme fait avec Processing, dans lequel j’utilise le bruit Perlin pour guider le mouvement de milliers de particules.
Les particules sont placées à l’instant initial sur une forme triangulaire qui représente le A du logo DNA.
Explications approfondies du programme
Le mouvement
Les particules sont des objets qui possèdent une masse, un vecteur position, un vecteur vitesse et un vecteur accélération. Grâce à la discrétisation de la deuxième loi de Newton, on peut calculer à chaque instant la position de chaque particule en fonction des forces qui leur sont appliquées :
// 2e loi de Newton : m*a = ∑F acceleration = PVector.mult(sumForces, 1/masse); // Intégration discrétisée : a(t+dt) = (v(t+dt)-v(t))/dt velocity.add(acceleration); // On en déduit la position de la même manière position.add(velocity);
On a ainsi un modèle physique qui régit le déplacement des particules. On dit que leurs mouvements sont contrôlés en accélération.
En ce qui concerne les forces appliquées, celles-ci se présentent comme un champ de force. L’espace 2D est divisé en quadrillage et dans chaque case, une force est calculée. Voici une représentation des vecteurs forces d’un champ de force bruité :
Pour obtenir un tel champ de force, on utilise la fonction noise() . Elle permet d’obtenir des valeurs aléatoires, mais continues.
Ainsi, on peut calculer l’accélération de chaque particules en fonction de leur position, selon le champ de force créé, et en déduire leurs positions à l’instant suivant. Le mouvement dans cette vidéo est généré de cette manière.
Le rendu
En ce qui concerne la façon de représenter les particules pour obtenir ce genre de tracé, là encore, ce n’est pas sorcier. Chaque particule est représentée par un petit point dont l’alpha est faible (elles sont presque transparentes). On discerne en fait de la couleur lorsqu’elles s’accumulent au même endroit.
Par ailleurs, elles laissent une trace derrière elles qui s’effacent peu à peu : pour cela, chaque image est générée avec une transparence qui laisse apparaître les quelques images précédentes.
Enfin, un blendmode soustractif est utilisé pour obtenir des couleurs plus sombres lorsqu’un grand nombre de particules s’accumulent au même endroit.
PVector position = new PVector();
float alpha = 0.1;
int color = 0;
int r = 1;
float sustain = 50;
void setup(){
size(500,500, P2D);
blendMode(SUBTRACT);
noStroke();
fill(color, alpha);
}
void draw(){
background(255, sustain);
position.x = random(width);
position.y = random(height);
ellipse(position.x,position.y,r,r);
}