Génération de géométrie procédurale

10

J'ai récemment étudié SceneKit pour OS X et j'ai remarqué qu'il existe plusieurs méthodes d'usine pour créer des formes géométriques telles que:

Boîte, capsule, cône, cylindre, avion, pyramide, sphère, tore et tube.

Je suis intéressé par l'ajout de telles formes primitives à mon moteur de rendu, mais j'ai du mal à trouver une source raisonnable à partir de laquelle je peux acquérir une compréhension de la génération procédurale. Il existe plusieurs ressources qui détaillent la théorie, mais manquent du code source approprié pour la sauvegarder.

SceneKit fournit des méthodes d'usine qui permettent de définir dynamiquement les attributs de ces formes. Dans le cas de la boîte, vous pouvez fournir des valeurs entières pour le nombre de segments de largeur, hauteur et profondeur dans lesquels chaque face doit être divisée.

Je comprends la théorie mais je n'ai pas les connaissances nécessaires pour commencer à subdiviser les faces géométriques pour obtenir l'effet souhaité.

Les sommets de chaque forme sont probablement assez faciles à générer dans de simples boucles. Ce qui me décourage, c'est de savoir comment créer les faces, ou plutôt les coordonnées de texture appropriées pour chaque face. Les normales peuvent être calculées par visage, donc je suis assez confiant de pouvoir réaliser ce que je veux, c'est juste de savoir par où commencer.

Quelqu'un peut-il fournir des détails sur la géométrie procédurale? Ce dont j'ai vraiment besoin, c'est d'un code source pour glaner des informations. J'ai cherché haut et bas des tutoriels, mais jusqu'à présent, je n'ai trouvé que quelques sites ou blogs raisonnables. Tous les bons livres, tutoriels, blogs ou articles de recherche seraient appréciés.

Modifier en fonction des commentaires

J'aurais dû préciser que je sais comment créer des sommets pour les formes de base, la plupart d'entre eux peuvent probablement être obtenus par de simples boucles. Ce que je ne comprends pas, c'est comment créer des faces à partir du tableau de sommets généré. Comment créer une ou plusieurs triangles à partir d'un tableau de sommets apparemment non ordonné?

Je suppose qu'une fois passé ce point, je peux créer les normales de chaque visage. Bien que je ne sois pas encore plongé dans cela, j'ai vu beaucoup de références à cela et je suis sûr que ce sera assez facile à mettre en œuvre.

Idéalement, j'aimerais pouvoir générer une géométrie à partir d'un ensemble donné de propriétés telles que la façon dont SceneKit fournit. Étant donné que SceneKit l'a fait, et vous pouvez faire des choses similaires dans Blender et Maya, etc., je suppose que je n'essaie pas d'implémenter l'impossible.

Le dernier aspect serait d'appliquer des textures. Encore une fois, ce n'est pas quelque chose que j'ai mis en œuvre, mais j'ai lu et je suis conscient des exigences.

Le principal problème ici est que je sais ce que je veux réaliser, mais que j'ai du mal à déchiffrer comment l'implémenter pour les primitives susmentionnées. J'espérais que je serais en mesure de trouver un semblant de connaissances par le biais du code source, mais je n'ai vraiment rien trouvé de convenable jusqu'à présent.

CaptainRedmuff
la source
Vous dites que votre problème consiste à subdiviser la géométrie, mais vous dites ensuite que la création des sommets devrait être facile, puis vous dites que votre problème est de savoir comment créer des faces, puis vous dites que votre problème est le mappage de texture. Quel est votre problème? Pouvez-vous générer les positions des sommets? Pouvez-vous générer les arêtes et les faces? De plus, les coordonnées de texture dépendent de votre texture et de ce que vous voulez réaliser avec elle, donc la question sur les coordonnées de texture n'est pas bonne. Enfin, la génération de primitives concerne simplement la géométrie et les gens l'appellent rarement «géométrie procédurale», bien que ce soit ce qu'elle est.
jrsala
Je comprends comment créer la géométrie pour des formes simples comme un cube ou un plan, c'est la création de faces que je ne comprends pas. Comment créer les faces à partir d'un tas de sommets? Tracer les points pour des formes plus complexes fait partie du problème même si j'ai une compréhension de base. Les coller tous ensemble dans une bande ou des triangles triangulaires est ce que j'ai du mal à envelopper ma tête.
CaptainRedmuff
OK, merci pour les détails. Vous voudrez peut-être modifier votre question pour clarifier. Répondre au temps!
jrsala

