Quelqu'un peut-il expliquer le double contour?


9

J'ai essayé de comprendre le rendu des voxels et j'ai étudié le double contour (DC).

Jusqu'à présent, je comprends cela:

  1. Exécutez une fonction de densité pour un ensemble de points de grille (c'est-à-dire la fonction de bruit)
  2. Rechercher les arêtes de la poutre qui contiennent des changements entre les extrémités
  3. À partir de ces arêtes, créez des points d'intersection (c'est-à-dire des vecteurs)

Maintenant, c'est là que je suis coincé, la prochaine serait de générer des normales, mais comment? Lorsque vous regardez ce sujet, cette image apparaît normalement.

                                                   Une grille signée avec des bords marqués par des données Hermite

Faire des recherches indique que les normales seraient générées à partir d'une isosurface. Est-il correct de penser que je passe du bruit à l'isosurface aux normales? Si oui, comment pourrais-je accomplir chaque étape?

À ma connaissance, la prochaine étape serait la suivante du document DC ;

Pour chaque arête qui présente un changement de signe, générez un quadruple reliant les sommets minimisateurs des quatre cubes contenant l'arête.

Cette citation est-elle représentée par l'image ci-dessus?

Enfin, la prochaine étape serait d'exécuter le QEF avec les points d'intersection et les normales, ce qui générerait mes données de sommet. Est-ce correct?


Si je comprends bien ce processus, c'est quelque chose comme ... bruit> nuage de points> surface iso> normales ... mais je ne suis pas assez intelligent pour prétendre que je peux expliquer ce processus correctement, donc je ne vais pas tenter de réponse.
Guerre

Réponses:


3

Les normales seraient générées en fonction du gradient de la fonction de densité en même temps que vous obtenez les points d'intersection entre les bords et la surface. Si c'est quelque chose de simple et de fermé comme une sphère, vous pouvez calculer les normales analytiquement, mais avec du bruit, vous devrez prélever des échantillons.

