2009-04-17 14 views
3

J'ai une application de modélisation 3D. En ce moment je dessine les mailles à double face, mais je voudrais passer en recto lorsque l'objet est fermé.Un maillage polygonal fermé est-il retourné?

Si le maillage polygonal est fermé (pas de bordures/complètement périodique), il semble que je devrais toujours être capable de déterminer si l'objet est actuellement retourné et de corriger automatiquement. Etre retourné signifie que mes normales pointent dans l'objet au lieu de sortir de l'objet. Être retourné est le résultat d'une discordance entre mes règles d'enroulement et le réglage actuel de la face avant, mais je calcule les normales directement à partir de la géométrie, donc regarder les normales est un moyen simple de le détecter. Une chose que je pensais était de prendre le cadre de délimitation, de trouver le point le plus élevé, et de voir si sa normale pointe vers le haut ou vers le bas - si elle est en baisse, alors l'objet est retourné.

Mais il semble que cette solution pourrait être sujette à des erreurs de géométrie dégénérée, ou à une erreur de virgule flottante, car je ne regarderais qu'un seul point. Je suppose que je pourrais obtenir tous les 6 axes alignés, mais cela semble être un peu mieux kludge, et pas une bonne solution.

Existe-t-il un moyen simple et robuste de le faire? Robuste et dur travaillerions aussi .. :)

+0

Je pense que vous devriez expliquer mieux ce que vous voulez dire par «retourné», c'est-à-dire que vous avez retourné x, y ou z? –

+1

Je pense qu'il veut dire que si les normales pointent vers l'intérieur (puisqu'elles devraient pointer vers l'extérieur). –

+0

Vous écrivez l'application, alors pouvez-vous introduire la convention que tous les triangles obéissent à la "règle de la main droite"? c'est-à-dire: si vous deviez enrouler votre main droite autour du triangle du point 0 au point 2, la normale pointerait dans la direction de votre pouce. –

Répondre

5

Ceci est un solide, mais lente façon d'y arriver:

Prenez un coin d'un cadre de sélection décalée par rapport au centre de gravité (force à garantir l'extérieur de votre fermée maille polygonale), puis créez un segment de ligne entre celui-ci et le point central de n'importe quel triangle de votre maillage.

Mesurez l'angle entre ce segment de droite et la normale du triangle.

Intersection de ce segment de ligne avec chaque face de triangle de votre maillage (y compris le tri que vous avez utilisé pour générer le segment).

S'il y a un nombre impair d'intersections, l'angle entre la normale et le segment de droite doit être < 180. S'il y a un nombre pair, il doit être> 180.

S'il y a un nombre pair d'intersections, les nombres doivent être inversés.

Cela devrait fonctionner pour des surfaces très complexes, mais elles doivent être fermées ou se dégrader.

2

"Je dessine les mailles à double face"

Pourquoi fais-tu ça? Si vous utilisez OpenGL, il y a une meilleure façon d'y aller et de vous épargner tout le travail. utiliser:

glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1); 

Avec ceci, tous les polygones sont toujours recto-verso. La seule raison pour laquelle vous voudriez utiliser un éclairage unilatéral est que si vous avez un maillage ouvert ou partiellement inversé et que vous voulez indiquer d'une manière ou d'une autre quelle partie appartient à l'intérieur en ne l'ayant pas éclairée.

En règle générale, le problème que vous posez est un problème ouvert dans le traitement de la géométrie et AFAIK il n'y a pas de manière générale sûre qui peut toujours déterminer l'orientation. Comme vous le suggérez, il y a des heuristiques qui fonctionnent presque toujours.
Une autre approche rappelle un fameux algorithme de point-dans-polygone: choisissez un sommet sur le maillage et tirez un rayon de celui-ci dans la direction de la normale. Si le rayon frappe un nombre pair de faces alors la normale est dirigée vers l'extérieur, si elle est étrange alors la normale est vers l'intérieur. remarquez de ne pas compter le point d'origine comme une intersection. Cette approche ne fonctionnera que si le maillage est un collecteur fermé et qu'il peut atteindre certains cas de contour si le rayon passe exactement entre deux polygones, alors vous pouvez le faire un certain nombre de fois et prendre le premier vote.

+0

Merci pour cette réponse. Pour clarifier, j'écris un nouveau type de géométrie pour un pipeline graphique existant. Je viens de fournir des maillages de tessellation, avec quelques options de dessin. Dans ce cas, j'essaie de faire correspondre le comportement d'autres types de géométrie, qui dessinent un seul côté pour les objets fermés, pour vous permettre de voir quand la caméra est à l'intérieur. Il dessine toujours des lignes isoparamétriques, de sorte que vous pouvez dire où vous êtes, mais obtenir mon enroulement en arrière semble vraiment mauvais. – tfinniga

+1

L'activation de l'éclairage à deux faces a cependant des implications sur les performances dans OpenGL. S'il y a un moyen d'éviter le besoin, cela peut être bénéfique. Il y a aussi des implications si vous utilisez des shaders par rapport au pipeline FF - la gestion de l'éclairage sur 2 faces dans les shaders est beaucoup moins amusante. –

Questions connexes