[gelöst]Mesh in Scheiben zerlegen

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
joggel

[gelöst]Mesh in Scheiben zerlegen

Beitrag von joggel »

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ß
Zuletzt geändert von joggel am 26.03.2014, 09:14, insgesamt 1-mal geändert.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Mesh in Scheiben zerlegen

Beitrag von Schrompf »

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?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Tiles
Establishment
Beiträge: 1990
Registriert: 11.01.2003, 13:21
Kontaktdaten:

Re: Mesh in Scheiben zerlegen

Beitrag von Tiles »

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.
Free Gamegraphics, Freeware Games https://www.reinerstilesets.de
Die deutsche 3D Community: https://www.3d-ring.de
joggel

Re: Mesh in Scheiben zerlegen

Beitrag von joggel »

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...
Zuletzt geändert von joggel am 22.03.2014, 23:54, insgesamt 1-mal geändert.
Benutzeravatar
Tiles
Establishment
Beiträge: 1990
Registriert: 11.01.2003, 13:21
Kontaktdaten:

Re: Mesh in Scheiben zerlegen

Beitrag von Tiles »

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
Free Gamegraphics, Freeware Games https://www.reinerstilesets.de
Die deutsche 3D Community: https://www.3d-ring.de
antisteo
Establishment
Beiträge: 854
Registriert: 15.10.2010, 09:26
Wohnort: Dresdem

Re: Mesh in Scheiben zerlegen

Beitrag von antisteo »

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)
http://fedoraproject.org/ <-- freies Betriebssystem
http://launix.de <-- kompetente Firma
In allen Posts ist das imo und das afaik inbegriffen.
joggel

Re: Mesh in Scheiben zerlegen

Beitrag von joggel »

antisteo hat geschrieben:Du findest erst mal alle assoziierten Kanten raus.
:? ... was heißt hier "assoziiert"? sorry
joggel

Re: Mesh in Scheiben zerlegen

Beitrag von joggel »

Also... nach etwas recherchieren kam ich zu diesem Projekt, welches wohl u.A. das oben beschrieben Problem behandeln kann:
http://www.cgal.org/
joeydee
Establishment
Beiträge: 1044
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Mesh in Scheiben zerlegen

Beitrag von joeydee »

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.
EyDu
Establishment
Beiträge: 100
Registriert: 24.08.2002, 18:52
Wohnort: Berlin
Kontaktdaten:

Re: Mesh in Scheiben zerlegen

Beitrag von EyDu »

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.
antisteo
Establishment
Beiträge: 854
Registriert: 15.10.2010, 09:26
Wohnort: Dresdem

Re: Mesh in Scheiben zerlegen

Beitrag von antisteo »

joggel hat geschrieben:
antisteo hat geschrieben:Du findest erst mal alle assoziierten Kanten raus.
:? ... was heißt hier "assoziiert"? sorry
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.
http://fedoraproject.org/ <-- freies Betriebssystem
http://launix.de <-- kompetente Firma
In allen Posts ist das imo und das afaik inbegriffen.
NytroX
Establishment
Beiträge: 364
Registriert: 03.10.2003, 12:47

Re: Mesh in Scheiben zerlegen

Beitrag von NytroX »

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.
joggel

Re: Mesh in Scheiben zerlegen

Beitrag von joggel »

@antistio
Ah, verstehe. Dank.

@joeydee
Danke für die Beschreibung, werde ich mir mal genauer anschauen...

Ansonsten reicht das erstmal an Information.... :)
Antworten