[OpenGl] Remplir un tétrahèdre pour réaliser des coupes

Remplir un tétrahèdre pour réaliser des coupes [OpenGl] - Divers - Programmation

Marsh Posté le 17-05-2010 à 15:40:47    

Bonjour,
 
Je souhaite afficher le maillage d'un objet 3D assez volumineux (composé d'un million de tétraèdres) pour ensuite réaliser n plans de coupe. La coupe des tétraèdres ne doit pas afficher l'intérieur du tétraèdre pour que le rendu soit sympa.
 
Voilà ce que je ne veux pas :
http://takeabow.free.fr/transfert/Clipping%20plane.jpg
 
Je souhaite que la coupe des tétraèdres fasse apparaitre un plan, comme si les tétraèdres étaient "pleins".
 
J'ai pensé à utiliser directement OpenGl mais je ne sais pas s'il s'agit de la méthode la plus adaptée car je ne sais pas s'il est possible de remplir des tétraèdres.
 
Est-ce possible en utilisant directement OpenGl, faut-il passer par un moteur genre VTK ?
 
Merci pour votre aide !
 
+++

Reply

Marsh Posté le 17-05-2010 à 15:40:47   

Reply

Marsh Posté le 17-05-2010 à 16:15:10    

Petite remarque: dans ton exemple de clip plane, si on voit un truc dans la zone coupée, c'est que le backface culling était désactivé (ce qui est mal). (Ou alors je suis à l'ouest)
 
Maintenant est-ce que dans tes cas de figures, tu peux avoir des combinaisons de clip planes abscons: genre un "cône" de clip planes qui bouffe ton tétraèdre, et à ce moment faut regarder du coté des opérations booléennes en amont de l'OpenGl.
 
Sinon si c'est juste une clip plane, il y a peut-être moyen de moyenner en screen space.
 
Ça dépends aussi quel traitement par pixel tu veux au niveau de la surface coupée.
Avec une couleur unie (genre le rouge qui est souvent utilisé pour les vue en coupe en méca), juste en jouant avec le stencil ça doit être jouable.
 
Regarde peut-être du coté d'OpenCSG si tu veut un truc évolué (j'ai pas test).


Message édité par bjone le 17-05-2010 à 16:42:29
Reply

Marsh Posté le 17-05-2010 à 16:50:35    

Merci pour ta réponse ! :-)
Je vais essayer de chercher sur le net pour comprendre car y'a pas mal de terme que je ne connais pas :-s
Je n'ai pas activé ou désactivé le backface culling, je vais vérifier ce paramètre.
 
Concernant les clipping plane "abscons", je ne pense pas en avoir car il n'y en aura que 3, un selon chaque axe.
 
Comme chaque sommet a un couleur différente, j'aimerais que la surface coupée soit "shadée". Je n'ai jamais de couleur unie, celà complique la chose ?
 
Le problème est vraiment basique en fait :
un volume est maillé en 3D, j'obtiens un milion de tétraèdre à afficher. Je souhaite réaliser en temps réel 3 coupes, une selon chaque axe. Chaque sommet de chaque tétraèdre a une couleur spécifique, qui doit être dégradée d'un sommet à l'autre.
Actuellement, j'utilise des primitives OpenGl avec OpenCascade mais je crois que la version implémentée de OpenGl est très vieille...

Reply

Marsh Posté le 17-05-2010 à 17:22:52    

Tu veux que tes coupes bougent en temps réel ?
Le must serait peut-être du coté d'un Geometry Shader pour faire la CSG sur les tétraèdres.


Message édité par bjone le 17-05-2010 à 17:24:42
Reply

Marsh Posté le 17-05-2010 à 17:23:59    

Oui je veux pouvoir bouger les coupes en temps réel avec la souris par exemple

Reply

Marsh Posté le 17-05-2010 à 18:08:16    

Merci pour ton aide, je vais me renseigner sur les Geometry Shader. :)
 
Ou est la difficulté d'afficher N tétraèdres et de faire des coupes "propres" qui ne laissent pas apparaitrent l'intérieur des tétraèdres ?

Reply

