Ich schließe Abweichungen von "reinen OpenGL" und Fear2D aus:
Ein Vergleich von Koordinaten ist eher schlecht, da OpenGL im Idealfall mit Floats arbeitet und diese bekanntlich nicht exakt sind. Nehme einfach mal zwei Floats (s=1.0000 und x=1.43) rechne diese zusammen und Du erhälst 2.429999948 und damit einen Wert ungleich 2.43. Daher sind solche Abfragen zumeist nicht sinnvoll zu gebrauchen und insbesondere im Bereich der Kollisionsabfragen sogar sehr schädlich. So kann ein Objekt so schnell sein, dass es über die Grenze hinaus springt... und dann? Würde eine solche Abfrage niemals mehr den Ball bremsen und er nimmt seinen Kurs gen der Unendlichkeit.
Für Dich gäbe es also zwei sinnvolle Ansätze:
1. Wenn dein Schläger traditionell wie das Urpong auf einer Ebene liegt, so kannst Du es Dir leicht machen und einfach eine Abfrage a la
Delphi-Quelltext
1:
| if Ball.Position.x < Schlaeger_a.Position.x |
Sofern die Schlägerposition auch wirklich die "Schlagseite" ist. Auch versteht es sich von selbst, dass dies nur für den linken Schläger gilt.
2. Sofern Du Dich nicht auf einer Ebene befindest, so brauchst Du drei Punkte und die Position des Balles. Die Drei Punkte müssen auf der ebene der Schlagseite liegen! Hierfür solltest Du eine Vektor-Lib deines Vertrauens verwenden. Die Test-Funktion könnte wie folgt aussehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| function planePointDistance(p0,p1,p2,p:TVector3f):Single; var v,u,n: TVector3f; d: Single; distance: Single; begin v := vectorSubtract(p1,p0); u := vectorSubtract(p2,p0);
n := vectorCrossProduct(v,u); n := vectorNormalize(n);
d := vectorDotProduct(vectorScale(n,-1),p0);
distance :=vectorDotProduct(n,p)+d;
if distance < 0 then distance := distance *-1; result := distance; end; |
p0,p1,p2 sind Punkte auf der Schlägerebene (am besten: Schlägelinks runten, Schlägerrechts untten, Schläger links oben), sowie P als Position des Balles. Ist die Distanz kleiner als der Radius des Balles, fand eine Kollision statt. Beachte bitte, dass diese Funktion stets einen positive Distanz zurückgibt und damit ebenfalls übers Ziel hinausschießen könnte!
"Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."