Hallo, ich versuche zur Zeit mir eine eigene Collisionsfunktion zu schreiben, da ich bisher noch durch die Wände meiner Räume laufen kann. Die Funktion sieht zur Zeit so aus:
Code:
FUNCTION TForm1.Collision(posX,posZ:Single):Boolean;
VAR
WallCount:Integer;
CollisionCount:Integer;
d:Single;
c:Single;
n: TVector;
M: TVector;
FUNCTION Abstand(i:Integer):Single;
BEGIN
n.X:=-WallVectors[i].Z;
n.Y:=0;
n.Z:= WallVectors[i].X;
c := WallVectors[i].Start.X*n.X+WallVectors[i].Start.Z*n.Z;
Result :=abs((1/sqrt(n.x*n.x+n.z*n.z))*(n.X*(posX/100)+n.Z*(posZ/100)+c));
Zur Erklärung:
Mein Ansatz ist, dass ich auf Schnitt zwischen Kugel und Ebene prüfe. Die Ebene ist meine Wand und die Kugel (Radius = 1) bin ich selber. Nun gehe ich jede Wand durch und teste ob der Abstand von meiner Position zur Wand kleiner ist als mein Radius (Function Abstand). Ist dies der Fall, berechne ich mir den Mittelpunkt des entstandenen Schnittkreises (Function CenterPoint) und teste ob der Mittelpunkt auf der Wand liegt oder nur in der Ebene liegt. Das ganze ist im 3D Bereich. Wer sich jetzt wundert, wo die Y-Komponenten geblieben sind, Y ist immer 0 und das wird sich auch nie ändern.
Mein Problem ist nun, dass ich trotzdem noch durch meine Wände laufen kann. Kann mir einer sagen wo mein Fehler liegt?
Registriert: Di Nov 26, 2002 22:12 Beiträge: 259 Wohnort: Dresden
Was genau machst du denn, wenn du feststellst, dass eine Kollision stattgefunden hat?
Außerdem solltest du vielleicht darüber nachdenken Informationen zur kollidierenden Ebene zurückzuliefern um beispielsweise Sliding zu realisieren
_________________ Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650
Registriert: Di Nov 26, 2002 22:12 Beiträge: 259 Wohnort: Dresden
Kann es sein, dass die Variablen movX und movY lokale Variablen sind und beim Aufruf der Collisionsfunktion noch nicht den korrekten Wert enthalten?
Ich kann nur spekulieren, weil ich nicht genau weiß, wie du deine Geometrie verwaltest. Ich verstehe z.B. nicht warum du in deiner Abstandsfunktion die neuen Positionsdaten mit 1/100 skalierst. Außerdem machst du es den Helfern leichter, wenn du bestimmte Funktionen wie z.B. VectorDotProduct etc. Verwendest, denn damit machst du den Code wesentlich übersichtlicher (Kommentare machen es sicher auch).
Aus dem Grund gebe ich dir einfach mal den Code, wie ich es machen würde.
Code:
//Ermittelt den Abstand zwischen einem Punkt und einer Ebene
function Distance_Point_Plane(const Point, PlaneNormal:TVector3f;const PlaneOriginDist:Single):Single;
begin
Result := VectorDotProduct(Point, PlaneNormal)+ PlaneOriginDist;
end;
//Prüft ob eine Ebene eine Kugel schneidet
function Intersection_Plane_Sphere(const PlaneNormal, SphereCenter:TVector3f;const PlaneOriginDist, SphereRadius:Single;var Distance:Single):Boolean;
if Intersection_Sphere_Wall(SpielerPosition, SpielerRadius,@WallVectors[i])then
begin
Result :=True;
Exit;
end;
Result:=False;
end;
Da deine Geometrie statisch ist kannst du hier und da noch optimieren. Obgleich ich deinen konkreten Fehler nicht finden konnte hoffe ich, dass dir die Codesnippets etwas weiter helfen. Da deine Geometrie jedoch wirklich sehr einfach ist empfehle ich dir einfach mal im Compiler das Kollisionssystem Schritt für Schritt nachzuvollziehen. Das dürfte sich noch recht leicht machen lassen. Vielleicht stimmen ja bei dir die Normalen nicht oder ein anderer kleiner Fehler hat sich eingeschlichen.
_________________ Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650
Hi.
Erstmal danke für deine Hilfe. Ich denke ich habe den Fehler schon gefunden. Ich weiß nur noch nicht so genau wie ich ihn beheben soll. Aber da werde ich schon was finden.
Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.