Algorithme
L’algorithme du Marching Tetrahedra dérive de l’algorithme
du Marching Cubes. Le principe est 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.
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.
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.
Up
Programmation
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 Poin3D et de leurs
valeurs associées. Nous utilisons aussi la table des sommets
suivante :
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}};
Les fonctions utilisées :
• Interpolation Linéaire c’est la même fonction
que pour Marching Cubes.
• IndexTetra , cette fonction retourne un index contenant l’état
de chaque sommet du tetrahedre.
• Point d’Intersection , cette fonction calcule l’ensemble
des points d’intersection selon l’IndexTetra calculé
précédemment.
• DrawMarchingTetra. Cette fonction remplie et dessine un tetrahedre.
Comme dans Marching Cubes nous disposons de nombreuses procédures
d’affichage.
Up
Resultat obtenu.
Comme dans Marching Cubes on utilise dans ce programme des fichiers
Lumière et Calcul de Normal pour un meilleur rendu d’affichage.
Ci dessous 3 exemples d’une sphère par le Marching Tetra
avec :
1. Taille de cellule élémentaire 3.3 , sur taille fenêtre
de 10 > 114 facettes.
2. Taille de cellule élémentaire 1.6 , sur taille fenêtre
de 10 > 248 facettes.
3. Taille de cellule élémentaire 0.3 , sur taille fenêtre
de 10 > 19920 facettes.
En comparaison, le Marching Cubes faisait respectivement 44 , 248 ,
6632 avec les mêmes tailles pour de cellule élémentaire
et la fenêtre.
Nombre de facette : 19920
Taille de la cellule: 0.3
IsoValeur : 4 |
Nombre de facette : 720
Taille de la cellule: 1.6
IsoValeur : 4 |
Nombre de facette : 144
Taille de la cellule: 3.3
IsoValeur : 4 |
|
|
|