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
hinschreiben, dass man den Winkel der Perspektive selbst anpassen muss.
So was kann man als Anfänger leicht übersehen und Fragen im Forum weisen auch darauf hin, dass ich nicht der einzige war.
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
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
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
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
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:
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);
SwapBuffers(DC); //Ausgabe des Framebuffers auf dem Bildschirm
end;
//------------------------------------------------------------------------------
procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
begin
//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
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;
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
//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);
...
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:
procedure TForm1.Render;
begin
glMatrixMode(GL_MODELVIEW);
//Farbpuffer und Tiefenpuffer werden gelöscht(Überschrieben)
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
//GraphischesObjekt wird in die Mitte der Matrix gesetzt
glLoadIdentity;
//verschieben der Matrix Kamera bzw Zeichenstift (x,y,z)
glTranslatef(0,0,-5);
//initalisieren des Namestack
glinitnames;
glpushname(0);
...
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!
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
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.