Marsh Posté le 17-05-2010 à 20:14:11    

Le problème est la génération de la géométrie de la coupe propre, en pâtés de triangles avec les bonnes couleurs par vertex créé.
 
Si on part vers une solution géométrique, tes 3 plans de coupes peuvent générer moultes-triangles lors de la CSG de ton tétraèdre contre les plans.
 
Donc l'idée de rester à le faire coté CPU sera plus facile (vu que tu as déjà du code).
 
Mais au lieu de passer toute ta géométrie au moteur CSG, de faire une prépasse en amont pour détecter les tétraèdres à cheval sur une clip plane, faire l'opération booléenne, et pousser dans un VB tous les tétraèdres complètement visibles et la géométrie des tétraèdres partiels.
 
Parceque recoder l'algo de CSG entre un tétraèdre et tes 3 plans dans le GS, tu vas t'amuser :D
 
Pour moi, pour maximiser les perfs, tu as deux options:
- Le path CPU: tétraèdres dans un octree, les cellules devant tout les plans sont poussées dans le VB directement, celles derrière sont éjectés, celles à mis chemin sont passées à la moulinette CSG contre les plans.
- Le path full-GPU: Geometry Shader mais faut pondre l'algo booléen tétraèdre/plan :D
Après pourquoi pas un mix des deux :D
(Le lot de géométrie qui est tracée simplement pour les tétraèdres visibles, et un lot qui passe par le GS)


Message édité par bjone le 17-05-2010 à 20:23:18
Reply

Marsh Posté le 17-05-2010 à 20:26:13    

Après y'a ptet un hack en post-process ou via plusieures rendertargets mais je vois pas :D (en tous cas de solution robuste)

Reply

Marsh Posté le 18-05-2010 à 09:31:33    

Merci pour tes réponses !
 
Je pensais pas que c'était si compliqué car j'imaginais qu'il était possible d'afficher N tétraèdres pleins et de créer ensuite 1 ou plusieurs plans de coupe... Je vais me documenter sur les techniques que tu m'as donné et essayer de m'en sortir :)
 
Coté CPU, j'ai pas grand chose actuellement, juste le maillage 3D que j'affiche en utilisant OpenCascade qui utilise une vieille version de OpenGl (1.1).
 
J'en viens à me demander s'il n'est pas plus simple de travailler avec une maillage surfacique de ma forme.
Ensuite, je détermine la section entre mes plans de coupe et mon objet 3D et j'affiche N triangles sur cette section. Bon, je rêve peut-être un peu, je sais pas si c'est plus simple, sachant que dans tous les cas, les plans de coupes doivent être déplacés à la souris et recalculés presque "en temps réel".

Reply

Marsh Posté le 18-05-2010 à 10:51:02    

Ça peut être simple si tu ne cherche pas à générer la bonne couleur par vertex au niveau du plan de coupe :/

Reply

Marsh Posté le 18-05-2010 à 10:51:02   

Reply

Marsh Posté le 18-05-2010 à 10:54:37    

Ah si chaque vertex a une couleur particulière que je détermine en faisant une interpolation.
Ensuite, OpenGl doit gérer le dégradé pour faire un joli plan, bien lisse, tout nickel :)
 
Pourquoi est-ce plus compliqué d'avoir une couleur particulière par vertex au niveau du plan de coupe ?

Reply

Marsh Posté le 18-05-2010 à 11:55:59    

C'est ce que je t'explique plus haut ;)

Reply

Marsh Posté le 18-05-2010 à 14:33:22    

Ok je vais travailler ces notions que je connais pas du tout. Y'a pas mal de taf :)
 
Je me demande s'il n'est pas plus simple d'utiliser un moteur de visualisation comme VTK (ou OpenCascade mais il est trop lent). Tu connais VTK (http://www.vtk.org/) ?
 
Est-il possible en utilisant OpenGl de créer un rectangle, sélectionnable et déplacable à la souris pour fixer le plan de coupe ? Avec un moteur comme VTK, pas de problème, mais en attaquant OpenGl directement, je ne sais pas si c'est faisable.
 
Bon allez, je me renseigne sur les octree etc etc !
 
