Question

Je suis en train de créer une représentation 3D interactive des cellules qui sont définies par l'intersection des surfaces arbitraires. Je vais avoir du mal à comprendre comment créer un maillage à partir de ce (ou est-il quelque chose de mieux qu'un maillage que je devrait viser à représenter les volumes 3D?). Chaque surface s est donnée par une expression analytique pour un avion, sphère, cylindre, cône, etc., comme s = f (x, y, z) = 0, tels que ceux ici:

entrer image description ici

Pour chaque cellule, j'avoir une liste des surfaces et un sens +/- pour chaque surface. Avec cela, il est facile à déterminer si un x, y, trouve le point z à l'intérieur de la cellule en branchant ce point dans l'équation pour chacune des surfaces de délimitation, et si le résultat est + pour toutes les surfaces de + et - pour tous - les surfaces du point réside à l'intérieur. Il est évident que si le résultat est zéro pour toute surface alors le point se trouve sur cette surface.

I permet de tester des milliers de points de grille, en notant pour chaque cellule les points qui se trouvent à l'intérieur de cette cellule, puis en utilisant la plus externe de ces points pour créer un maillage pour cette cellule. Cependant, j'ai des milliers de cellules, ce qui serait tout simplement pas assez vite. De nombreuses cellules sont très petites ou faible ratio d'aspect par rapport aux autres, donc je aurais besoin d'une grille très fine de points si je devais le faire de cette façon.

Quelqu'un peut-il suggérer un moyen efficace de mettre les cellules ainsi définies dans un modèle 3D statique? Y at-il sorte de bibliothèque qui fonctionne avec ce genre de spécification de géométrie qui peut construire des mailles 3D pour moi? Suis-je manque quelque chose évidente?

Merci, Nick

Était-ce utile?

La solution

En tant que problème général, cela est assez difficile: je pense qu'il est essentiellement un problème de programmation non linéaire général. Si vos limites sont générées par des fonctions arbitraires, il pourrait y avoir un nombre arbitraire de cellules délimitées par une même telle fonction; sans plus d'informations sur les fonctions, je ne pense pas que vous pouvez faire mieux que la vérification des points de grille.

Si vous savez quelque chose au sujet de votre fonction (par exemple, plan, sphère, cylindre et cône sont tous conics), vous pouvez être en mesure de faire mieux. Dans tous les cas, vous voudrez peut-être commencer par une approche combinatoire; par exemple, compte tenu des limites 3, déterminer s'il y a des points où les trois Intersection.

Dans tous les cas, une fois que vous identifier les coins et les bords de la cellule, on peut utiliser une approche basée sur les grilles pour construire un écran de maille - par exemple, couper votre surface avec des plans alignés axialement, afin de déterminer les sommets et les triangles à envoyer à votre bibliothèque graphique 3D de choix.


Une autre idée: puisque vous définissez vos surfaces par f(x,y,z)=0, vous pouvez commencer avec un tas de points, et les migrer numériquement sur des surfaces voisines avec l'étape de la méthode de Newton ou quelque chose:

point p = (x,y,z)
scalar value = f(p)
while abs(value) > epsilon:
  vector gradient = gradient_of_f(p)
  p -= gradient * (value / dot(gradient,gradient))
  value = f(p)

Quelque chose de similaire devrait vous permettre de bords approximatifs et les points coin. Il pourrait être plus difficile de comprendre comment connecter ces types de points de maillage dans un, mais ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top