[gelöst]Mesh in Scheiben zerlegen
[gelöst]Mesh in Scheiben zerlegen
Guten Morgen ZFX'ler,
mal wieder eine Frage.
Ich habe ein 3D-Model, Mesh.
Diesen möchte ich in entlang einer Achse in "Scheiben" schneiden.
Die Draufsicht diesen Querschnitts möchte ich dann als Bild speichern.
Am Ende möchte ich dann eine Sequenz-Folge von Bildern haben die die Schichten des Meshes Scheibe für Scheibe darstellen.
Ich hoffe das Problem konnte ich verständlich beschreiben.
Das Speichern eines Querschnitts als Bild ist dabei nicht so das Problem.
Das Problem ist eher, wie ich diesen Querschnitt/Scheiben mache...
Gruß
mal wieder eine Frage.
Ich habe ein 3D-Model, Mesh.
Diesen möchte ich in entlang einer Achse in "Scheiben" schneiden.
Die Draufsicht diesen Querschnitts möchte ich dann als Bild speichern.
Am Ende möchte ich dann eine Sequenz-Folge von Bildern haben die die Schichten des Meshes Scheibe für Scheibe darstellen.
Ich hoffe das Problem konnte ich verständlich beschreiben.
Das Speichern eines Querschnitts als Bild ist dabei nicht so das Problem.
Das Problem ist eher, wie ich diesen Querschnitt/Scheiben mache...
Gruß
Zuletzt geändert von joggel am 26.03.2014, 09:14, insgesamt 1-mal geändert.
- Schrompf
- Moderator
- Beiträge: 5164
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Mesh in Scheiben zerlegen
Ein Mesh ist ja nur eine Oberfläche aus Dreiecken. Was erwartest Du denn in den Zwischenräumen zu sehen?
Die schnelle Lösung:
- Orthogonalprojektion aufstellen
- mit zwei Clipping Planes jeweils eine Scheibe isolieren
- rendern
Aber ich bin recht sicher, dass Du das Ergebnis davon nicht gebrauchen kannst. Was willst Du denn eigentlich erreichen?
Die schnelle Lösung:
- Orthogonalprojektion aufstellen
- mit zwei Clipping Planes jeweils eine Scheibe isolieren
- rendern
Aber ich bin recht sicher, dass Du das Ergebnis davon nicht gebrauchen kannst. Was willst Du denn eigentlich erreichen?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Re: Mesh in Scheiben zerlegen
Vor allem wo willst du es erreichen? In deinem Renderprogramm oder in einem Spiel? Mir fiele spontan Boolean ein, mit einer 3D Textur. Also Prozedural.
Re: Mesh in Scheiben zerlegen
Schrompf:
Danke. Das hört sich schon mal gut an. Werde ich mal probieren.
Jedoch habe ich dabei bedenken das wenn eine Fläsche genau senkrecht zur Clipping-Plane steht, man keine kante sieht, und um die kanten geht es ja gerade...
Und zum anwendungsfall, ihr neugieriges pack :D
3D-Drucker.
Die "drucken" ja schicht-weise...
Danke. Das hört sich schon mal gut an. Werde ich mal probieren.
Jedoch habe ich dabei bedenken das wenn eine Fläsche genau senkrecht zur Clipping-Plane steht, man keine kante sieht, und um die kanten geht es ja gerade...
Und zum anwendungsfall, ihr neugieriges pack :D
3D-Drucker.
Die "drucken" ja schicht-weise...
Zuletzt geändert von joggel am 22.03.2014, 23:54, insgesamt 1-mal geändert.
Re: Mesh in Scheiben zerlegen
Hm, mit 3D Druck kenne ich mich leider nicht aus. Blender hat aber ein Toolset zur Meshaufbereitung für den 3D Druck mit dabei. Muss man nur in den Preferences aktivieren. Vielleicht ist da ja schon dabei was du suchst :)
http://wiki.blender.org/index.php/Exten ... intToolbox
http://wiki.blender.org/index.php/Exten ... intToolbox
Re: Mesh in Scheiben zerlegen
Du findest erst mal alle assoziierten Kanten raus.
Dann prüfst du jedes Dreieck, ob es sich mit der Ebene schneidet. Im Falle dass sie sich schneiden, hast du eine Strecke. Diese Strecken kannst du anhand der Kantenassoziationen dann zu einer Außenkante zusammenpuzzeln. (beide Eckpunkte der Strecke sind jeweils auf derKante eines Dreiecks)
Dann prüfst du jedes Dreieck, ob es sich mit der Ebene schneidet. Im Falle dass sie sich schneiden, hast du eine Strecke. Diese Strecken kannst du anhand der Kantenassoziationen dann zu einer Außenkante zusammenpuzzeln. (beide Eckpunkte der Strecke sind jeweils auf derKante eines Dreiecks)
http://fedoraproject.org/ <-- freies Betriebssystem
http://launix.de <-- kompetente Firma
In allen Posts ist das imo und das afaik inbegriffen.
http://launix.de <-- kompetente Firma
In allen Posts ist das imo und das afaik inbegriffen.
Re: Mesh in Scheiben zerlegen
:? ... was heißt hier "assoziiert"? sorryantisteo hat geschrieben:Du findest erst mal alle assoziierten Kanten raus.
Re: Mesh in Scheiben zerlegen
Also... nach etwas recherchieren kam ich zu diesem Projekt, welches wohl u.A. das oben beschrieben Problem behandeln kann:
http://www.cgal.org/
http://www.cgal.org/
Re: Mesh in Scheiben zerlegen
Da brauchst du eigentlich keine komplette Lib für, der Algo ist recht einfach.
Sagen wir, die Schnittebenen sind auf der x/y-Ebene, der z-Wert stellt die Höhe der aktuellen Schnittebene dar.
- Teste für jedes Dreieck die Z-Werte dessen Vertices gegen den Z-Wert der Ebene.
- Wenn alle größer oder alle Kleiner sind, verwirf das Dreieck.
- Wenn einer drunter und zwei darüber liegen (oder umgekehrt), wird das Dreieck von der Ebene geschnitten. Das kannst du dir mal zur Hilfe von der Seite auf ein Blatt Papier skizzieren (2D- Dreieck mit horizontal schneidender Geraden).
- Du hast nun 2 Schnittpunkte; die beiden betreffenden Dreieckskanten kannst du dir durch den einzel liegenden Punkt herleiten: Wenn a auf einer Seite der Ebene liegt und b und c auf der anderen, sind die geschnitten Kanten a-b und a-c.
- Betrachte nun a-b. Berechne die Distanz der beiden Vertices zur Ebene (das ist einfach nur die Differenz der Z-Werte zur Ebene; in der 2D-Skizze die Senkrechte zwischen Vertex und Ebenenlinie)
- Das Verhältnis der beiden Distanzen da und db entspricht dem Verhältnis a-s und s-b, wenn s der gesuchte Schnittpunkt ist. Also einfach ein lerp für die Strecke a-b durchführen, um den Punkt zu berechnen.
- Dasselbe mit a-c, dann eine Linie zwischen den beiden gefundenen Punkten zeichnen, das ist die Schnittlinie mit der Ebene.
- Wenn alle Dreiecke auf diese Art geprüft sind, hast du ein Schnittbild deines Meshes als Liniengrafik.
Wenn du keine vollständigen Polygone zur Weiterverarbeitung brauchst und dir die einzelnen Linienstücke reichen, brauchst du nicht mehr zu machen (optisch dasselbe).
Wenn doch, würde vermutlich ein Vergleich aller Schnittpunkte einer Ebene gehen (Duplikate finden und entsprechend einen Linienzug zusammensetzen).
Wenn die Geometrie komplizierter wird und das evtl. nicht funktioniert, musst du zuerst die geschnittenen Polygone finden, die sich eine Kante teilen, dann hast du auch deine Verbindungsinformation. Das war wohl mit assoziierten Kanten gemeint.
P.S.: Speziell für deinen Anwendungsfall musst du ja auch sehr flache Dreiecke beachten (bis hin zur Z-Parallelen). Ich würde es daher also mit einer Kombi versuchen:
Schnittlinien der letzten Ebene plus Schnittlinien der aktuellen Ebene plus near/far-Clipping für die dazwischenliegenden Flächen.
Sagen wir, die Schnittebenen sind auf der x/y-Ebene, der z-Wert stellt die Höhe der aktuellen Schnittebene dar.
- Teste für jedes Dreieck die Z-Werte dessen Vertices gegen den Z-Wert der Ebene.
- Wenn alle größer oder alle Kleiner sind, verwirf das Dreieck.
- Wenn einer drunter und zwei darüber liegen (oder umgekehrt), wird das Dreieck von der Ebene geschnitten. Das kannst du dir mal zur Hilfe von der Seite auf ein Blatt Papier skizzieren (2D- Dreieck mit horizontal schneidender Geraden).
- Du hast nun 2 Schnittpunkte; die beiden betreffenden Dreieckskanten kannst du dir durch den einzel liegenden Punkt herleiten: Wenn a auf einer Seite der Ebene liegt und b und c auf der anderen, sind die geschnitten Kanten a-b und a-c.
- Betrachte nun a-b. Berechne die Distanz der beiden Vertices zur Ebene (das ist einfach nur die Differenz der Z-Werte zur Ebene; in der 2D-Skizze die Senkrechte zwischen Vertex und Ebenenlinie)
- Das Verhältnis der beiden Distanzen da und db entspricht dem Verhältnis a-s und s-b, wenn s der gesuchte Schnittpunkt ist. Also einfach ein lerp für die Strecke a-b durchführen, um den Punkt zu berechnen.
- Dasselbe mit a-c, dann eine Linie zwischen den beiden gefundenen Punkten zeichnen, das ist die Schnittlinie mit der Ebene.
- Wenn alle Dreiecke auf diese Art geprüft sind, hast du ein Schnittbild deines Meshes als Liniengrafik.
Wenn du keine vollständigen Polygone zur Weiterverarbeitung brauchst und dir die einzelnen Linienstücke reichen, brauchst du nicht mehr zu machen (optisch dasselbe).
Wenn doch, würde vermutlich ein Vergleich aller Schnittpunkte einer Ebene gehen (Duplikate finden und entsprechend einen Linienzug zusammensetzen).
Wenn die Geometrie komplizierter wird und das evtl. nicht funktioniert, musst du zuerst die geschnittenen Polygone finden, die sich eine Kante teilen, dann hast du auch deine Verbindungsinformation. Das war wohl mit assoziierten Kanten gemeint.
P.S.: Speziell für deinen Anwendungsfall musst du ja auch sehr flache Dreiecke beachten (bis hin zur Z-Parallelen). Ich würde es daher also mit einer Kombi versuchen:
Schnittlinien der letzten Ebene plus Schnittlinien der aktuellen Ebene plus near/far-Clipping für die dazwischenliegenden Flächen.
Re: Mesh in Scheiben zerlegen
Wenn dich am Ende eh nur die Voxel interessieren, dann könntest du auch direkt mittels Scan-Line-Verfahren arbeiten. Hat eine Ebene NxN Pixel, so müsstest du pro Ebene N Strahlen durch das Model schießen und die Schnittpunkte mit den Dreiecken bestimmen. Damit nicht ständig alles neu berechnet werden muss, kann man hier auch ein wenig optimieren. Zum Beispiel nur die Dreiecksliste aktualisieren, wenn bei einem Schritt zur Seite (oder nach oben) ein Dreieck verlassen oder ein neues betreten wird. Oder erst pro Ebene die Schnittlinien zwischen Ebene und Dreiecken bestimmen und nur noch diese Schnittlinien gegen die Strahlen testen. Damit entledigt man sich den Sonderfällen und kann prima parallelisieren. Problematisch ist natürlich, dass das Verfahren wahrscheinlich viel Prozessor frisst.
Re: Mesh in Scheiben zerlegen
Jedes Dreieck hat 3 Ecken (A, B, C) und 3 Kanten (A-B, B-C, C-A). Zwei Kanten zweier Dreiecke (ABC, DEF) sind assoziiert, wenn sie in dieselben Ecken involviert sind (z.B. A=E und B=D). Die Dreiecke also Kante an Kante liegen.joggel hat geschrieben::? ... was heißt hier "assoziiert"? sorryantisteo hat geschrieben:Du findest erst mal alle assoziierten Kanten raus.
http://fedoraproject.org/ <-- freies Betriebssystem
http://launix.de <-- kompetente Firma
In allen Posts ist das imo und das afaik inbegriffen.
http://launix.de <-- kompetente Firma
In allen Posts ist das imo und das afaik inbegriffen.
Re: Mesh in Scheiben zerlegen
Eventuell lohnt es sich, zuerst das Model transformieren, sodass du als Schnittebene z.b. die y-/z-Achse hast (x=0).
Dann lässt sich das leichter berechnen, weil du die Formel vereinfachen kannst.
Zudem willst du beim Drucken ja den Schnitt quasi schrittweise verschieben nehme ich an; wenn sich die erste Scheibe bei x=0 befindet, dann kannst du das Mesh sehr einfach entlang der x-Achse verschieben, um die anderen Scheiben zu bekommen.
Dann lässt sich das leichter berechnen, weil du die Formel vereinfachen kannst.
Zudem willst du beim Drucken ja den Schnitt quasi schrittweise verschieben nehme ich an; wenn sich die erste Scheibe bei x=0 befindet, dann kannst du das Mesh sehr einfach entlang der x-Achse verschieben, um die anderen Scheiben zu bekommen.
Re: Mesh in Scheiben zerlegen
@antistio
Ah, verstehe. Dank.
@joeydee
Danke für die Beschreibung, werde ich mir mal genauer anschauen...
Ansonsten reicht das erstmal an Information.... :)
Ah, verstehe. Dank.
@joeydee
Danke für die Beschreibung, werde ich mir mal genauer anschauen...
Ansonsten reicht das erstmal an Information.... :)