Registriert: Mo Aug 23, 2010 19:45 Beiträge: 16
Programmiersprache: Delphi und noch mehr
Hallo OpenGL Profis
hab wegen einem kleinen Projekt, was eine 3D Darstellung bekommen soll, mit OpenGL angefangen. Ziel ist es ein Array 3D darzustellen. Hab mir schon ein fertiges Komzept. Ich will mehrere kleine Würfel darstellen und wenn im Array eine 1 ist,dann soll eine andere Farbe sein, als wenn eine 0 enthalten ist. Eigentlich ganz simpel (für euch vielleicht) .
Also OpenGL Einstieg gelesen, Google gefragt wie Würfel darstellen und Rotation. Rausgekommen ist dieser Code (Ich weiß es ist viel Copy & Paste ):
var RotateX : single; // Rotation um die X-Achse RotateY : single; // Rotation um die Y-Achse RotateZ : single; // Rotation um die Z-Achse PosVect : TVector3f; // Vector mit der Position des Objektes.
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin DC:= GetDC(Panel1.Handle); if not InitOpenGL then Application.Terminate; RC:= CreateRenderingContext( DC, [opDoubleBuffered], 32, 24, 0,0,0, 0); ActivateRenderingContext(DC, RC); SetupGL; end;
procedure TForm1.Cube(Color:Integer); begin if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f( 1.0, 1.0,-1.0); // Top Right Of The Quad (Top) glVertex3f(-1.0, 1.0,-1.0); // Top Left Of The Quad (Top) glVertex3f(-1.0, 1.0, 1.0); // Bottom Left Of The Quad (Top) glVertex3f( 1.0, 1.0, 1.0); // Bottom Right Of The Quad (Top)
if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f( 1.0,-1.0, 1.0); // Top Right Of The Quad (Bottom) glVertex3f(-1.0,-1.0, 1.0); // Top Left Of The Quad (Bottom) glVertex3f(-1.0,-1.0,-1.0); // Bottom Left Of The Quad (Bottom) glVertex3f( 1.0,-1.0,-1.0); // Bottom Right Of The Quad (Bottom)
if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f( 1.0, 1.0, 1.0); // Top Right Of The Quad (Front) glVertex3f(-1.0, 1.0, 1.0); // Top Left Of The Quad (Front) glVertex3f(-1.0,-1.0, 1.0); // Bottom Left Of The Quad (Front) glVertex3f( 1.0,-1.0, 1.0); // Bottom Right Of The Quad (Front)
if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f( 1.0,-1.0,-1.0); // Bottom Left Of The Quad (Back) glVertex3f(-1.0,-1.0,-1.0); // Bottom Right Of The Quad (Back) glVertex3f(-1.0, 1.0,-1.0); // Top Right Of The Quad (Back) glVertex3f( 1.0, 1.0,-1.0); // Top Left Of The Quad (Back)
if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f(-1.0, 1.0, 1.0); // Top Right Of The Quad (Left) glVertex3f(-1.0, 1.0,-1.0); // Top Left Of The Quad (Left) glVertex3f(-1.0,-1.0,-1.0); // Bottom Left Of The Quad (Left) glVertex3f(-1.0,-1.0, 1.0); // Bottom Right Of The Quad (Left)
if Color <> 0 then glColor4f(0.5, 0.5, 1.0, 0.8) // Set The Color else glColor4f(0.3, 0.3, 0.3, 0.4); glVertex3f( 1.0, 1.0,-1.0); // Top Right Of The Quad (Right) glVertex3f( 1.0, 1.0, 1.0); // Top Left Of The Quad (Right) glVertex3f( 1.0,-1.0, 1.0); // Bottom Left Of The Quad (Right) glVertex3f( 1.0,-1.0,-1.0); // Bottom Right Of The Quad (Right) end;
procedure TForm1.FormDestroy(Sender: TObject); begin DeactivateRenderingContext; DestroyRenderingContext(RC); ReleaseDC(Handle, DC); end;
// Das Objekt auf seine aktuelle Position setzen. glTranslatef( PosVect[0], PosVect[1], PosVect[2]);
{ Das Objekt noch drehen, damit denn wir haben bis jetzt ja nur den } { Vector gedreht. } glRotatef(RotateX, 1, 0, 0); glRotatef(RotateY, 0, 1, 0); glRotatef(RotateZ, 0, 0, 1);
glBegin(GL_QUADS); Cube(0); glEnd;
SwapBuffers(DC); end;
procedure TForm1.Timer1Timer(Sender: TObject); begin inc(FrameCount); Render; If FrameCount = 20 then begin ErrorHandler; FrameCount := 0; end; end;
procedure TForm1.Timer2Timer(Sender: TObject); begin RotateY := RotateY + 0.5; // if RotateY <= 0 then RotateY := RotateY + 360; // RotateX := RotateX + 0.5; // if RotateX <= 0 then RotateX := RotateX + 360; // RotateZ := RotateY + 0.5; end;
procedure TForm1.ErrorHandler; begin Form1.Caption := string(gluErrorString(glGetError)); end;
end.
Ich hab nur ein klitzekleines Problem (für mich ein sehr großes ) und zwar ist der Würfel kein Würfel sondern ein Quader. Der Quader ist doppelt so hoch, als er sein sollte. Ich hoffe ihr könnt mir helfen.
mfg Müllermilchtrinker
PS: Vielleicht habt ihr dann noch eine Idee, wie ich Verschiebung der einzelnen Würfel hinbekomme (Zwischenraum sollte sein). Wenn ihr wissen wollt, wie es später aussehen soll, dann mach ich euch ein ScreenShot aus einem anderne Programm, indem das ist, was ich später haben will.
Registriert: Do Jul 23, 2009 04:33 Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Hallo Müllermilchtrinker, Willkommen im Forum
Du hast in deinem Code die Perspektive auf ClientWidth und ClientHeight vom Formular gesetzt, obwohl du das Panel zur Anzeige verwendest, hier die Lösung:
Registriert: Mo Aug 23, 2010 19:45 Beiträge: 16
Programmiersprache: Delphi und noch mehr
Danke, Danke. Es funktioniert. MIr wurde schon in einem anderen Forum http://www.delphipraxis.net geraten, ich soll gluOrtho2D nutzen. Hab dann auch recherchiert, aber ich hab die Parameter nicht verstanden. Ist ja jetzt auch egal. Danke nochmal vielmals.
Hab dann auch recherchiert, aber ich hab die Parameter nicht verstanden.
gluOrtho2D erzeugt eine orthogonale Projektion. Das bedeutet das Objekte nicht abhängig von der Entfernung zur Kamera kleiner werden, siehe Bildchen aus dem Wiki unten. Üblicherweise wird das halt benutzt wenn du nur 2D willst und kein 3D. Die Parameter sind einfach die Koordinaten bei denen du die Geometrie abschneiden (clippen) möchtest, also da wo der Rand des Viewports sein soll.
Drei Würfel mit Perspektive gerendert: die Würfel werden mit der Entfernung kleiner und wandern zur Bildschirmmitte.
Gleiche Szene, aber mit orthogonaler Projektion: alle Würfel scheinen gleich groß obwohl der rechte Würfel weit von der Kamera entfernt ist
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.