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

Aktuelle Zeit: Do Jul 10, 2025 15:03

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: kollisionsabfrage richtig?
BeitragVerfasst: Mi Jun 07, 2006 20:46 
Offline
DGL Member

Registriert: Sa Feb 04, 2006 10:14
Beiträge: 21
hi

sorry aber ich hab schon wieder ne frage...
ich bin jetzt grad bei der kollision... und hab mir mal so ne kollisionsabfrage mit delphi gecodet...
es funkt nach dem prinzip von http://www.scherfgen-software.net/ oder zumindest sollte es das...

aber irgendwie is bei mir alles voll verbuggt stell ich grad so fest... auf jeden fall geht die kollision mal und mal net...
naja wenn ihr euch das mal anschauen würdet fänd ich das echt cool...

thx :D puma

ich hol mir die daten aus dateien und lad sie in arrays... rootcoll=dateien coordcoll=daten...

Code:
  1.  
  2. procedure collision;
  3. var x1,x2,x3,y1,y2,y3,u1,u2,u3,p1,p2,p3,a1,a2,a3,m1,m2,m3:real;
  4. var uu,r,f,al,s,d:real;
  5. var ii,i:integer;
  6. begin
  7.  
  8. for ii:=1 to high(rootcoll) do
  9. begin
  10. i:=6;
  11. while (i<=coordcoll[ii,1]) do
  12. begin
  13.  
  14. x1:=coordcoll[ii,i];
  15. x2:=-10.8;
  16. x3:=coordcoll[ii,i+1];
  17. i:=i+2;
  18. y1:=coordcoll[ii,i];
  19. y2:=-10.8;
  20. y3:=coordcoll[ii,i+1];
  21.  
  22. r:=0.5;
  23. m1:=-xpos;
  24. m2:=-ypos;
  25. m3:=-zpos;
  26.  
  27. Form1.Edit1.Text:=floattostr(m1);
  28. Form1.Edit2.Text:=floattostr(m2);
  29. Form1.Edit3.Text:=floattostr(m3);
  30.  
  31.  
  32. u1:=y1-x1;         // u
  33. u2:=y2-x2;
  34. u3:=y3-x3;
  35.  
  36. p1:=x1;            // p
  37. p2:=x2;
  38. p3:=x3;
  39.  
  40. a1:=(p1-m1);     // (p-m) = a
  41. a2:=(p2-m2);
  42. a3:=(p3-m3);
  43.  
  44. f:=a1*u1+a2*u2+a3*u3;  // u*a = f
  45.  
  46. uu:=u1*u1+u2*u2+u3*u3;     //u²
  47.  
  48. al:=a1*a1+a2*a2+a3*a3;
  49.  
  50. d:=f*f-(uu*(al-r*r));
  51.  
  52. Form1.Edit4.Text:=floattostr(d);
  53.  
  54. if (d<0) then
  55.         begin
  56.         end
  57.  
  58. else if (d <0.001) then
  59.         begin
  60.  
  61.         s:=(-f)/(uu);
  62.         Form1.Edit5.Text:=floattostr(s);
  63.         if (s<0) or (s>1) then
  64.                 begin
  65.                 end
  66.         else
  67.                 begin
  68.                 // berührung
  69.                         if GetAsyncKeyState(vk_down) <> 0 then
  70.                         begin
  71.                         xpos:= xpos-sin(degtorad(rotation))*timefactor *0.1;
  72.                         zpos:= zpos+cos(degtorad(rotation))*timefactor *0.1;
  73.                         end;
  74.  
  75.                         if GetAsyncKeyState(vk_up) <> 0 then
  76.                         begin
  77.                         xpos:= xpos+sin(degtorad(rotation))*timefactor *0.1;
  78.                         zpos:= zpos-cos(degtorad(rotation))*timefactor *0.1;
  79.                         end;
  80.                
  81.                 end
  82.         end
  83. else
  84.         begin
  85.         s:=(-f-sqrt(d))/(uu);
  86.         Form1.Edit5.Text:=floattostr(s);
  87.        
  88.         if (s<0) or (s>1) then
  89.                 begin
  90.                 end
  91.         else
  92.                 begin
  93.                 // berührung
  94.                         if GetAsyncKeyState(vk_down) <> 0 then
  95.                         begin
  96.                         xpos:= xpos-sin(degtorad(rotation))*timefactor *0.1;
  97.                         zpos:= zpos+cos(degtorad(rotation))*timefactor *0.1;
  98.                         end;
  99.  
  100.                         if GetAsyncKeyState(vk_up) <> 0 then
  101.                         begin
  102.                         xpos:= xpos+sin(degtorad(rotation))*timefactor *0.1;
  103.                         zpos:= zpos-cos(degtorad(rotation))*timefactor *0.1;
  104.                         end;
  105.  
  106.                 end
  107.         end;
  108.  
  109. end;
  110. end;
  111. end;
  112.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 07, 2006 20:57 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