Réponses:

11

La façon de générer les bords et les faces d'une forme primitive comme une boîte, un cône et tous ceux que vous avez cités est de les générer en même temps que vous créez les sommets. En fait, vous devez créer les sommets d'une manière logique qui facilite le calcul des arêtes et des faces en conséquence.

Il existe des algorithmes qui prennent en entrée un ensemble de points dans l'espace et calculent une soi-disant " triangulation d'ensemble de points " dessus, mais le problème de la triangulation d'ensemble de points est NP-complet , de sorte qu'il est plus rapide de rendre les bords et les faces au fur et à mesure que de calculer les sommets et de laisser un algorithme faire le travail. Juste pour vous faire savoir que cette solution existe.

En dehors de cette solution inefficace, je pense que vous ne pouvez traiter les primitives qu'au cas par cas, comme dans les exemples qui suivent.

Un maillage est composé de sommets et de faces . Les arêtes sont contenues dans la description des faces, sauf si votre maillage contient des lignes qui ne constituent pas des faces. Les sommets sont des tuples de 3 coordonnées à virgule flottante. Les arêtes sont simplement des paires de références aux sommets, mais là encore, vous n'en aurez sûrement pas besoin. Dites par exemple que vos sommets sont dans un tableau indexé. Eh bien, vos bords pourraient alors être des paires d'indices de ce tableau. Les faces sont des triplets de références à des sommets ou des triplets d'indices dans le cas du tableau indexé .

Vous devriez pouvoir compter les sommets, les arêtes et les faces qui composent chacune de ces formes primitives parce que pouvoir les compter signifie comprendre les propriétés de l'objet qui vous aide à concevoir la méthode avec laquelle vous les construirez, en utilisant des boucles et d'autres outils comme nous le verrons.

Cône

Pour un cône avec n + 2 sommets, 3n arêtes et 2n faces:

  1. Créez deux sommets séparés.
  2. Faites un cercle autour de l'un des sommets (le sommet de base), c'est-à-dire dans un plan perpendiculaire au segment entre les deux premiers sommets. J'espère que vous pourrez faire un cercle en utilisant la trigonométrie, non? C'est déjà tous les sommets du cône. C'est aussi un tiers de tous les bords (il y a n bords dans le cercle et 3n au total).
  3. Faites n arêtes du sommet de base aux n sommets du cercle. Vous pouvez créer la moitié des faces (c'est-à-dire n faces) en faisant cela.
  4. Faites n arêtes du sommet de la pointe aux n sommets du cercle. Vous pouvez créer l'autre moitié des faces (c'est-à-dire n faces) en faisant cela.

1) Deux sommets 2) et un cercle
3) et visages
4) et visages
Résultat final:résultat

Vous pouvez également créer les arêtes et les faces lorsque vous exécutez la boucle qui forme le cercle. Même complexité, même chose. Faites un sommet sur le cercle, stockez-le dans votre tableau de sommets, ajoutez le bord correspondant (paire d'indices) au tableau de paires d'indices si vous en avez envie, et enfin ajoutez la face correspondante à votre tableau de triplets d'indices . Passez au sommet suivant.

Le cylindre et le tube: ne pas faire deux fois le même travail, et les quads

Encore une fois, pour le tube, il commence par un sommet et un cercle qui sera le centre du disque supérieur ou inférieur du cylindre:

  1. Faites un sommet.
  2. Faites un cercle autour du sommet. Ajoutez des arêtes (si vous voulez des arêtes) entre les sommets successifs du cercle et entre le sommet central et chaque sommet de cercle. Ajoutez des faces entre chaque triplet de sommets composé du sommet central et de deux sommets successifs sur le cercle.
  3. Dupliquez tout cela, traduisez la copie dans la direction perpendiculaire à la base que vous venez de faire, par la longueur du cylindre souhaité.
  4. Reliez le haut et le bas.

Pour relier le haut et le bas, vous devez faire des quads entre des paires de paires de sommets qui se font face. Alors, pensez-y et pourquoi ne pas vous faire une fonction qui fait deux faces triangulaires sur quatre sommets?

Terminé. Notez que cette fois nous utilisons le fait que la même structure (cercle + centre) apparaît deux fois dans un cylindre pour prendre un raccourci. Nous n'avons pas à faire tous les sommets, arêtes et faces à la main, contrairement au cône où c'était nécessaire.

En suivant ce principe de paresse, il est également possible de ne faire qu'un quart du cercle et de le dupliquer, et encore une fois, de faire un cercle complet avec des transformations très simples (valable avec n'importe quel cercle donc avec le cône aussi), mais c'est vraiment exagéré pour un forme pas si complexe.

