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

Aktuelle Zeit: Sa Jul 05, 2025 02:30

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Würfel ist nicht Würfel!!! :(
BeitragVerfasst: Mo Aug 23, 2010 20:01 
Offline
DGL Member

Registriert: Mo Aug 23, 2010 19:45
Beiträge: 16
Programmiersprache: Delphi und noch mehr
Hallo OpenGL Profis :D

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 :D):
Code:
unit Unit1;

interface

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

Type
  TVector2f = Array [0..1] of Single;
  TVector3f = Array [0..2] of Single;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { Private-Deklarationen }
    FrameCount  : Cardinal; //FrameCounter
    procedure SetupGL;
    procedure Render;
    procedure ErrorHandler;
    procedure Cube(Color:Integer);
  public
    { Public-Deklarationen }
    DC                                : HDC;  //Handle auf Zeichenfläche
    RC                                : HGLRC;//Rendering Context
  end;

var
  Form1: TForm1;

const
  NearClipping = 1;
  FarClipping  = 1000;

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.SetupGL;
begin
  glClearColor(0.0, 0.0, 0.0, 0.0); //Hintergrundfarbe:
  glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  glEnable(GL_CULL_FACE);           //Backface Culling aktivieren

  RotateX := 0;
  RotateY := 0;
  RotateZ := 0;
  PosVect[0] := 0;
  PosVect[1] := 0;
  PosVect[2] := -5;
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;

procedure TForm1.Render;
Const voffset : TVector3f = (0.0, 0.0, 0.0);
      toffset : TVector2f = (0.0, 0.0);
      tscale  : TVector2f = (1.0, 1.0);
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;

  glTranslatef(0, 0, 0);

  // 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 :D) 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. :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Würfel ist nicht Würfel!!! :(
BeitragVerfasst: Di Aug 24, 2010 00:27 
Offline
DGL Member
Benutzeravatar

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:
Code:
gluPerspective(45.0, panel1.ClientWidth/panel1.ClientHeight, NearClipping, FarClipping);

Dann sollte alles funzen :)

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Würfel ist nicht Würfel!!! :(
BeitragVerfasst: Di Aug 24, 2010 11:19 
Offline
DGL Member

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. :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Würfel ist nicht Würfel!!! :(
BeitragVerfasst: Di Aug 24, 2010 11:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
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.
Bild

Gleiche Szene, aber mit orthogonaler Projektion: alle Würfel scheinen gleich groß obwohl der rechte Würfel weit von der Kamera entfernt ist
Bild

_________________
Yeah! :mrgreen:


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 » Einsteiger-Fragen


Wer ist online?

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