2010-11-23 4 views
2

Ich versuche, eine interaktive 3D-Darstellung von Zellen, die durch den Schnittpunkt beliebiger Oberflächen definiert sind, zu erstellen. Mir fällt es schwer, herauszufinden, wie man daraus ein Mesh herstellt (oder gibt es etwas Besseres als ein Mesh, das ich für 3D-Volumes verwenden sollte?). Jede Oberfläche S wird durch einen analytischen Ausdruck für eine gegebene Ebene, Kugel, Zylinder, Kegel, etc., wie s f (x, y, z) = 0, wie diejenigen = Hier:Modellierung von 3D-Zellen durch Schnittpunkte von Oberflächen

enter image description here

Für Jede Zelle habe ich eine Liste von Oberflächen und eine +/- Sinn für jede Oberfläche. Damit ist es einfach zu bestimmen, ob ein x, y, z Punkt innerhalb der Zelle liegt, indem dieser Punkt in die Gleichung für jede der Begrenzungsflächen eingefügt wird, und wenn das Ergebnis + für alle + Flächen und - für alle Flächen der Punkt ist liegt drin. Offensichtlich, wenn das Ergebnis für irgendeine Oberfläche Null ist, liegt der Punkt auf dieser Oberfläche.

Ich kann Tausende von Gitterpunkten testen, indem ich für jede Zelle die Punkte notiere, die innerhalb dieser Zelle liegen, und dann die äußersten dieser Punkte verwenden, um ein Gitter für diese Zelle zu erstellen. Allerdings habe ich tausende von Zellen und das wäre einfach nicht schnell genug. Viele Zellen sind sehr klein oder haben ein niedriges Seitenverhältnis im Vergleich zu anderen, so dass ich ein sehr feines Raster von Punkten benötigen würde, wenn ich es so machen würde.

Kann jemand einen effizienten Weg vorschlagen, Zellen, die auf diese Weise definiert sind, in ein statisches 3D-Modell zu bringen? Gibt es irgendeine Art von Bibliothek, die mit dieser Art von Geometrie-Spezifikation arbeitet, die 3D-Netze für mich erstellen kann? Fehle ich etwas Offensichtliches?

Danke, Nick

Antwort

1

Als generelles Problem, das ist ziemlich schwierig: Ich denke, es ist im Grunde ein allgemeines nicht-lineares Programmierproblem. Wenn Ihre Grenzen durch willkürliche Funktionen erzeugt werden, könnte es eine willkürliche Anzahl von Zellen geben, die durch nur eine solche Funktion begrenzt sind; ohne weitere Informationen über die Funktionen, glaube ich nicht, dass Sie besser tun können, als Rasterpunkte zu überprüfen.

Wenn Sie etwas über Ihre Funktion wissen (z. B. Ebene, Kugel, Zylinder und Kegel sind Kegelschnitt), können Sie möglicherweise bessere Ergebnisse erzielen. In jedem Fall möchten Sie vielleicht mit einem kombinatorischen Ansatz beginnen; Sagen wir, wenn 3 Grenzen gegeben sind, bestimmen wir, ob es irgendwelche Punkte gibt, an denen sich alle drei schneiden.

Sobald Sie die Ecken und Kanten Ihrer Zelle identifizieren, können Sie mithilfe eines gitterbasierten Ansatzes ein Anzeigemesh erstellen - z. B. Ihre Oberfläche mit achsenversetzten Ebenen teilen, um die Ecken und Dreiecke zu bestimmen an Ihre 3D-Grafikbibliothek Ihrer Wahl senden.


Eine andere Idee: Da Sie Ihre Oberflächen durch f(x,y,z)=0 sind definiert haben, können Sie mit einer Reihe von Punkten beginnen, und sie numerisch auf in der Nähe Oberflächen wandern mit einem Newton-Verfahren Schritt oder etwas:

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) 

Ähnliches sollte Ihnen erlauben, Rand- und Eckpunkte anzugleichen. Es ist vielleicht schwieriger, herauszufinden, wie man diese Punkte in ein Netz einfügt, obwohl ...

Verwandte Themen