2010-05-19 3 views
0

J'ai un maillage défini par 4 points dans l'espace 3D. J'ai besoin d'un algorithme qui va subdiviser ce maillage en subdivisions d'une taille horizontale et verticale arbitraire. Si la taille de la subdivision n'est pas un diviseur exact de la taille du maillage, les morceaux de bord seront plus petits. Tous les algorithmes de subdivision que j'ai trouvés ne subdivisent que les mailles en puissances exactes de 2. Est-ce que quelqu'un en connaît un qui peut faire ce que je veux? A défaut, ma réflexion sur une implémentation possible est de faire pivoter le maillage pour qu'il soit à plat sur l'axe Z, subdiviser en 2D et ensuite traduire en 3D. C'est parce que mon esprit trouve 3D dur;) Des meilleures suggestions? Utilisation de C# si cela fait une différence.Subdiviser le maillage 3D en morceaux de taille arbitraire

+0

Je trouve difficile de concevoir un maillage défini par seulement 4 points. Pouvez-vous clarifier un peu? Voulez-vous dire, peut-être, que vous avez un quadrilatère défini par 4 points et que vous voulez créer un maillage qui subdivise le quadrilatère?Quelles sont les caractéristiques du maillage existant - uniforme, rectangulaire, etc.? Et du maillage de sortie souhaité? En passant, je ne pense pas que transformer le problème en 2D et en 2D est une si mauvaise idée. –

+0

Désolé, oui. Vous pouvez considérer que c'est juste un quad. Il est rendu en utilisant deux triangles, mais c'est à côté du point. Parce qu'il est défini par 4 points, il sera toujours un rectangle. Essentiellement, cela représente un plancher, et j'aimerais diviser le plancher en carreaux de taille régulière. – Grokys

+0

Les quatre points sont-ils coplanaires? Vous parlez d'un rectangle: cela signifie-t-il que les angles sont droits? – Aniko

Répondre

2

Si vous devez uniquement travailler avec un rectangle en 3D, vous devez simplement obtenir les deux vecteurs de bord, puis générer tous les points intérieurs du rectangle subdivisé. Par exemple, dites que votre quad est défini par (x0,y0),...,(x3,y3), afin de contourner le quad. Les vecteurs de bord relatifs au point (x0,y0) sont u = (x1-x0,y1-y0) et v = (x3-x0,y3-y0).

Maintenant, vous pouvez générer tous les points intérieurs. Supposons que vous voulez bords M le long du premier bord, et N le long de la seconde, puis les points intérieurs sont tout simplement

(x0,y0) + i/(M -1)* u + j/(N-1) * v 

i et j aller de 0 .. M-1 et 0 .. N-1, respectivement. Vous pouvez déterminer quels sommets doivent être connectés en travaillant simplement sur papier.

Ce type de subdivision uniforme fonctionne bien pour les maillages triangulaires, mais chaque arête doit avoir le même nombre d'arêtes subdivisées.

Si vous souhaitez subdiviser un maillage général, vous pouvez le faire pour chaque triangle/quad individuel. Ce type de subdivision uniforme conduit à des maillages de mauvaise qualité puisque toutes les facettes plates d'origine restent plates. Si vous voulez quelque chose de plus sophistiqué, vous pouvez regarder Subidivision Loop, Catmull-Clark, etc. Ceux-ci sont typiquement contraints à des niveaux de puissance de deux, mais si vous recherchez les formulations originales, je pense que vous pouvez dériver puissance de deux divisions. La théorie sous-jacente est un peu plus complexe que je ne peux raisonnablement le décrire ici.

0

Maintenant que vous avez expliqué les choses un peu plus clairement, je ne vois pas votre problème: vous avez un rectangle et vous voulez le diviser en carreaux rectangulaires. Ainsi, les points de maillage que vous voulez sont régulièrement espacés dans les deux directions orthogonales. En 2D, c'est trivial, sûrement? En 3D, c'est aussi trivial même si les maths sont un peu plus compliquées. Au-dessus de ma tête, je devinerais que passer de la 3D à la 2D (et aligner le rectangle avec les axes de coordonnées en même temps) puis calculer les points de maillage, puis transformer en 3D est probablement aussi simple (et le temps processeur) tout en travaillant tout en 3D en premier lieu. Oui, l'utilisation de C# signifie que je ne suis pas en mesure de proposer un code pour vous aider.

Commentez ou éditez votre question si j'ai manqué le point.

+0

Non, vous n'avez pas manqué mon point. Je me demandais juste s'il y avait un algorithme existant qui ferait cela. Il y a beaucoup d'algorithmes de subdivision sur lesquels les gens ont passé beaucoup de temps. Tu as raison; en 2D c'est trivial, en 3D les maths sont plus difficiles, et il y a beaucoup plus de gens en maths 3D que moi :) – Grokys

Questions connexes