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

Aktuelle Zeit: Do Sep 04, 2025 22:58

Foren-Übersicht » DGL » Feedback
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Selektionstutorial Feedback/Kritik
BeitragVerfasst: Do Mär 03, 2005 12:03 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
-----------Nur der Erste Teil des Tutorials (einfache Geometrieselektion)------

CodeTeil funktion Selection

Fehler: viewport muss als TGLVectori4 definiert werden da sonst Delphi Typungleichheit feststellt.
Der Aufruf von gluPicMatrix dann entsprechend ohne "@" vor Viewport.

Allgemein: Schreibweise OpenGL Konform machen. z.B. Konstanten immer GROSS schreiben.


Wenn aussage mit dem "0 auf Namestack schreiben" durch OpenGL Dokumentation (z.B. RedBook) belegt ist dies auch so schreiben. Sonst denkt einer vielleciht man könnte es trotzdem weglassen.


An die Tutorialüberarbeiter:
Ich fände es günstig, wenn man am schluss eines jeden Tutorials noch darauf hinweist, dass weitere Infos im Wiki zu finden sind.
So kommen auch die, die nur die Tuts von hier lesen wollen früher oder später in unser Wiki.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 03, 2005 12:11 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Vielleicht könnte man auch einen Hinweis bei :
Code:
  1. gluPerspective(45.0, form1.ClientWidth/form1.ClientHeight, 1, 100);

hinschreiben, dass man den Winkel der Perspektive selbst anpassen muss.
So was kann man als Anfänger leicht übersehen :oops:
und Fragen im Forum weisen auch darauf hin, dass ich nicht der einzige war.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 03, 2005 17:39 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ja stimmt. Ein Satz wie: "gluPerspektive muss mit den selben parametern aufgerufen werden wie beim normalen Zeichnen. Hier im beispiel entspricht das ..."

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 03, 2005 17:57 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Zitat:
Wenn aussage mit dem "0 auf Namestack schreiben" durch OpenGL Dokumentation (z.B. RedBook) belegt ist dies auch so schreiben. Sonst denkt einer vielleciht man könnte es trotzdem weglassen.

Ich habe es weggelassen, und es funct prima.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 03, 2005 20:57 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Bei manchen scheints net zu gehn. d.h. vielleicht ist es Treiberabhängig. Und das kann blöd enden...(Wenn du jemand deinen Code gibst und bei dem Treten Fehler auf die du net nachvollziehen kannst)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 03, 2005 22:51 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das hier sollte auch noch mit rein ins Tut:

Nachdem innerhalb der Slection-Routine in den Rendermodus "Select" gewechselt wurde und die Perspective initialisiert und gesetzt wurde darf innerhalb der eigentlichen renderprocedure nicht nocheinmal glLoadIdentity aufgerufen werden.
Da aber meistens beim Rendern anfänglich dies gemacht wird, muss man abprüfen in welchem RenderModus man sich befindet. Am besten geht dies über glGet mit dem Parameter GL_RENDER_MODE.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 02, 2005 16:51 
Offline
DGL Member

Registriert: Di Aug 02, 2005 16:44
Beiträge: 2
Mein Problem ist egal wo ich im Fenster hinklicke es kommt immer die Nachricht das ich das letzte Objekt selektirt habe.
ich schicke mal kompletten sourcecode:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, dglOpenGL, StdCtrls, ComCtrls;

type
TForm1 = class(TForm)
StatusBar1: TStatusBar;
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure IdleHandler(Sender: TObject; var Done: Boolean);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private-Deklarationen }
xs : integer;
ys : integer;
StartTime, TimeCount, FrameCount : Cardinal; //FrameCounter
Frames, DrawTime : Cardinal; //& Timebased Movement
procedure SetupGL;
procedure Init; //wird auch InitGGlobals gennant
procedure Render; //Ausgabe an Grafikkarte
procedure ErrorHandler;
function Selection : integer;
public
{ Public-Deklarationen }
DC : HDC; //Handle auf Zeichenfläche
RC : HGLRC;//Rendering Context
end;
const
NearClipping = 1;
FarClipping = 1000;
viereck1 = 1;
viereck2 = 2;
namen : array[-1..2] of string = ('nichts','','Das Viereck1','Das Viereck2');
var
Form1: TForm1;

implementation

