Autor Beitrag
Logiqu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Win XP
Delphi 2006 Pro
BeitragVerfasst: Di 04.02.03 10:20 
Hi!

Ich versuche zur Zeit ein Spiel zu schreiben und hänge an einer lauffähigen Kollisionsabfrage fest. Ich habe jetzt schon etwa 3 fertige ausprobiert, aber keine davon läuft richtig. Der Schwerpunkt liegt dabei bei der Berechnung des Durchstoßpunktes einer Geraden (durch 2 Punkte definiert) durch eine Ebene (durch 3 Punkte, bzw. 1 Normale und den Stützvektor gegeben). Wenn mir da jemand Source posten könnte, wäre das wirklich nett!

MfG, Logiqu!
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: Di 04.02.03 13:13 
Wo ist das Problem? Du hast eine Gerade in Parameterform vorliegen, und die Ebene kann ebenfalls einfach in Parameterform umgewandelt werden.
Dann ist das ganze ein Gleichungssystem mit drei Unbekannten, und das kannst du beliebig auflösen.
Falls du also Probleme mit der Mathematik dahinter hast:

Gerade: x = p1 + s * (p2 - p1)
(wobei p1 und p2 die Punkte sind, s der Parameter und x der Funktionswert (Vektor))

Ebene: x = p1 + t * (p2 - p1) + u * (p3 - p1)
(wobei wiederum p1, p2 und p3 die drei Punkte sind, t und u die Parameter und x der Funktionswert)

und jetzt setzt du die beiden gleich:
p1 + s * (p2 - p1) = p1 + t * (p2 - p1) + u * (p3 - p1)

Voilà, drei Gleichungen mit drei Unbekannten (drei Gleichungen, weil die Vektoren drei Komponenten haben). Und das kannst du jetzt zum Beispiel mit dem Gauss'schen Algorithmus, Determinanten oder Matrixverfahren auflösen. Das Resultat sind die Parameterwerte für s, t und u für den Durchstoßpunkt. Jetzt kannst du s in die Geradengleichung einsetzen.


Wenn die Mathematik gar nicht dein Problem war oder meine Beschreibung dir nicht weiterhilft, kann ich dir vielleicht auch noch Code schreiben - aber vielleicht hilft dir das ja auch, den Code selbst zu schreiben.

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
Logiqu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Win XP
Delphi 2006 Pro
BeitragVerfasst: Di 04.02.03 13:55 
Ja, das mit den Gleichungssystemen hatte ich auch schon in den Source umgesetzt. Dadurch entstehen aber auch Situationen, bei denen Division durch Null raus kommen könnte. Es soll da wohl auch Möglichkeiten mit dem Skalarprodukt bzw. Vektorprodukt geben. Aber das hat bei mir noch nicht recht geklappt. Na ja, zur Not werde ich mich halt selber dran setzen müssen und ein paar Formeln austüfteln...

MfG, Logiqu!
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Di 04.02.03 16:26 
Hi,

schau mal auf www.sulaco.co.za.
Dort gibt es für genau das was du brauchst eine fertige Unit :)

Au'revoir,
Aya~

_________________
Aya
I aim for my endless dreams and I know they will come true!
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: Do 06.02.03 13:15 
@Logiqu:
Du hast Recht. Meine Formelsammlung (Papula) gibt als Formel für den Ortsvektor des Durchstoßpunktes an:

rs = r1 + (n * (r0 - r1) / (n * a)) * a

wobei * für das Punktprodukt (Skalarprodukt) steht, r1 der Stützvektor der Geraden und a der Richtungsvektor der Geraden sind, und n und r0 der Normalen- bzw. Stützvektor der Ebene sind. Wenn a * n = 0 ergibt und somit eine Division durch Null auftritt (a senkrecht auf n), findet gar kein Schnitt statt, daher kannst du diesen Fall auch einfach weglassen ;c)

Den Winkel kannst du natürlich aus dem Skalarprodukt berechnen:
Winkel = arcsin(|n*a|/(|n|*|a|))

Vielleicht verwendest du ja jetzt die genannte fertige Unit, aber vielleicht gehörst du wie ich auch zu den Freaks, die so was lieber selbst schreiben ;c)

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
Logiqu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43

Win XP
Delphi 2006 Pro
BeitragVerfasst: Fr 07.02.03 10:16 
Hi!

Die Kollisions-Abfrage von www.sulaco.co.za ist wirklich klasse! Ich habe sie jetzt in mein Spiel implementiert und sie läuft wirklisch schön schnell. Ein paar Kleinigkeiten muss ich nur noch verändern, aber das ist halb so wild. Also echt ein riesen Dank für den Link!

MfG, Logiqu!