Les metaballs 3d ou blobs ------------------------- dake/calodox Introduction ------------ Les metaballs 3d peuvent être génerés de différentes manières. Celle qui est le plus souvent utilisée fait intervenir l'algorithme des marching-cubes. Cette algorithme va créer le mesh des metaballs (la surface) à partir d'une grille à 3 dimensions et qui contient des valeurs. Les metaballs sont des isosurfaces, en gros des surfaces génerées à partir de valeurs contenues dans une grille. Calcul de la grille ------------------- Les metaballs sont le plus souvent contenus dans un grand cube. Ce cube est lui-même subdivisé en de plus petits cubes. C'est la grille. Dans la plupart des cas, on utilise une grille de 32x32x32 mais on peut très bien se contenter d'une grille de 16x16x16. Attention ! Augmenter la taille de la grille induit des temps de calcul qui n'augmentent pas linéairement. Chaque point de la grille contient une valeur (isovaleur), ces valeurs proviennent de formules. Dans le cas des metaballs, nous allons remplir la grille avec des "spheres", il faut donc utiliser la formule de la sphere avec quelques modifications. Chaque metaball possède un centre, nous allons calculer les isovaleurs pour chaque centre et les additionner. C'est un peu comme pour des metaballs en 2D sauf que nous travaillons en 3D. Le fait d'additionner les valeurs va créer un "pont" entre les spheres suivant leur distance. La formule pour des metas est : 1.0/(x^2+y^2+z^2) avec : x=(centre_blob.x - position_grille.x) y=(centre_blob.y - position_grille.y) z=(centre_blob.z - position_grille.z) ========================================================================= Code (avec une grille de 32x32x32 et 4 metaballs) : #define GRILLE_X 32 #define GRILLE_Y 32 #define GRILLE_Z 32 #define NB_METABALLS 4 float metagrille[GRILLE_X][GRILLE_Y][GRILLE_Z]; //defini la grille. for (int gz=0;gz