{$R *.dfm}
//------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
DC:= GetDC(Handle); //Abfrage Gerätekontext(DiviceContext)
if not InitOpenGL then Application.Terminate; //Initialisieren von OpenGL
//RenderingContext erzeugt
RC:= CreateRenderingContext(DC,[opDoubleBuffered],32,24,0,0,0,0);
ActivateRenderingContext(DC, RC); //RenderingContext aktiviert
SetupGL; //Unterprogramm
Init; //Unterprogramm
end;
//------------------------------------------------------------------------------
procedure TForm1.SetupGL;
begin
glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe
glEnable(GL_DEPTH_TEST); //Tiefentest aktivieren
glEnable(GL_CULL_FACE); //Backface Culling aktivieren
end;
//------------------------------------------------------------------------------
procedure TForm1.Init;
begin
Application.OnIdle:= IdleHandler;
end;
//------------------------------------------------------------------------------
procedure TForm1.FormResize(Sender: TObject);
var
tmpBool : Boolean; //Dummy
begin
glViewport(0, 0, ClientWidth, ClientHeight); //Größe der OpenGL-Ausgabe
glMatrixMode(GL_PROJECTION); //manipulieren der OpenGL Ausgabe
glLoadIdentity;
//Sicht des Betrachters
gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);

glMatrixMode(GL_MODELVIEW); //Daten an OpenGL übergeben
glLoadIdentity; //aktuelle Matrix wird mit der Identitätsmatrix gefüllt
IdleHandler(Sender, tmpBool);
end;
//------------------------------------------------------------------------------
procedure TForm1.FormDestroy(Sender: TObject);
begin
//RenderingContext deaktivieren und freigeben
DeactivateRenderingContext;
DestroyRenderingContext(RC);
ReleaseDC(Handle, DC);
end;
//------------------------------------------------------------------------------
procedure TForm1.Render;
begin
//Farbpuffer und Tiefenpuffer werden gelöscht(Überschrieben)
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_PROJECTION);
glLoadIdentity;
//Perspektive wird gesetzt
gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);

//verschieben der Matrix Kamera bzw Zeichenstift (x,y,z)
glTranslatef(0, 0, -5);

glMatrixMode(GL_MODELVIEW);
//GraphischesObjekt wird in die Mitte der Matrix gesetzt
glLoadIdentity;

//initalisieren des Namestack
glinitnames;
glpushname(0);

//Viereck 1
glloadname(viereck1);
glBegin(GL_QUADS);
glColor3f(1 , 0, 0);
glVertex3f(0, 0, 0);
glVertex3f(1, 0, 0);
glColor3f(1, 1, 0);
glVertex3f(1, 1, 0);
glVertex3f(0, 1, 0);
glEnd;

glTranslatef(0.5, -0.5, 1);

//Viereck 2
glloadname(viereck2);
glBegin(GL_QUADS);
glColor3f(0 , 1, 0);
glVertex3f(0, 0, 0);
glVertex3f(1, 0, 0);
glColor3f(0, 1, 1);
glVertex3f(1, 1, 0);
glVertex3f(0, 1, 0);
glEnd;


SwapBuffers(DC); //Ausgabe des Framebuffers auf dem Bildschirm
end;
//------------------------------------------------------------------------------
procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
begin

StartTime:= GetTickCount; //Messen der Systemzeit (optional)
Render; //Aufruf Zeichenroutine
DrawTime:= GetTickCount - StartTime;
Inc(TimeCount, DrawTime);
Inc(FrameCount);

//Dieser Block wird nur einmal in der Sekund Aufgerufen
if TimeCount >= 1000 then begin
Frames:= FrameCount;
TimeCount:= TimeCount - 1000;
FrameCount:= 0;
Caption:= InttoStr(Frames) + 'FPS';
ErrorHandler;
end;

Done:= false; //Damit OnIdle immer wieder augerufen wird
end;
//------------------------------------------------------------------------------
procedure TForm1.ErrorHandler;
begin
gluErrorString(glGetError); //OpenGLFehler erkennen
end;
//------------------------------------------------------------------------------
function TForm1.Selection : integer;
var
Puffer : array[0..256] of GLUInt;
Viewport : TGLVectori4;
Treffer,i : Integer;
Z_Wert : GLUInt;
Getroffen : GLUInt;
begin
glGetIntegerv(GL_VIEWPORT, @viewport); //Die Sicht speichern
glSelectBuffer(256, @Puffer); //Den Puffer zuordnen
glRenderMode(GL_SELECT); //In den Selectionsmodus schalten
glmatrixmode(gl_projection); //In den Projektionsmodus
glPushMatrix; //Um unsere Matrix zu sichern
glLoadIdentity; //Und dieselbige wieder zurückzusetzen

gluPickMatrix(xs, viewport[3]-ys, 0.01, 0.01, viewport);
gluPerspective(45.0, form1.ClientWidth/form1.ClientHeight, 1, 100);

Render; //Die Szene zeichnen
glmatrixmode(gl_projection); //Wieder in den Projektionsmodus
glPopMatrix; //um unsere alte Matrix wiederherzustellen

treffer := glRenderMode(GL_RENDER);//Anzahl der Treffer auslesen