Et encore merci pour ton aide

Reply

Marsh Posté le 25-05-2010 à 19:23:26    

Re,
 
Alors j'ai réfléchis à mon problème en partant de tes conseils. Voilà ce que je compte faire :
 
 
Mailler la surface de ma forme à afficher en 2D (triangles) et en 3D (pour l'intérieur).
Les tétraèdres sont dans un octree mais ne sont jamais affichés.
 
Si je ne veux pas réaliser de coupe, j'affiche tous les triangles de la surface.
 
Lorsque je veux afficher une coupe selon un plan, je détermine les tétraèdres qui seront coupés par le plan de coupe. Je les envoie à la moulinette CSG pour afficher les triangles résultants de cette opération.
Jusque là, je pense que c'est bon.
 
Par contre, pour couper nettement la surface de ma forme, les triangles coupés par le plan de coupe doivent être remplacés par des quadrilatères. C'est bien ça ?
Si oui, est-ce le même principe que pour les tétraèdres ou y-a-t-il un moyen plus efficace de réaliser cette tâche ?
 
Merci pour ton aide :)

Reply

Marsh Posté le 25-05-2010 à 22:07:33    

Ça a l'air d'être dans l'idée.
 
Maintenant ta source c'est quoi une surface triangulée ou des tétraèdres ?
 
Si c'est une surface triangulée y'aurait aussi le moyen de passer par la génération d'une surface intérieure (Minkowski pitètre), et de générer la surface de coupe :D
 
Bon je te complique le truc où je t'envoie dans une autre direction, mais  bon déjà teste avec ce que tu as compris, y'a que comme ça tu saurais si c'est la meilleure méthode.
 

Reply

Marsh Posté le 26-05-2010 à 07:28:02    

Je vais me renseigner un peu sur Minkowski.
 
En fait, je complique mon problème pour rien me semble-t-il car les tétraèdres ne servent à rien.
 
En résumé :
Je dois afficher un forme, donc une surface triangulée suffit. Ca, je l'ai et ca fonctionne très bien, chaque sommet a une couleur spécifique.
Je dois maintenant réaliser une coupe selon chaque axe. Donc cela revient à afficher encore une fois des triangles sur un plan (avec une couleur par sommet).
 
Est-ce que je me complique pas la vie avec des tétraèdres par hasard ???

Reply

Marsh Posté le 26-05-2010 à 11:03:21    

Ça dépends.
Pour le plan de coupe ça peut peut-être être plus pratique avec les tétraèdres qu'avec une surface extérieure et intérieure.  
Vu que le tétraèdre te donne une relation géométrique entre les deux.
A toi de test ;)

Reply

Marsh Posté le 26-05-2010 à 11:47:51    

Mmm, j'imagine bien une procédure du genre:

 

1) Imprimer le stencil buffer
- backface culling activé
- stencil op: écrire 1
- frontface:  back (inversé quoi, on rends que les face à l'envers)
- tu utilises les clipping-planes opengl pour faire tes plans de coupe, et tu rends ta surface entière (comme ça pas besoin de faire de csg à chaque fois que le plan de coupe se déplace)
- on imprime pas les couleurs
- depth-test et depth-write activé

 

2) Afficher la surface (et reimprimer dans le stencil buffer, pour ne laisser des 1 que là ou l'intérieur est visible)
- backface culling activé
- stencil op : écrire 0
- frontface : front
- même clipping planes
- on imprime les couleurs
- depth-test activé

 

3) On vide le depth buffer, on va s'en servir pour comparer les plans de coupe

 

4) Afficher les plans de coupe, on rends un gros quad par plan
- backface culling activé
- stencil test : écrire uniquement si valeur == 1
- depth-test: activé et inversé (imprime uniquement le plus éloigné des plan)

 

Déjà si tu fais ça, tu aura des plans de coupe corrects sans faire de csg, par contre ils ne seront pas shadés.

 

