Frage

Ich versuche, eine interaktive 3D-Darstellung von Zellen zu erzeugen, die durch den Schnitt von beliebigen Oberflächen definiert sind. Ich habe eine harte Zeit, herauszufinden, wie ein Netz von diesen zu schaffen (oder gibt es etwas besser als eine Masche, dass ich für sein Ziel sollte 3D-Volumen zu repräsentieren?). Jede Oberfläche S durch einen analytischen Ausdruck für eine Ebene, eine Kugel, Zylinder, Kegel, etc., wie s = f (x, y, z) = 0, wie die hier gegeben wird:

eingeben Bild Beschreibung hier

Für jede Zelle habe ich eine Liste von Oberflächen und einen +/- Sinn für jede Oberfläche. Damit ist es einfach zu bestimmen, ob eine x, y, z Punkt liegt im Innern der Zelle, die durch diesen Punkt in die Gleichung Einstecken für jede der Begrenzungsflächen, und wenn das Ergebnis + für alle + Oberflächen und - für alle - die Punktoberflächen liegt im Inneren. Natürlich, wenn das Ergebnis Null ist für jede Oberfläche dann der Punkt liegt auf dieser Oberfläche.

Ich kann Tausende von Gitterpunkten testen, für jede Zelle unter Hinweis darauf, jene Punkte, die liegen innerhalb dieser Zelle und dann mit der Außen die meisten dieser Punkte ein Netz für diese Zelle zu erstellen. Allerdings habe ich Tausende von Zellen und dies einfach nicht schnell genug sein. Viele Zellen sind sehr klein oder mit niedrigem Seitenverhältnis im Vergleich zu anderen, so dass ich ein sehr feinen Gitter von Punkten benötigen würde, wenn ich es auf diese Weise tun werde.

vorschlagen kann jemand eine effiziente Möglichkeit, auf diese Weise setzen definierte Zellen in ein statisches 3D-Modell? Gibt es eine Art Bibliothek, die mit dieser Art von Geometrie-Spezifikation arbeitet, die 3D-Maschen für mich bauen kann? Bin ich etwas fehlt offensichtlich?

Danke, Nick

War es hilfreich?

Lösung

Als generelles Problem, das ist ziemlich schwierig: Ich denke, es ist im Grunde ein allgemeines nicht-lineares Programmierproblem. Wenn Ihre Grenzen durch beliebige Funktionen erzeugt werden, es könnte eine beliebige Anzahl von Zellen, die durch selbst eine solche Funktion begrenzt sein; ohne weitere Informationen zu den Funktionen, glaube ich nicht, dass Sie besser machen können als Gitterpunkte zu überprüfen.

Wenn Sie etwas über Ihre Funktion kennen (zum Beispiel Ebene, Kugel, Zylinder und Kegel sind alle conics), können Sie in der Lage sein, besser zu machen. In jedem Fall sollten Sie mit einem kombinatorischen Ansatz beginnen; sagen wir, da alle drei Grenzen, festzustellen, ob es irgendwelche Punkte gibt, wo alle drei kreuzen.

In jedem Fall, sobald Sie Ecken und Ränder der Zelle identifizieren, können Sie einen gitterbasierte Ansatz verwenden, um eine Anzeige aufzubauen Netz - beispielsweise in Scheiben schneiden Ihre Oberfläche mit der Achse ausgerichteten Ebenen, die Vertices und Dreiecken zu bestimmen, senden Sie Ihre 3D-Grafikbibliothek der Wahl.


Eine andere Idee: da Sie Ihre Oberflächen von f(x,y,z)=0 definieren, können Sie mit einer Reihe von Punkten beginnen, und sie numerisch wandern auf in der Nähe Oberflächen 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)

Etwas Ähnliches sollten Sie ungefähre Kanten- und Eckenpunkte ermöglichen. Es könnte schwieriger sein, um herauszufinden, wie diese Art von Punkten in ein Netz zu verbinden, obwohl ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top