Getroffen := High(GLUInt); //Höchsten möglichen Wert annehmen
Z_Wert := High(GLUInt); //Höchsten Z - Wert
for i := 0 to Treffer-1 do
if Puffer[(i*4)+1] < Z_Wert then
begin
getroffen := Puffer[(i*4)+3];
Z_Wert := Puffer[(i*4)+1];
end;

Result := getroffen;
end;
//------------------------------------------------------------------------------
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
xs := X;
ys := Y;

statusbar1.Simpletext := 'Sie haben auf ' + namen[selection] + ' geklickt!';
end;

end.

//--------------------------------------------------------------------------------------------------------------

Ich hoffe es kann mir jemand weiter helfen.


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

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also sowas hab ich noch nie gesehn! Wie kann jemand nur so nen riesen Code posten ohne die Code bzw. Pascaltags zu verwenden!? Glaubst du wirklich das will so jemand kontrollieren...? :?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 02, 2005 20:20 
Offline
DGL Member

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
Problem lokalisiert und behoben ;)

Also das Problem war wohl eindeutig auf welche Art und Weise du deinen Kram renderst ^^

Code:
  1. procedure TForm1.Render;
  2. begin
  3. //Farbpuffer und Tiefenpuffer werden gelöscht(Überschrieben)
  4. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  5.  
  6. glMatrixMode(GL_PROJECTION);
  7. glLoadIdentity;
  8. //Perspektive wird gesetzt
  9. gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  10.  
  11. //verschieben der Matrix Kamera bzw Zeichenstift (x,y,z)
  12. glTranslatef(0, 0, -5);
  13.  
  14. glMatrixMode(GL_MODELVIEW);
  15. //GraphischesObjekt wird in die Mitte der Matrix gesetzt
  16. glLoadIdentity;
  17.  
  18.    
  19. BeitragVerfasst am: 02 Aug 2005 17:51    Titel: Hab ein kleines Problem zu dem Tutoriel
  20. Mein Problem ist egal wo ich im Fenster hinklicke es kommt immer die Nachricht das ich das letzte Objekt selektirt habe.
  21. ich schicke mal kompletten sourcecode:
  22.  
  23. unit Unit1;
  24.  
  25. interface
  26.  
  27. uses
  28. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  29. Dialogs, dglOpenGL, StdCtrls, ComCtrls;
  30.  
  31. type
  32. TForm1 = class(TForm)
  33. StatusBar1: TStatusBar;
  34. procedure FormCreate(Sender: TObject);
  35. procedure FormResize(Sender: TObject);
  36. procedure FormDestroy(Sender: TObject);
  37. procedure IdleHandler(Sender: TObject; var Done: Boolean);
  38. procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
  39. Shift: TShiftState; X, Y: Integer);
  40. private
  41. { Private-Deklarationen }
  42. xs : integer;
  43. ys : integer;
  44. StartTime, TimeCount, FrameCount : Cardinal; //FrameCounter
  45. Frames, DrawTime : Cardinal; //& Timebased Movement
  46. procedure SetupGL;
  47. procedure Init; //wird auch InitGGlobals gennant
  48. procedure Render; //Ausgabe an Grafikkarte
  49. procedure ErrorHandler;
  50. function Selection : integer;
  51. public
  52. { Public-Deklarationen }
  53. DC : HDC; //Handle auf Zeichenfläche
  54. RC : HGLRC;//Rendering Context
  55. end;
  56. const
  57. NearClipping = 1;
  58. FarClipping = 1000;
  59. viereck1 = 1;
  60. viereck2 = 2;
  61. namen : array[-1..2] of string = ('nichts','','Das Viereck1','Das Viereck2');
  62. var
  63. Form1: TForm1;
  64.  
  65. implementation
  66.  
  67. {$R *.dfm}
  68. //------------------------------------------------------------------------------
  69. procedure TForm1.FormCreate(Sender: TObject);
  70. begin
  71. DC:= GetDC(Handle); //Abfrage Gerätekontext(DiviceContext)
  72. if not InitOpenGL then Application.Terminate; //Initialisieren von OpenGL
  73. //RenderingContext erzeugt
  74. RC:= CreateRenderingContext(DC,[opDoubleBuffered],32,24,0,0,0,0);
  75. ActivateRenderingContext(DC, RC); //RenderingContext aktiviert
  76. SetupGL; //Unterprogramm
  77. Init; //Unterprogramm
  78. end;
  79. //------------------------------------------------------------------------------
  80. procedure TForm1.SetupGL;
  81. begin
  82. glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe
  83. glEnable(GL_DEPTH_TEST); //Tiefentest aktivieren
  84. glEnable(GL_CULL_FACE); //Backface Culling aktivieren
  85. end;
  86. //------------------------------------------------------------------------------
  87. procedure TForm1.Init;
  88. begin
  89. Application.OnIdle:= IdleHandler;
  90. end;
  91. //------------------------------------------------------------------------------
  92. procedure TForm1.FormResize(Sender: TObject);
  93. var
  94. tmpBool : Boolean; //Dummy
  95. begin
  96. glViewport(0, 0, ClientWidth, ClientHeight); //Größe der OpenGL-Ausgabe
  97. glMatrixMode(GL_PROJECTION); //manipulieren der OpenGL Ausgabe
  98. glLoadIdentity;
  99. //Sicht des Betrachters
  100. gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  101.  
  102. glMatrixMode(GL_MODELVIEW); //Daten an OpenGL übergeben
  103. glLoadIdentity; //aktuelle Matrix wird mit der Identitätsmatrix gefüllt
  104. IdleHandler(Sender, tmpBool);
  105. end;
  106. //------------------------------------------------------------------------------
  107. procedure TForm1.FormDestroy(Sender: TObject);
  108. begin
  109. //RenderingContext deaktivieren und freigeben
  110. DeactivateRenderingContext;
  111. DestroyRenderingContext(RC);
  112. ReleaseDC(Handle, DC);
  113. end;
  114. //------------------------------------------------------------------------------
  115. procedure TForm1.Render;
  116. begin
  117. //Farbpuffer und Tiefenpuffer werden gelöscht(Überschrieben)
  118. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  119.  
  120. glMatrixMode(GL_PROJECTION);
  121. glLoadIdentity;
  122. //Perspektive wird gesetzt
  123. gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  124.  
  125. //verschieben der Matrix Kamera bzw Zeichenstift (x,y,z)
  126. glTranslatef(0, 0, -5);
  127.  
  128. glMatrixMode(GL_MODELVIEW);
  129. //GraphischesObjekt wird in die Mitte der Matrix gesetzt
  130. glLoadIdentity;
  131.  
  132. //initalisieren des Namestack
  133. glinitnames;
  134. glpushname(0);
  135. ...


