Description
Le Marching Tetrahedra est un dérivé du Marching Cubes. La principale diférence réside dans le fait que l’on choisi de diviser le cube élémentaire en six tétraèdres. Chaque tétraèdre se comporte alors comme un volume élémentaire, les propriétés et valeurs des sommets et des arêtes sont inchangées, et ce volume peut être intersecté par l’isosurface.
Comme pour le Marching Cube, il faut trouver les différentes configurations que peut prendre l’isosurface dans un élément de volume, selon la répartition des intersections de l’isosurface sur les arrêtes du volume.
Dans ce cas, le volume élémentaire est un tétraèdre, il y a donc 4 sommets, 6 arêtes et chaque sommet peut prendre 2 états. Cela donne ainsi 16 configurations possibles d’intersections entre le volume et l’isosurface. On peut se ramener facilement à huit configurations grâce aux cas symétriques.
Avec cette méthode le nombre de facettes triangulaires augmente considérablement. Pour le Marching Cubes il y a au maximum 5 facettes par cube élémentaire alors que pour le Marching Tetrahedra il y a au maximum 6*2 = 12 facettes par cube élémentaire. Cela rend la représentation de l’isosurface plus précise et plus fidèle à la réalité des données à représenter.
De plus, cette méthode contrairement au Marching Cubes peut entraîner l’existence de bosses artificielles sur l’isosurface car l’interpolation est faite sur la diagonale d’une face et non sur la face elle même.

Division du cube en tétrahedres élémentaires
Fonctionnement général
L’algorithme est plus simple que le précèdent car aucune table n’est à créer ou à consulter.
Chaque élément de volume du maillage est parcouru. Pour chacun de ces volumes et pour chaque tétraèdre, les valeurs des sommets sont comparées à l’isovaleur. En fonction des ces tests, un index binaire (4 bits) est créé (bit à 1 si la valeur du sommet est inférieure à l’isovaleur, 0 sinon).
Pour chaque arête intersectée, on calcule par interpolation linéaire, les coordonnées du point d’intersections et ensuite il suffit de dessiner ou de stocker la facette.
En résumé :
Pour chaque volume du maillage et pour chaque tétraèdre :
Créer un index (4 bits) contenant l’état de chaque sommet.
Trouver les arêtes intersectées
Calculer les coordonnées d’intersection dans le tétraèdre.
Dessiner les facettes.
Travail effectué
Environement de travail : VC++ 6 / librairie Glut (OpenGl)
Les structures utilisées sont les même que pour le Marching Cubes c’est a dire les structures Point3D, Grille, Triangle et nous avons rajouter la structure Tetrahedre qui contient 4 Points3D et de leurs valeurs associées.
|
|
|
|
static int tableDesSommets[6][4]={{0,2,3,7},
{0,6,1,4},
{5,6,1,4},
{0,2,6,7},
{0,4,6,7},
{0,6,1,2}};
typedef struct
{
Point3D *p0,*p1,*p2,*p3;
double *v0,*v1,*v2,*v3;}Tetrahedre; |
|
|
|
|
Les principales fonctions
Les fonctions principales remplissent concrétement les mêmes offices que dans le cas du marching square.
Interpo_lineaire()
Qui va calculer les points d’intersection de l’isosurface le long d’une arrète
IndexTetrahedre()
Qui calculera l’index du tétrahedre particulier. L’indice étant code sur 4 bits, le principe de fonctionnement est le même que pour le marching cube.
|
|
|
|
static unsigned char indexTetrahedre(Tetrahedre tetra,double isoval)
{
unsigned char index=0;
if(*(tetra.v0)<isoval)index|=1;
if(*(tetra.v1)<isoval)index|=2;
if(*(tetra.v2)<isoval)index|=4;
if(*(tetra.v3)<isoval)index|=8;
return index;
} |
|
|
|
|
drawMarchingTetrahedra()
Qui se chargera de dessiner dans la fenêtre openGL le tetrahedre concerné.
Les résultats obtenus

|