Pour le shading, si les sommets des tétraedres, tes "points de couleurs" si j'ai bien compris, sont alignés sur une grille, alors tu devrais facilement pouvoir extraire de ton octree 2 plaques de points, une de chaque coté de ton plan de coupe. Tu crée une texture avec chaque plaque, et à coup de multitexturing, quand tu rends chaque plan de coupe tu le rends avec les 2 textures, mixées proportionellement à la distance entre le plan de coupe et chaque plaque de points.

 

(Et du coup, tu n'a besoin de générer de nouvelle texture que quand tu change de paire de plaque de points).

 

Si tes sommets de tetraedres sont pas alignés, tu va un peu plus t'amuser, tu risque de devoir jouer avec un voronoi pour pondre tes textures, mais ça restera moins lourd que de la csg 60x/seconde....


Message édité par 0x90 le 26-05-2010 à 11:56:28

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 26-05-2010 à 12:58:00    

Merci pour cette réponse, je ne comprends pas tout mais celà permet de me faire réfléchir à mon problème en me donnant des pistes.
 
Je vais expliquer ma problématique depuis le début car mes premiers choix sont peut-être mauvais.
 
But principal :
- afficher une pièce mécanique en 3D en faisant apparaitre la temperature à sa surface via une échelle de couleur
 
Buts secondaires :
- réaliser des rotations, des zooms etc
- effectuer jusqu'à 3 coupes (une par chaque axe) pour voir la propagation de la température dans la pièce (je connais la température en n'importe quel point de l'espace en faisant une interpolation). Ces coupes doivent être réalisées rapidement pour que l'on puisse les faire glisser à la souris presque "en temps réel".
 
La pièce est au format STEP et toutes les surfaces doivent etre shadées car la température n'est jamais uniforme.
 
Dans un premier temps, j'ai maillé ma pièce en 2D et je l'ai affichée. Tout est ok, les couleurs sont bien shadées.
Je suis ensuite passé à la réalisation des coupes en pensant qu'il suffisait d'afficher des tétraèdres qui seront coupés par OpenGl. Erreur...
Voilà où j'en suis.
 
Pour répondre à 0x90, les sommets de mes tétraèdres ne sont pas alignés, actuellement, rien est aligné...
 
J'espère que mon problème est plus clair maintenant :)

Reply

Marsh Posté le 26-05-2010 à 13:09:35    

J'ai un peu peur que ça soit pas super robuste ou qu'il y ait des overheads, mais à voir ;)
edit: ok :/
 
La question est ton "épaisseur" est-elle entièrement par tétraèdre ?
 
Ceci dit question efficacité je reste sur le couple pool non coupé + pool coupé par CSG simple CPU ou GS GPU.
Mais bon c'est pas mon projet, alors je visualise pas tout :D


Message édité par bjone le 26-05-2010 à 13:16:00
Reply

Marsh Posté le 26-05-2010 à 13:52:38    

Tu parles de l'épaisseur de la pièce ?
 
Si oui, oui elle est constituée uniquement de tétraèdres mais ce n'est pas une solution figée. Je peux éventuellement changer le maillage.
 
Je suis parti sur une solution à base de tétraèdres sans vraiment réfléchir...

Reply

Marsh Posté le 26-05-2010 à 16:48:27    

Je mets temporairement les tétraèdres de coté pour me concentrer sur l'intersection entre le plan de coupe et les triangles qui forment la surface de ma pièce.  
J'imagine qui faut remplacer les triangles coupés par des quadrilatères.
 
Je me renseigne actuellement pour savoir comment générer ces quadrilatères, avec openCSG par exemple...
 
Est-ce que je suis sur la bonne piste, je pars du principe que c'est pas bien différent de la coupe d'un tétraèdre par un plan...
 
Encore merci pour vos conseils !

Reply

Marsh Posté le 01-06-2010 à 13:57:29    

Bon je me lance dans ma CSG !
Je travaille avec Qt, et jusqu'à maintenant tout va bien :-)
Est-ce que vous auriez un algo de CSG à me conseiller, compatible Qt ?
 
Je regarde du coté de OpenCSG en ce moment mais il en existe des dizaines :)

Reply

Marsh Posté le 01-06-2010 à 15:09:01    

Faut essayer.
Maintenant le choix de la bibliothèque de CSG n'a pas spécialement à être compatible Qt.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed