logo

 

  1. Presentation
  2. Starfield (Todo)
  3. Metaballs 2D
  4. Tunnel (Todo)
  5. Plasma (Todo)
  6. Stretch (Todo)
  7. Transformations 3D
  8. Rotozoom (Todo)
  9. Twister bars
  10. Checkerboard

Metaballs 2D

Todo: Beaucoup.
Exemples: ?

Voir code de la page en attendant.

Plusieurs façons de générer le blob (bitmap de base). Avec x et y allant de -1 à 1, sqrt = racine carrée:

  • En prenant la distance normalisée à partir du centre (Pythagore): v = sqrt(x² + y²) / sqrt(2)
    Ceci formera une sorte de cône (pente presque linéaire).
    A noter que le centre aura la plus petite valeur, il est peut être préférable d'avoir l'inverse.
  • En prenant le cosinus de la distance normalisée: v = cos(sqrt(x² + y²) / sqrt(2) * pi)
    Ceci formera une bosse (pente arrondie).

Plots Wolfram pour la distance, l'inverse de la distance, et cos (toutes les échelles sont les mêmes, cos n'est pas plus "haut"):

Metaball Sqrt plot Metaball Inverse sqrt plot Metaball Cos() plot

Ce bitmap de "hauteurs" précalculé ou généré en RAM sert de "pinceau" qui va permettre de former des "montagnes". Si vous avez déjà joué a SimCity, pensez au curseur qui permet d'éditer le terrain.

Tout se passe toujours en 2D, avec la valeur de chaque pixel indiquant la "hauteur" du "terrain".
Tous ces guillemets sont la pour indiquer comment j'aime imaginer la méthode.

Chaque "ball" de l'effet n'est en fait que des coordonnées 2D. On peut utiliser une table en ROM pour définir leur trajectoire, ou faire une somme pifometrique de sinus pour créer une trajectoire en temps réel. Pour chaque "ball", il convient d'avoir une trajectoire différente (index de départ différent dans la table, déphasage, formule différente...)

A chaque nouvelle image, un buffer de la taille de l'écran (ou autre) est vidé. Pour chaque "ball", le bitmap du blob est ajouté au buffer a la position correspondante. Il est très important d'ajouter le bitmap et non pas de le copier. La valeur de chaque pixel du blob et ajouté a la valeur du pixel du buffer, en limitant la valeur au maximum (255 si 8 bits) pour éviter de warper a 0.

Tout ce qu'il reste a faire pour donner le rendu a l'écran, est de passer une fonction seuil sur le buffer tout entier. Le choix du seuil peut se faire a l'oeil, pour différent rendus. Si la valeur du pixel du buffer est en dessous du seuil, alors il est a 0, si il est au dessus, il est a 1. La sortie est donc un buffer 1 bit.

Si le blob était simplement copié, les bords couperaient ceux des autres: c'est moche et ca ne marche pas.

Addition de la texture et fondu progressif.

Seuil et coloration.

footer
symbol symbol symbol symbol symbol