ich möchte mich jetzt nicht in den code einarbeiten, was möchtest du denn kollidieren lassen ? allgemeine rigid body kollision oder nur zwei geraden, würfel, ... ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 08, 2006 07:56 
Offline
DGL Member

Registriert: Sa Feb 04, 2006 10:14
Beiträge: 21
eigentlich wollte ich eine 3d - kollisions machen aber ich hab gedacht für den anfand reicht eine 2d auch...
um meine eigene position is ein kreis gezogen und der wird darauf geprüft ob er die linien die sich aus den coordinaten berechnen lassen (grundlinien)
schneidet... wenn ja wird eben die pos zurückgesetzt wenn nein kann man sich weiter bewegen...

:D puma

nachtrag: ich habs grad gelöst... funkt super...



Code:
  1.  
  2. for ii:=1 to high(rootcoll) do
  3. begin
  4.                         i:=4; // hier lag der erste fehler
  5.                         glBegin(GL_Lines);
  6.                         glcolor3f(1,0,0);
  7.                         while (i<=coordcoll[ii,1]) do
  8.                         begin
  9.  
  10.                         x1:=coordcoll[ii,i-2]; // und hier der zweite
  11.                         x2:=-10.8;
  12.                         x3:=coordcoll[ii,i-1];
  13.                         glVertex3f(x1,x2,x3);
  14.                        
  15.                         y1:=coordcoll[ii,i];
  16.                         y2:=-10.8;
  17.                         y3:=coordcoll[ii,i+1];
  18.                         i:=i+2;
  19.  
  20.                         glVertex3f(y1,y2,y3);


nur für die dies interessiert ^^ :D

mfg puma :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 08, 2006 12:48 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
sag mal, machst du collisiondetection während das programm läuft? und das mit allen objekten?

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 08, 2006 13:43 
Offline
DGL Member

Registriert: Sa Feb 04, 2006 10:14
Beiträge: 21
ja im prinzip scho...
aber halt nur mit einer linie die die wand simuliert...
sonst gibt es keinen weg um dem programm mitzuteilen ob eine wand vorhanden is...
oder mach ich das schon wieder zu kompliziert? :D

puma :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 10, 2006 14:38 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
nicht zu kompliziert aber stell dir vor du hast 10000 objekte und musst für alle collision detection machen, das löst du dann eben lieber mit arrays wo ein erlaubter platz ist und wo nicht.

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 10, 2006 15:44 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Kommt drauf an. Bei den meisten Projekten wirst du mit einem Array nicht weit kommen. In der Regel nutzt man für das Rendern umfangreicherer Szenen Octrees, BSP-Trees oder andere Raumunterteilungsmethoden. Dann kann man diese auch gleich für die Optimierung der Kollisionsprüfung nutzen.

_________________
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


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


Wer ist online?

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.

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