Autor |
Beitrag |
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 01.02.06 17:52
Hallo allesamt,
für mein (wahrscheinlich niemals vollendetes) Direct3D-Spiel habe ich vor Anno-dazumal eine simple Kollisionserkennung geschrieben, es wird einfach jedes Objekt mit einer Box umgeben, und die Boxen werden auf Kollision geprüft.
Die Definition einer solchen Box liegt als ein 6-Elemente-Array aus einem Ebenen-Record vor, ein Ebenen-Rekord setzt sich zusammen aus einem Positionsvektor und einem Normalenvektor (Hessesche Normalform).
Nun wollte ich mal diese Boundingbox rendern, und frage mich plötzlich, wie ich nun eigentlich an die 8 Eckpunkte der Box komme. Ich muss ja eigentlich immer den Schnittpunkt von jeweils 3 der Box-Ebenen berechnen, also eine Funktion...
Delphi-Quelltext 1: 2: 3: 4:
| function Schnittpunkt(const Ebene1,Ebene2,Ebene3:TEbene):T3DVektor; begin ... end; |
mit Leben füllen. Nur, Mathematikunterricht liegt so arg lang zurück, ich kriege irgendwie keinen Anfang... Hat irgendjemand einen Tip für mich?
Die Normalvektoren der übergebenden Ebenen sind nicht unbedingt orthogonal zueinander, aber niemals parallel.
Cu,
Udontknow Moderiert von UGrohne: Topic aus Sonstiges (Delphi) verschoben am Mi 01.02.2006 um 18:24
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 01.02.06 18:44
Die hessische Normalform ist ja bekanntermaßen:
Quelltext
Wobei sich d aus einem Punkt ergibt, der auf dieser Ebene liegt (einfach durch einsetzen und ausrechnen)
Um jetzt an die 8 Eckpunkte des Würfels, der durch deine Ebenen beschrieben wird, zu kommen, stellst Du folgendes Gleichungssystem auf:
Quelltext 1: 2: 3:
| a1 * x + b1 * y + c1 * z = d1 a2 * x + b2 * y + c2 * z = d2 a3 * x + b3 * y + c3 * z = d3 |
Wobei a1, b1, c1 und d1 die Werte der ersten Ebene, a2, b2, c2 und d2 die der zweiten und a3, b3, c3 und d3 die der dritten Ebene sind.
Dieses Lineare Gleichungssystem musst Du einfach (z.B. mit Gauß oder nach Kramer) lösen.
Am Ende erhältst Du für x, y und z die koordinaten des Schnittpunkts der Ebenen (oder eben kein Ergebnis, wenn es keinen eindeutigen Schnittpunkt gibt).
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Mi 01.02.06 19:00
Hallo
ein Wuerfel hat 6 Ebenen die paarweise parallel sind.
Aber hat man einen Schnittpunkt sind die Verschiebungsverktoren der parallelen Ebenen(Die Differenz der Aufpunkte) gleich den aufspannenenden Vektoren des Quaders.
Damit kann man dan die anderen Punkte leicht bestimmen.
Gruss Horst
|
|
Udontknow 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 01.02.06 19:15
Hmmm, das wäre eine Möglichkeit, allerdings wollte ich es so halten, daß diese Box nicht unbedingt ein Würfel sein muß (also daß die Vektoren nicht unbedingt orthogonal zueinander sind).
Cu,
Udontknow
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 01.02.06 19:43
@UDontKnow: Würde bei meiner Version funzen. Allerdings ist der Rechenaufwand für 24 Determinanten nach Sachus (beim Lösen über Kramer) nicht unbedingt das schnellste.
Zu den Determinanten:
Eine Determinante einer 3x3-Matrix berechnet sich wie folgt:
Quelltext
Ergibt
Delphi-Quelltext 1:
| D := a*e*i + b*f*g + c*d*h - c*e*g - b*d*i - a*f*h |
Wobei die 4 zu berechnenden Determinanten folgende wären:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| Matrix 1 (Ergibt DM): a1 b1 c1 a2 b2 c2 a3 b3 c3
Matrix 2 (Ergibt Dx): d1 b1 c1 d2 b2 c2 d3 b3 c3
Matrix 3 (Ergibt Dy): a1 d1 c1 a2 d2 c2 a3 d3 c3
Matrix 4 (Ergibt Dz): a1 b1 d1 a2 b2 d2 a3 b3 d3 |
Die Lösungspunkte wären dann:
Delphi-Quelltext 1: 2: 3:
| x := Dx / DM; y := Dy / DM; z := Dz / DM; |
Für DM <> 0. Der Fall DM = 0 würde bedeuten, dass sich die 3 Ebenen nicht in einem Punkt schneiden.
Und diese Berechnung für alle Ebenen-Kombinationen ausführen (insgesamt also 8 Schnittpunkt-Berechnungen, die insgesamt 32 Determinanten-Lösungen und 24 Divisionen benötigen.
Insgesamt solltest Du daher auf folgende Stats kommen:
- 8 Schnittpunkt-Berechnungen
- 8 Zahlenvergleiche (Zur Überprüfung)
- 24 Divisionen
- 32 Determinanten
- 192 Multiplikationen
- je 64 Additionen und Subtrktionen
Sachus lässt sich durch Ausklammern noch etwas optimieren, was aber den Rechenaufauch nicht wirklich reduziert.
Hoffe diese Anleitung hilft erstmal. Die 8 Gruppen zu untersuchender Ebenen solltest Du glaube selber rausfinden können *g*
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Mi 01.02.06 20:54
Hallo,
meine Aussage war zu ungenau, es muss sich kein >Wuerfel< ergeben .Es ergibt sich ein Spat (hoffe ich), also die gegenueberliegenden Seiten sind parallelverschobene Paralellogramme.
Das ist doch allgemein genug.
Der Punkt der diagonal dem Schnittpunkt gegenueberliegt ist Schnittpunkt + die drei Abstandsvektoren der parallelen Ebenen.
Grus Horst.
P.S.:
Wieder anders.
Der Schnitt der drei Ebenen erzeugt einen Schnittpunkt und drei Geraden.
Die Richtungsvektoren dieser Geraden ist dann auch der Richtungsvektoren der Kanten des Spates.
Jetzt richtig ?
|
|
Udontknow 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Do 02.02.06 15:58
Danke euch beiden, ich muss mir das mal in Ruhe am Wochenende ankucken.
@Horst_H: Also eigentlich kann diese Box jede beliebige Form annehmen, es müssen nicht unbedingt irgendwo rechte Winkel oder parallele Ebenen auftauchen... Vielleicht verstehe ich dich auch nur nicht richtig, muß mich wieder in Mathe einarbeiten.
Danke erstmal.
Cu,
Udontknow
|
|
Sors
      
Beiträge: 47
Win XP
D7 Prof
|
Verfasst: Do 16.03.06 20:49
Wenn du das Gauß-System löst, kann es sein, dass du keine Lösung erhälts (Ebenen parallel zueiander) oder du erhältst Unendlich als Lösung (Ebenen schneiden sich). Es gibt bei Ebenen keinen Schnittpunkt, sondern nur Schnittgeraden (unendlich viele Schnittpunkte) Wenn sich die beiden Ebenen schneiden erhältst du als Lösung deines Gauß-Systems eine Geradengleichung.
|
|
Udontknow 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 17.03.06 12:52
Hallo!
Ich kombiniere immer nur drei Ebenenen miteinander, von der keine parallel zu einer anderen ist, also müsste es immer ein Punkt sein, oder?
Edit: Nein, stimmt nicht.
Cu,
Udontknow
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 17.03.06 12:58
Jup, korrekt.
Sors und Horst gehen von Spaten aus. Siehe oben meinen Ansatz, der ist auf deine Anwendung aufgebaut...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Udontknow 
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 17.03.06 13:04
Hmmm, gut, es wird bei mir nicht auftauchen, aber theoretisch gesehen müssen sich drei beliebige Ebenen nicht an einem Punkt schneiden. Man stelle sich drei Ebenen vor, die auf X,Y-Projektion z.B. durch ihre Schnittpunkte (also Schnittgeraden im Raum) ein Dreieck bilden... Doof beschrieben, vielleicht versteht´s ja doch einer...
Cu,
Udontknow
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Fr 17.03.06 13:34
Hallo,
Du meinst in deinem Beispiel,dass die drei Ebenen ein unendlichlanges Prisma (hier Dreikant) begrenzen.
Dann haben die jeweiligen Schnittgeraden der Ebenen den gleichen Richtungsvektor a*V (a aus R).
Aber dann hast Du auch keinen Schnittpunk der dei Ebenen.
Hast Du so etwas schon gerechnet?
Gruss Horst
|
|
Sors
      
Beiträge: 47
Win XP
D7 Prof
|
Verfasst: Sa 18.03.06 14:05
Du meinst also, du verwendest keine unendlich großen Ebenen, sondern praktisch dreieckige "Ebenenausschnitte"?
Oder meinst du folgendes: Die Ebenen schneiden sich gegenseitig in einer Schnittgerade und schließen dadurch im Querschnitt eine Dreiecksfläche ein. Und die Eckpunkte dieser Dreiecksfläche meinst du mit Schnittpunkte?
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Sa 18.03.06 16:21
Seien die 3 Ebenen gegeben durch Aufhängepunkte p1, p2, p3 und Normalen n1, n2, n3.
Definiere M die Matrix mit den Spalten (oder Zeilen, ist egal) n1, n2, n3 und d deren Determinante d = det(M).
Ist d = 0, dann existiert kein eindeutiger Schnittpunkt, weil die Normalen nicht den gesamten Raum aufspannen ("Dreikant", parallele Ebenen).
Ist d <> 0, dann ist der eindeutige Schnittpunkt p gegeben durch:
p = (dot(p1,n1)*cross(n2,n3)-dot(p2,n2)*cross(n1,n3)+dot(p3,n3)*cross(n1,n2))/d
wobei dot() das Skalarprodukt und cross() das Kreuzprodukt ist.
Entspricht mathematisch der Methode von BenBE. Der Rechenaufwand ist so aber wahrscheinlich kleiner, da die Terme wegen der passenden geometrischen Interpretation bereits auf eine geschickte Weise zusammengefasst sind.
|
|
|