Autor Beitrag
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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...

ausblenden 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 user profile iconUGrohne: Topic aus Sonstiges (Delphi) verschoben am Mi 01.02.2006 um 18:24
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 01.02.06 18:44 
Die hessische Normalform ist ja bekanntermaßen:

ausblenden Quelltext
1:
ax + by + cz = d					


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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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:

ausblenden Quelltext
1:
2:
3:
a b c
d e f
g h i


Ergibt

ausblenden 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:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 47

Win XP
D7 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 47

Win XP
D7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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.