Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 19, 2025 16:42

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kollision mit schrägen flächen
BeitragVerfasst: Di Okt 30, 2007 20:47 
Offline
DGL Member

Registriert: Di Mär 27, 2007 18:47
Beiträge: 19
Ich arbeite gerade (wie so viele andere Auch) an einer eigenen 3D Engine.
Bis jetzt lief auch alles so zimlich wie geplant aber bei der Kollision mit schrägen flächen ist das ganze zimlich kompliziert geworden.
Da ich nicht genau weiß wie man einen 3D schnittpunkt ausrechnet wollte ich es so machen dass ich erst an den beiden enden der X achse den schnittpunkt suche und dann zwichen diesen beiden den schnittpunkt an der Y Achse.. Leider hat das nicht wirklich funktioniert wie es sollte....

ich hab das so gemacht:

Hier schaut das programm ob man sich über der fläche befindet (es gibt für alle 6 richtungen so einen programmschnipsel)
Code:
  1.  
  2.     //Y(Boden)
  3.     if SideX[i][1] <= PosX then
  4.     if SideZ[i][1] <= PosZ then///
  5.     if SideX[i][2] <= PosX then
  6.     if SideZ[i][2] >= PosZ then///
  7.     if SideX[i][3] >= PosX then
  8.     if SideZ[i][3] >= PosZ then///
  9.     if SideX[i][4] >= PosX then
  10.     if SideZ[i][4] <= PosZ then///Wenn die seite unter der Eigenen Position ist
  11.     begin
  12.       NSY := i;
  13.       GetColPoint3DY(i,Col.Y);
  14.     end;
  15.  


Das NSY := i hat hierfür nichts zu bedeuten ^^


Dann der Teil der diesen 3D Schnittpunkt finden soll:
Code:
  1. procedure GetColPoint3DY(Side: Integer; out Y: Real);
  2. var
  3.   X1,Y1,X2,Y2,X3,Y3: Real;
  4. begin
  5. GetColPoint(PosX,PosY,PosX,0,
  6.             SideZ[Side][1],SideY[Side][1],
  7.             SideZ[Side][2],SideY[Side][2],X1,Y1);
  8. GetColPoint(PosX,PosY,PosX,0,
  9.             SideZ[Side][3],SideY[Side][3],
  10.             SideZ[Side][4],SideY[Side][4],X2,Y2);
  11.  
  12. GetColPoint(PosX,PosY,PosX,0,
  13.             X1,Y1,X2,Y2,X3,Y);
  14. end;


Und Der Teil der den 2D schnittpunkt Finden Soll (Funktioniert)

Code:
  1.  
  2. procedure GetColPoint(X1,Y1,X2,Y2,X3,Y3,X4,Y4: Real; out SX,SY: Real);
  3. var
  4.   A1,B1,C1,
  5.   A2,B2,C2: Real;
  6. begin
  7. if X1 = X2 then X1 := 0;
  8. if Y1 = Y2 then Y1 := 0;
  9.  
  10. A1 := -(1/(X2-X1));
  11. B1 :=  (1/(Y2-Y1));
  12. C1 :=  (X1/(X2-X1)) - (Y1/(Y2-Y1));
  13.  
  14. A2 := -(1/(X4-X3));
  15. B2 :=  (1/(Y4-Y3));
  16. C2 :=  (X3/(X4-X3)) - (Y3/(Y4-Y3));
  17.  
  18. SX := (B1*C2-C1*B2) / (A1*B2-A2*B1);
  19. SY := (C1*A2-C2*A1) / (A1*B2-A2*B1);
  20. end;


und in diesem teil wird die kollision dann swchließlich angewendet
Code:
  1.  
  2. ...
  3.  
  4.   if PosY - 0.1 > Col.Y then SpeedY := SpeedY - 0.01 else
  5.   begin
  6.     SpeedY := 0;
  7.     PosY := Col.Y;
  8.   end;
  9.  
  10. ...
  11.  
  12. end;
  13.  


(vllt hab ich es ein bisschen unverständlich erklärt; einfach fragen wenn was unklar ist)
vllt hat jemand eine bessere lösung ODER zu viel zeit und kann sich das mal angucken? ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 30, 2007 21:03 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Schau mal bei den Links das CompGeo-Mathescript an. Dort steht wie man Schnittpunktberechnug macht.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 30, 2007 21:09 
Offline
DGL Member

Registriert: Di Mär 27, 2007 18:47
Beiträge: 19
hmm vllt bin ich einfach zu blöd aber iwie find ich da nix brauchbares


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 30, 2007 21:16 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Deine "schräge Fläche" ist eine Ebene. Du kennst mindestens 3 Punkte der Ebene. Damit kannst du sie in so ne Formel überführen.

Hier im Forum wurden auch schon diverse Kollisionsfasetten diskutiert. Such nochmal im Forum. da findest du bistimmt auch noch was.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 31, 2007 08:04 
Offline
DGL Member

Registriert: Di Mär 27, 2007 18:47
Beiträge: 19
Code:
  1. procedure GetColPoint3DY(Side: Integer; out Y: Real);
  2. var
  3.   x,z,X1,Z1,X2,Z2,X3,Z3: Real;
  4.   alpha,beta,gamma: Real;
  5. begin
  6. x := PosX;
  7. z := PosZ;
  8. X1 := SideX[Side][1];
  9. Z1 := SideZ[Side][1];
  10. X2 := SideX[Side][2];
  11. Z2 := SideZ[Side][2];
  12. X3 := SideX[Side][3];
  13. Z3 := SideZ[Side][3];
  14.  
  15. alpha:= ((z3-z1)*x+(x1-x3)*Z) /
  16.         ((x2-x1)*(z3-z1)-(x3-x1)*(z2-z1));
  17.  
  18. beta := ((z1-z2)*x+(x2-x1)*z) /
  19.         ((x2-x1)*(z3-z1)-(x3-x1)*(z2-z1));
  20.  
  21. gamma:= alpha*(z2-z2)+beta*(z3-z1);
  22.  
  23. Y := Gamma;
  24. end;
  25.  


das funktioniert jetzt soweit aber iwie is das ergebnis nicht ganz das was es sein soll...
anstadt auf der ebene runter zu laufen lauf ich hoch...


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]