Vous devez toujours utiliser les propriétés géométriques des objets que vous créez pour simplifier leur fabrication . A savoir, leurs symétries et invariants .

Pour un cylindre, ne faites pas le sommet de base, faites simplement le cercle, dupliquez, traduisez la copie, faites les quads, c'est fait.

La sphère et la capsule: ajouter de la complexité, toujours pas le même travail deux fois

Pour créer une capsule, nous voulons créer une sphère UV, la diviser en deux moitiés, traduire la première moitié, puis relier les deux aux côtés des capsules.

Encore une fois, il est possible de faire seulement un huitième (!!) de la sphère, puis de le dupliquer et de l'inverser, puis de dupliquer et d'inverser le résultat sauf le long d'un autre axe, etc., pour obtenir une sphère pleine, en 4 étapes (créez le huitième , dupliquer et inverser trois fois). Peut-être exagéré, mais moins que dans le cas du cercle.

Une simple sphère UV:
sphère

En fait, nous n'en faisons qu'une moitié (par exemple), dupliquons cette moitié, retournons la copie à l'envers et la traduisons par la longueur de la capsule:
moitiés

Nous relions la moitié supérieure et inférieure:
capsule

Le vrai (un peu) dur labeur vient de la trigonométrie qui sert à faire une sphère. L'ensemble de tous les sommets appartenant à une sphère UV peut être décrit comme l'ensemble de tous les points de la forme:

points

R est le rayon de la sphère et, pour un certain entier pair positif N , nous avons la constante

θ = × π / N ,

k et n sont des entiers avec k variant de 0 à 2N-1 et n variant de -N / 2 à + N / 2 .

Pour faire une demi-sphère ou un huitième d'une sphère, vous devez restreindre l'ensemble des valeurs prises par k et n .

Si k étaient des nombres réels et pas seulement des nombres entiers, vous obtiendriez une sphère entière, pas seulement les sommets sur sa surface. Donc, ce que nous avons fait ici est de pixelliser l'équation de surface de la primitive .

Le redoutable tore : c'est facile après tout ce qu'on a vu!

Encore une fois, plus de trigonométrie, plus de sommets, plus de quads, plus de symétries, plus d'invariants ... plus de géométrie! Découvrez l'équation de la surface d'un tore, "pixellisez-le correctement", simplifiez le problème en utilisant les symétries (évidentes) du tore et, enfin, parcourez l'ensemble des sommets que vous venez de définir et faites les bords et les faces comme vous aller!

Voir? Complètement simple.

jrsala
la source
Sensationnel. Merci de votre réponse si détaillée et de tant d'exemples. Je n'avais pas envisagé l'idée de générer simplement la moitié d'une sphère et de refléter les éléments symétriques. Merci beaucoup d'avoir pris le temps d'écrire ceci d'une manière que je peux facilement comprendre et, je l'espère, mettre en pratique avec facilité.
CaptainRedmuff
Vous êtes les bienvenus! Je suis désolée cependant qu'il n'y ait pas de code.
jrsala
Le contour des méthodes correspondait plus à ce dont j'avais vraiment besoin. Je peux commencer à élaborer un plan d'action à partir de là au moins:] Je suppose que vous n'avez aucune information sur les boîtes / cubes à bords chanfreinés? docs.autodesk.com/3DSMAX/15/ENU/3ds-Max-Help/images/...
CaptainRedmuff