Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

08.09.2011, 09:27

3D-Objekt schneiden

Hi,

ich würde (mal wieder ;-) ) ein paar Denkanstöße für ein Problem benötigen. Nehmen wir an, ich habe ein 3D-Objekt und möchte einen ebenen Schnitt durch dieses hindurch machen. Als Ergebnis dieses Schnittes soll die Outline der Schnittfläche zurückgeliefert werden (also ganz plump ein 2D-Objekt, welches die Schnittfläche beschreibt). D.h. wenn das 3D-Objekt beispielsweise ein Würfel mit einem kreisrunden Loch darin ist, dann wäre das Ergebnis ein Quadrat mit einem innen liegenden Kreis. Eine irgend wie geartete Beschreibung der geschlossenen Fläche innerhalb dieses Schnittes ist nicht notwendig, mir genügen wirklich die Seiten.

Eines meiner Probleme bei der Geschichte:

Wie ermittele ich, ob ich gerade eine Fläche schneide? Selbst wenn ich weiß, dass mein 3D-Modell jeden von einen geschlossenen Dreieck oder Viereck umgrenzten Bereich als geschlossene Fläche betrachtet - wie komme ich an die Kante, die sich aus dieser Fläche für mein 2D-Modell ergibt?

Danke schon mal für den investierten Gehirnschmalz!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

08.09.2011, 10:28

Unter der Annahme, dass Deine Objekte aus Dreiecken bestehen:

Jedes Dreieck legt eine Ebene fest.
Deine Schnittebene ist, wie der Name schon sagt, ebenfalls eine Ebene.

Zwei Ebenen kann man schneiden, und dann gibt es drei mögliche Fälle:
1. Sie sind parallel, aber verschieden -> kein Schnitt
2. Sie sind gleich -> dann liegt Dein Dreieck in der Schnittebene (musst Du definieren, was Du dann machen willst)
3. Sie schneiden sich in einer Geraden -> möglicher Schnitt zwischen Ebene und Dreieck

Fall 3 ist interessant.
Die Gleichung der Geraden kannst Du ermitteln, sie ergibt sich aus Ineinander-Einsetzen der beiden Ebenengleichungen (eine in Hessescher Normalform, die andere in der Parameterform Stützvektor + x*u + y*v). Siehe Wikipedia.
Da Du aber in Wirklichkeit ein Dreieck betrachtest und keine Ebene, musst Du diese Schnittgerade auf das Dreieck zurechtschneiden (clippen). Liegt sie komplett außerhalb des Dreiecks, dann gibt es keinen Schnitt. Nun hast Du die tatsächliche Schnittlinie.

Die meisten Dreiecke werden in Fall 3 enden, weil Ebenen sich ja immer schneiden, wenn sie nicht zufällig parallel sind.
Also sollte man das beschleunigen.

Ansätze zur Beschleunigung:
- Dreiecke des Objekts in kd-Baum oder andere räumliche Datenstruktur packen
- Hierarchischen Schnitttest zwischen Ebene und Bounding-Boxen der Knoten in Deiner Datenstruktur durchführen, erst ganz am Ende mit den Dreiecken selbst

3

08.09.2011, 13:38

Das hilft mir ja schon mal weiter - Danke!

4

21.09.2011, 11:51

So, jetzt habe ich meine Schnittgerade zwischen den beiden Ebenen ermittelt.

Im nächsten Schritt muss ich diese nun so zuschneiden, dass sie in eines der beiden Polygone passt, aus dem die eine Schnittebene definiert wurde. Dieses Polygon kann drei oder mehr Ecken haben, es ist aber in jedem Fall in sich eben.

Wie kriege ich das am besten gebacken, d.h. wie ermittele ich, ob die Gerade das Polygon überhaupt schneidet und wenn ja wie schneide ich die gerade dann zu einer passenden Linie?

Nachtrag: ich kann die Polygone auch zu Dreiecken umwandeln, wenn dass die Berechnung vereinfacht.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Elmi« (21.09.2011, 12:00)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

21.09.2011, 11:59

Da sich alles in einer Ebene abspielt, ist Dein Problem eigentlich nur zweidimensional.
Du kannst ja die Schnittgerade auf die Ebene des Polygons projizieren (also Stützvektor und Richtung im 2D-Koordinatensystem dieser Ebene darstellen).

Anschließend musst Du die Gerade auf das Polygon zurechtstutzen, bekommst dann also ein Segment (oder gar nichts, wenn das Polygon gar nicht getroffen wird).
Für konvexe Polygone ist das sehr simpel. Im Prinzip musst Du nur herausfinden, an welcher Stelle die Gerade eintritt und wo sie wieder austritt.

Hier wird beschrieben, wie das geht:
http://softsurfer.com/Archive/algorithm_…20and%20Polygon

Am Ende musst Du natürlich wieder zurück in den 3D-Raum transformieren.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

6

21.09.2011, 12:09

Du schneidest jede Seite des Polys mit der Schnittgeraden, jetzt kommts drauf an, ob dein Poly konvex ist oder auch konkav sein kann. Bei konvex hast du maximal 2 Punkte, zwischen denen dann die gesuchte Punktmenge liegt. Ansonsten kann es mehrere geben, du musst die Punkte dann ordnen und jeder Punkt wecheslt zwischen innen/aussen.

7

21.09.2011, 12:57

Da sich alles in einer Ebene abspielt, ist Dein Problem eigentlich nur zweidimensional.

...

Am Ende musst Du natürlich wieder zurück in den 3D-Raum transformieren.



Öhm...ja...oder doch nicht. Mein Dreieck (ich beschränke es jetzt einfach mal auf Dreiecke) liegt ja irgend wie im Raum, genau so wie die Schnittgerade. Wie kriege ich die jetzt in eine 2D-Ebene? Wild durch die Gegend rotieren kann es ja nicht sein, zumal ich nicht mal genau wüsste, wie die beiden im Raum verdreht sind...

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

8

21.09.2011, 13:01

Zwei Basisvektoren bestimmen, die diese Ebene ausspannen (i,j) und alle Punkte daruaf projezieren und als Linearkombination P=xi+yi ausdruecken. (x,y) sind deine 2D-Koordinaten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

21.09.2011, 13:24

Wenn es sich um Polygone handelt, dann kannst du auch einfach die Schnittpunkte der Seiten des Polygons mit der Ebene berechnen und fertig.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

21.09.2011, 13:31

Stimmt, das ist eigentlich viel einfacher :D
Bei einem konvexen Polygon sollte es entweder 0 oder 2 Schnittpunke zwischen den Seiten des Polygons und der Ebene geben.
Gibt es zwei, ziehe eine Linie zwischen ihnen.

Werbeanzeige