2009-04-22 14 views
6

J'écris actuellement un programme pour implémenter Marching Cube en utilisant C++ et Opengl.Marching Cube Question

Cependant, ma meilleure référence est seulement de http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/

dans le Web, les codes fournis sont écrits en C.
mon problème est que je ne comprends pas le triTable et edgeTable
et comment ils sont liés.

quelqu'un peut-il m'aider sur l'explication ou me guider sur la conversion de l'algorithme en codes?

Répondre

12

Ces tableaux sont utilisés pour trouver comment tesselate la surface:

Le premier tableau vous donne les bords nécessaires pour interpoler. La deuxième table vous donne la façon dont vous devez tesselate, ce qui signifie quels triangles vous devez faire à l'intérieur du cube.

Un petit exemple:

supposons, un sommet et 2 sont en dessous du niveau iso, le cubeindex doit être 3.

L'intersection tout devrait ressembler un coin.

Si vous y pensez, vous devez interpoler les valeurs sur les bords: 0 et 9, et 2 et 10. Si vous entrez ceci dans un champ de bits, chaque bit correspondant à « est bord recoupée? » vous finiriez avec quelque chose comme ceci:

 
10 9 8 7 6 5 4 3 2 1 edge 
1 1 0 0 0 0 1 0 1 0 intersected? 

ne vous?

Quelle est exactement la valeur de edgeTable [3] en binaire;) 0x30A = 1100001010

Maintenant, vous pouvez écrire une fonction qui interpole linéairement les points sur les bords pour répondre à vos isolevel. Ces points deviendront votre surface à l'intérieur de cette cellule.

Mais comment tesselate cette cellule/surface?

si vous regardez dans triTable [3] un sourire devrait glisser sur votre visage :)

supp après la déclaration de commentaire résiduel perplexes: ;-)

Qu'est-ce que Marching Cubes: Imaginez que vous avez une pièce sombre avec une source de lumière à un point. C'est le centre d'un champ d'intensité lumineuse volumétrique de valeurs d'intensité scalaire. Vous pouvez aller au point (x, y, z) et mesurer l'intensité à cet endroit, par ex. 3 candela.

Vous voulez maintenant rendre une surface à travers tous les points qui ont une certaine intensité lumineuse. Vous pouvez imaginer que cette isosurface ressemble à une sphère autour de la source lumineuse ponctuelle. C'est ce que nous espérons que les cubes de marche nous fourniront.

Maintenant parcourir tous les points de la pièce et marquer chaque point comme un sommet qui a approximativement la valeur iso, sera très complexe d'un point de vue algorithmique et aboutirait à un nombre élevé de sommets.Ce que nous aurions alors à tesselat en quelque sorte. Donc: Les cubes Marching First décrivent tout le volume en cubes de taille égale. Si les données sous-jacentes ont une sorte de discrétion sous-jacente, des multiples de celles-ci sont utilisés. Je ne vais pas entrer dans l'autre cas, puisque c'est rare. Par exemple, nous avons mis une grille avec la densité de 1mm dans une pièce de 2mx5mx5m

Nous utilisons des cubes de 5mmx5mmx5mm. Courir à travers eux devrait être beaucoup moins cher.

Vous pouvez maintenant imaginer que les arêtes de certains des cubes croisent l'isosurface. Ce sont les plus intéressants. Ce code les identifie:

cubeindex = 0; 
    if (grid.val[0]

Si le cubeindex reste à zéro, ce cube n'est pas recoupé par l'isosurface. Si cubeindex est> 0, vous savez maintenant que l'isosurface passe par ce cube et que vous voulez rendre le morceau de l'isosurface qui s'y trouve.

Veuillez vous photographier dans vos pensées. Voir http://en.wikipedia.org/wiki/Marching_cubes pour des exemples de cubes croisés.

Les sommets que vous pourriez obtenir facilement sont ceux sur les bords du cube. Juste interpoler linéairement entre 2 points de coin pour trouver la position de l'isovalue et y placer un sommet. Mais quels bords sont intersectés ??? C'est l'information contenue dans edgeTable [cubeindex]. C'est le gros morceau de code avec tous les ifs, qui stocke les points interpolés en tant que sommets dans un tableau de points xyz: vertlist []. Cette pièce se lit comme suit:

 
get the bitfield = edgeTable[cubeindex] 
if edge 1 is marked in bitfield (bit 1 set to 1 in bitfield) 
    vertlist[0] = interpolated point, somewhere on edge 1 
... and so on. 

Vous avez maintenant une gamme complète de sommets, mais comment les connecter à triangles? C'est une information que Tritable fournit.

Le reste est à peu près ce que j'ai expliqué ci-dessus.

Eh bien, en cas de problèmes, veuillez préciser le code qui vous pose problème.

+2

Si ce sourire ne veut pas arriver, réfléchissez à la façon dont vous mettriez les triangles dedans, puis comparez-le à la proposition dans triTable. Amusez-vous! ;-) – AndreasT

+0

hey merci, AndreasT en fait je suis un peu perdu. pour votre information, je n'ai aucune connaissance de l'algorithme. je comprends un peu comment triTable fonctionne maintenant, mais je ne comprends toujours pas comment edgeTable fonctionne et comment déterminer quelle surface à utiliser .. – noob88

+0

ok, maintenant la chose est vraiment grande :) – AndreasT