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

Aktuelle Zeit: Fr Jul 18, 2025 11:13

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Aug 02, 2005 19:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jun 25, 2003 12:44
Beiträge: 29
Hallo!
Nachdem ich beim experimentieren mit Frustum Culling einige unvorhersehbare Ergebnisse hatte, habe ich mir einfach mal ein Gitter anzeigen lassen, bei dem ich die Punkte jeweils über Frustum Culling auf Sichtbarkeit prüfe und dann ggf. zeichne.
Was dabei rauskam, seht ihr im Anhang.
Ich prüfe dabei die Punkte von -100 bis +100 auf der X und Z Achse und wenn ein Punkt sichtbar ist, zeichne ich 4 Quadrate darum herum. (ich weiß, dass dadurch an den Ecken Löcher entstehen, aber solche Löcher wie bei mir herauskamen auf jedenfall nicht).

Fürs Frustum Culling verwende ich die Klasse von delphigl.de.

Hat jemand eine Ahnung, woran das liegen könnte, dass das Frustum Culling nicht richtig funktioniert?

Ein paar Auszüge aus dem Code:
Code:
  1.  
  2. ApplicationEventsIdle:
  3.  
  4.   glViewPort(0, 0, panMain.ClientWidth, panMain.ClientHeight);
  5.   glMatrixMode(GL_PROJECTION);
  6.   glLoadIdentity;
  7.   gluPerspective(60, panMain.ClientWidth/panMain.ClientHeight, 0.1, 128);
  8.   glMatrixMode(GL_MODELVIEW);
  9.   glLoadIdentity;
  10.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  11.   Camera.UseMatrix;
  12.   glScalef(zoom,zoom,-zoom);  //Z-Achse umkehren
  13.   glColor3f(0.5,0.5,0.5);
  14.   if Map <> nil then
  15.     Map.Draw;
  16.   glColor3f(1,1,1);
  17.   ShowText;
  18.   SwapBuffers(DC);
  19.   Done := False;
  20.  
  21. Camera.UseMatrix:
  22. var  RotMatrix : THomogeneousMatrix;
  23. begin
  24.   RotMatrix := Rotation;
  25.   MatrixInvert(RotMatrix);
  26.   glMultMatrixf(@RotMatrix[0,0]);
  27.   glTranslatef(-Position[0], -Position[1], -Position[2]);    
  28. end;
  29.  
  30. Map.Draw:
  31.   Frustum.Calculate;
  32.   for i := -100 to 100 do
  33.     for j := -100 to 100 do
  34.       if Frustum.IsPointWithin(i,0,j) then
  35.         DrawPoint(i,j);
  36.  
  37. DrawPoint:
  38. procedure DrawPoint(a,b:integer);
  39. var y:single;
  40. begin
  41.   y := 0;
  42.   //obenlinks
  43.   glBegin(GL_LINE_LOOP);
  44.     glVertex3f(a-0.5,0,b+0.5);
  45.     glVertex3f(a-0.5,0,b);
  46.     glVertex3f(a,y,b);
  47.     glVertex3f(a,0,b+0.5);
  48.   glEnd;
  49.   //obenrechts
  50.   glBegin(GL_LINE_LOOP);
  51.     glVertex3f(a,0,b+0.5);
  52.     glVertex3f(a,y,b);
  53.     glVertex3f(a+0.5,0,b);
  54.     glVertex3f(a+0.5,0,b+0.5);
  55.   glEnd;
  56.   //untenlinks
  57.   glBegin(GL_LINE_LOOP);
  58.     glVertex3f(a-0.5,0,b);
  59.     glVertex3f(a-0.5,0,b-0.5);
  60.     glVertex3f(a,0,b-0.5);
  61.     glVertex3f(a,y,b);
  62.   glEnd;
  63.   //untenrechts
  64.   glBegin(GL_LINE_LOOP);
  65.     glVertex3f(a,y,b);
  66.     glVertex3f(a,0,b-0.5);
  67.     glVertex3f(a+0.5,0,b-0.5);
  68.     glVertex3f(a+0.5,0,b);
  69.   glEnd;
  70. end;
  71.  


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 02, 2005 23:12 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Könntest du uns mal die unvorhersehbaren Ergebnisse zeigen...

So aus dem Stehgreif, sieht dein Frustum doch gut aus. Ein Beispielbild wäre nett.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 03, 2005 09:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jun 25, 2003 12:44
Beiträge: 29
Das Bild im Anhang sagt doch schon alles.
Das Gitter was zu sehen ist, dürfte eigentlich keine solche Ecken am Rand haben, wenn das Frustum Culling richtig funktionieren würde.

Die "unvorhersehbaren Ergebnisse" gabs zum ersten mal, als ich folgendes versucht habe:
1) die Schnittgeraden der Left,Right,Top, und Bottom Ebene des Frustums mit der Ebene A=0 B=1 C=0 D=0 berechnen
2) die Schnittpunkte dieser Geraden berechnen
3) Jeweils die kleinsten und größten x/z werte nehmen und das Gitter zeichnen

(den Code dazu hab ich schon paar mal überprüft, aber keine Fehler gefunden; es muss also am Frustum liegen, wie man oben im ersten Post sieht!)

Was herauskam, wenn ich mir die Schnittpunkte von Punkt 2 anzeigen hab lassen (zu einem Viereck verbunden), kannst du im Anhang sehen..


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 03, 2005 09:59 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jun 25, 2003 12:44
Beiträge: 29
LOL jetzt funktionierts auf einmal o_O
Ich hatte die windows-Unit in der Frustum-Unit (zu debug-zwecken) eingebunden - das war der Fehler :lol:


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 14 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.007s | 14 Queries | GZIP : On ]