Vous avez les prochaines étapes dans le mauvais ordre. Tout d'abord, vous générez un sommet pour chaque cellule qui présente un changement de signe. Le QEF que vous minimisez est simplement la distance totale à chacun des plans qui est définie par le point d'intersection / paires normales pour cette cellule. Ensuite, vous parcourez les bords qui présentent des changements de signe et créez un quad en utilisant les quatre sommets adjacents (qui sont garantis d'avoir été générés à la dernière étape).

Maintenant, mon plus grand obstacle à la mise en œuvre de ce problème était la résolution du QEF. En fait, j'ai trouvé une solution itérative simple qui fonctionnera bien sur (par exemple) un GPU en parallèle. Fondamentalement, vous démarrez le sommet au centre de la cellule. Ensuite, vous faites la moyenne de tous les vecteurs pris du sommet à chaque plan et déplacez le sommet le long de cette résultante, et répétez cette étape un nombre fixe de fois. J'ai trouvé que le déplacer ~ 70% le long de la résultante se stabiliserait dans le moins d'itérations.


Disons donc que j'ai une cellule / voxel dont je sais qu'elle présente un changement de signe (c'est-à-dire un cas comme MC), j'ai exécuté une fonction de bruit pour chaque 8 coins de la cellule pour trouver sa densité. Ce que j'ai du mal à comprendre, c'est de là comment trouver les variables x , n et p du QEF?
Soapy

x est la position du sommet. Pour chaque point d'intersection, vous avez p (la position) et n (la normale), qui composent les plans dont je parlais.
jmegaffin

p est trouvé en trouvant où la moyenne pondérée des deux densités le long du bord est nulle. Ensuite, vous calculez n en prenant le gradient de votre fonction de densité en p .
jmegaffin

Donc, fondamentalement, pour chaque cube, je calcule p et n pour chaque 12 bords, puis exécute le QEF pour chaque bord de cellule p et n dans x , qui dans votre exemple est au centre d'un voxel / cellule pour commencer? Ensuite, si quatre cellules partagent le même bord, je crée un quadruple reliant chacune quatre cellules x ? Et le quad résultant est-il mes données polygonales?
Soapy

Toutes les arêtes n'auront pas d'intersection, vous ne résolvez donc pas nécessairement le QEF pour 12 avions. A part ça, vous l'avez!
jmegaffin

1

De la lecture du document à la page 2, il apparaît que les poids de volume sont stockés aux coins de la grille au lieu d'être le poids du cube lui-même comme le préfèrent les algorithmes de style Marching Cubes. Ces poids d'angle définissent un point entre le long du bord entre 2 coins où il y a un changement de signe d'un coin à l'autre. Les bords avec des changements de signe stockent également une normale pour le bord qui est la ligne angulaire dans votre représentation 2D dans l'OP. Ces informations normales sont définies lors de la création du volume (quel que soit l'outil d'édition ou la méthode de création de volume procédurale utilisée), et non après la génération de l'isosurface comme prévu par un algorithme de style Marching Cubes. Ces données normales "indiquent" que la ligne / surface passant par le point doit avoir la valeur normale prédéfinie. Dans les cas où les cubes de marche plieraient la ligne à ce point pour s'accoupler avec un autre point sur un bord adjacent, les cubes de marche étendus et le double contour prolongent tous les deux la ligne / surface jusqu'à ce qu'elle intersecte avec la ligne / surface passant par le point sur la bord adjacent qui a une valeur normale différente. Cela permet de créer des angles vifs à partir des données de volume où les algorithmes de base des cubes de marche arrondiraient quelque peu la surface. Je ne comprends pas très bien comment les QEF (fonctions d'erreur quadratiques) jouent dans cela, sauf qu'il semble qu'ils facilitent le calcul du point étendu dans un cube où un coin sera situé. Les cubes de marche étendus et le double contour prolongent tous les deux la ligne / surface jusqu'à ce qu'elle intersecte avec la ligne / surface passant par le point sur le bord adjacent qui a une valeur normale différente. Cela permet de créer des angles vifs à partir des données de volume où les algorithmes de base des cubes de marche arrondiraient quelque peu la surface. Je ne comprends pas très bien comment les QEF (fonctions d'erreur quadratiques) jouent dans cela, sauf qu'il semble qu'ils facilitent le calcul du point étendu dans un cube où un coin sera situé. Les cubes de marche étendus et le double contour prolongent tous les deux la ligne / surface jusqu'à ce qu'elle intersecte avec la ligne / surface passant par le point sur le bord adjacent qui a une valeur normale différente. Cela permet de créer des angles vifs à partir des données de volume où les algorithmes de base des cubes de marche arrondiraient quelque peu la surface. Je ne comprends pas très bien comment les QEF (fonctions d'erreur quadratiques) jouent dans cela, sauf qu'il semble qu'ils facilitent le calcul du point étendu dans un cube où un coin sera situé.

Notez que j'ai parlé des lignes et des bords ici dans le sens 2D comme représenté par la représentation dans l'OP. Je devrais faire plus de lecture et de réflexion pour étendre cela à la 3D pour la génération de maillage volumétrique.

Pour répondre à la deuxième moitié de votre question sur la façon de générer les normales et de penser d'un point de vue procédural basé sur le bruit, il semble que vous remplissiez votre volume de données de bruit, puis recherchiez des bords avec des changements de signe, puis examiniez les 4 cubes qui partagent l'arête pour déterminer où les triangles vont être générés et calculer la normale du sommet comme vous le feriez pour toute autre intersection de plusieurs triangles, en prenant la moyenne des normales pour chaque triangle qui partage le sommet. C'est très spéculatif de ma part, car le document traite principalement des opérations CSG et des volumes générés à partir de maillages convertis par balayage, qui ont tous deux des normales bien définies sur les surfaces.

J'espère qu'au moins la première partie de cette réponse aborde les différences dans la façon dont les données de poids sont représentées et utilisées d'une manière très différente des cubes de marche de base, et pourquoi les données normales doivent être créées assez tôt dans le processus de génération de volume, où avec les cubes de marche de base, les normales sont généralement créées comme dernière étape du processus de génération de maillage.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.