Bei sowas muss ich mich immerwieder wundern, dass man überhaupt was sieht \";)\"
Und zwar folgendes: wozu glviewport da mitten drinne? Hat das irgennen Sinn? Ich habe es einfach weg gemacht ... funktioniere wunderbar, brachte sogar mehr FPS ^^
Dess das \"glMatrixMode(GL_MODELVIEW);\" ... ghört net an die stelle ... muss an den Anfang der Prozedur, damit du nach einem Selection-Durchgang auch wieder was siehst ^^
Durch die Falsche Position des Modelview-Dingends wurd ein logischer Fehler zudem noch vertuscht: was bringt es, wenn man erst die Kamera nach hinten verschiebt und denn wieder alles auf den Uhrsprung setzt. \"glMatrixMode(GL_PROJECTION);\" ist an der Stelle ebenfalls überflüssig ... wozu auch? Wenn der Modus gebraucht wird, setzt den bereits unsere Selection-Prozedur .. also weg damit ... das Ergebniss dieser Rationalisierungen:

Code:
  1. procedure TForm1.Render;
  2. begin
  3. glMatrixMode(GL_MODELVIEW);
  4. //Farbpuffer und Tiefenpuffer werden gelöscht(Überschrieben)
  5. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  6. //GraphischesObjekt wird in die Mitte der Matrix gesetzt
  7. glLoadIdentity;
  8. //verschieben der Matrix Kamera bzw Zeichenstift (x,y,z)
  9. glTranslatef(0, 0, -5);
  10. //initalisieren des Namestack
  11. glinitnames;
  12. glpushname(0);
  13. ...


Ergebniss: Selection funzt zu 100% ... und weil n paar teure, aber überflüssige Befehle raus sind sogar noch schneller als zuvor ;)

_________________
Es sind immer die guten,
welche zu früh von uns gehen müssen...

Meine bislang 13 Open Gl - Tuts findet ihr auf www.dcw-group.net
Neu! Ein großer Teil der Demos nach Kylix übersetzt!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Ich werde mich bessern
BeitragVerfasst: Mi Aug 03, 2005 16:14 
Offline
DGL Member

Registriert: Di Aug 02, 2005 16:44
Beiträge: 2
Danke für die Hilfe, bei mir funktioniert es jetzt auch.

Es sind meine ersten Schritte in OpenGL und ich versuche halt Informationen aus mehreren Tuts mit einander zu mixen.
Is irgend wie nicht gut gelaufen.

Andere kurze Frage wie post ich den Code wie du das ggemacht hast?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 03, 2005 17:01 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Beim Posten stehen über dem Textfeld mehrere Knöpfe, welche Tags in den Text einfügen. Du kannst da drauf drücke, oder die Tags manuell setzen.

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


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 22 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 | 15 Queries | GZIP : On ]