Entwickler-Ecke

Delphi Tutorials - OpenGL - Einführung


Aya - Do 10.04.03 18:26
Titel: OpenGL - Einführung
Hi,

wie angekündigt gibt es hier nun mein OpenGL Tutorial worauf der kleine OpenGL Kurs aufbauen wird.. ;)

Über die geschichte etc von OpenGL werde ich mal nichts erzählen (weiß auchnet sonderlich viel darüber :oops: ), und komme gleich richtig zur sache.

Eine sache noch für die leute hier, die OpenGL schon besser können... dieses Tutorial ist für anfänger gedacht! Einige dinge sind evtl umständlich, oder unpassend gemacht.. aber es ist so leichter den sinn zu verstehen ;)

Vorbereitung:

Der erste schritt:
Bevor wir mit OpenGL arbeiten können, muß es ersteinmal Initialisiert werden, hierfür benötigen wir 2 Variablen:


Delphi-Quelltext
1:
2:
3:
var
  h_DC: hDC;
  hRC: HGLRC;


in welchen die Adresse des RenderContext für unsere OpenGL Scene gespeichert wird.


Delphi-Quelltext
1:
2:
3:
4:
5:
  InitOpenGL;
  h_DC:=GetDC(Handle);
  SetDCPixelFormat(h_DC);
  hRC:=wglCreateContext(h_DC);
  wglMakeCurrent(h_DC,hRC);


Diese 5 Zeilen sollten in's OnCreate Ereigniss der Form.
InitOpenGL:
Wird erst seit der OpenGL12.pas benötigt und ist wichtig, damit die Variablen, Objekte etc der OpenGL12.pas erzeugt werden.

h_DC:=GetDC(Handle);:
Hier holen wir uns den DeviceContext von unserem Form.

SetDCPixelFormat(h_DC);:
Hier wird das PixelFormat der Scene eingestellt (siehe unten).

hRC:=wglCreateContext(h_DC);:
Erstellt den OpenGL RenderContext (Befehle die mit wgl, bzw gl beginnen sind OpenGL spezifische Befehle. wgl ist zudemnoch Windows Spezifisch)

wglMakeCurrent(h_DC,hRC);:
Diese Zeile gibt an welches der aktuelle RenderContext ist, am anfang eher nebensächlich da wir sowieso nur ein OpenGL Fenster haben.. aber wenn ihr mal ein Programm schreibt wo es mehrere OpenGL Fenster gibt werdet ihr drauf zurückkommen ;)

So, damit währe die Initialisierung schon fast geschafft, fehlt nurnoch die procedur SetDCPixelFormat. Das meißte hier sollte schon vom Namen der Variable her klar sein... ;)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
  procedure SetDCPixelFormat(Handle: HDC);
  var
    nPixelFormat: GLUint;
  const
    pfd: PIXELFORMATDESCRIPTOR = (
        nSize: sizeof( PIXELFORMATDESCRIPTOR );
        nVersion: 1;
        dwFlags: PFD_DRAW_TO_WINDOW
        or PFD_SUPPORT_OPENGL
        or PFD_DOUBLEBUFFER;
        iPixelType: PFD_TYPE_RGBA;
        cColorBits: 16;
        cRedBits: 0;
        cRedShift: 0;
        cGreenBits: 0;
        cBlueBits: 0;
        cBlueShift: 0;
        cAlphaBits: 0;
        cAlphaShift: 0;
        cAccumBits: 0;
        cAccumRedBits: 0;
        cAccumGreenBits: 0;
        cAccumBlueBits: 0;
        cAccumAlphaBits: 0;
        cDepthBits: 16;
        cStencilBits: 0;
        cAuxBuffers: 0;
        iLayerType: PFD_MAIN_PLANE;
        bReserved: 0;
        dwLayerMask: 0;
        dwVisibleMask: 0;
        dwDamageMask: 0
    );
  begin
    nPixelFormat:=ChoosePixelFormat(h_DC, @pfd);
    SetPixelFormat(h_DC,nPixelFormat,@pfd);
  end;


und damit wäre die Initialisierung fertig :D

Als nächstes schreiben wir uns eine kleine eigene Procedur, namens InitGL welche so aussehen sollte:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.InitGL;
begin
  glClearColor(0,0,0,0);
  glClearDepth(1);
  glDepthFunc(GL_LESS);
  glShadeModel(GL_SMOOTH);
  glEnable(GL_DEPTH_TEST);

  glViewport(0,0,Width,Height);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45,Width/Height,1,100);
  glMatrixMode(GL_MODELVIEW);
end;


glClearColor:
Hiermit bestimmen wir die Hintergrundfarbe unserer Scene. (Ganz genau genommen wird wenn dieser Befehl aufgerufen wird die komplette Scene it der hier angegebenen Farbe übermalt)

glClearDepth:
Hiermit wird unser Tiefenbuffer geleert. (Komme ich später genauer drauf zurück)

glDepthFunc:
Der hier verwendete Parameter gibt an, wie der TiefenTest von OpenGL Funktioniert. GL_LESS z.B. bedeutet das die Objekte die näher beim Betrachter liegen die weiter entfernten überdecken. Bei GL_GREATER wäre es z.B. genau andersrum.

glShadeModel:
Gibt an welche ShadingTechnik verwendet werden soll. GL_SMOOTH wird für weiche kanten benutzt, GL_FLAT für harte.

glEnable:
Mit glEnable werden div. funktionen von OpenGL aktiviert, in diesem fall wird GL_DEPTH_TEST aktiviert, also unser Tiefentest. (Welcher dafür verantwortlich ist das weiter entfernte objekte von den näheren überdeckt werden)

glViewport;
Viewport ist gibt die fläche an, in der die Scene angezeigt wird. i.d.R. wählt man hier die komplette fläche, aber es kann u.U. sinnvoll sein mal nur einen kleinen ausschnitt zu benutzen.

glMatrixMode:
Stellt unsere WeltMatrix um. In dem fall auf die ProjektionsMatrix.
mit GL_MODELMATRIX kommen wir zurück in die ModellierungsMatrix.

glLoadIdentity:
Mit glLoadIdentity wird die Scene zurück auf 0 gesetzt. Also, wenn man die Scene rotiert und verschiebt, kann man hiermit einfach auf den ausgangspunkt bei 0 zurückgehen.

gluPerspective:
Bedeutet das wir eine PerspektivKamera benutzen (keine Orthogonale). Der erste Parameter gibt den KameraWinkel an, der zweite das verhältniss.
Parameter 3 und 4 sind die sogenannte clipping plane... also alles was ausserhalb der ClippingPlane ist, wird nicht gerendert (in dem fall alles was näher als 1 Einheit, oder weiter weg als 100 Einheiten ist)

So, nun als letztes noch eine Procedur DrawScene, und alles ist perfekt ;)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.DrawScene;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glLoadIdentity;
  //Hier wird später die Scene gezeichnet.

  SwapBuffers(h_DC);
end;


glClear:
Leert wie der name schon sagt die Scene, in diesem fall wird die Scene mit der Farbe die bei der Initialisierung bei glClearColor angegeben wurde übermalt und der TiefenBuffer geleert.

glLoadIdentity:
Setzt unsere Scene wieder auf den 0 Punkt zurück. (siehe oben)

SwapBuffers:
Ist nur wichtig wenn ihr bei eurem PixelFormat DoubleBuffered eingestellt habt, hiermit wird zwischen den beiden Buffern hin und her gewechselt.

So, als allerletztes müßen wir die 2 Proceduren noch aufrufen.
InitGL wird am ende vom OnCreate ereigniss aufgerufen.
DrawScene im OnIdle der Scene.

Hierfür benutzt ihr am besten für den anfang die TApplication Komponente, ein doppelklick auf den OnIdle Event der Kompo:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
  var Done: Boolean);
begin
  DrawScene;
  Done:=False;
end;


Done müßt ihr auf alle fälle auf False setzen, da sonst das OnIdle Event nicht wieder aufgerufen wird. (Siehe OnlineHilfe)

Wenn ihr jetzt auf F9 drückt solltet ihr eine leere OpenGL Scene vor euch haben... ;)

Ok, aber eine leere Scene ist nicht so das wahre... nicht wahr..? :)
Kommen wir also nu ndazu, wie wir die Scene füllen.

Als erstes mal gibt es 3 wichtige Befehle:

glTranslate(X, Y, Z: Single);
Wie der Name schon sagt wird hiermit die Scene um die angegeben Koordinaten verschoben.
glTranslate(2,0,0) würde unsere Scene z.B. um 2 Einheiten in X-Richtung verschieben.

glRotate(Angle, X, Y, Z: Single);
Hiermit rotieren wir die Scene um den angegeben Winkel (Angle) auf der angegeben Achse.
um die Scene z.B. um 27° auf der Z Achse zu drehen würde es so aussehen: glRotate(27,0,0,1);

glScale(X, Y, Z: Single);
Hiermit Scalieren (Zoomen) wir unsere Scene... z.B:
glScale(2,2,2) würde alle Objekte doppelt so groß zeichnen wie sie sind.
glScale(0.5,0.5,0.5) alle nur halb so groß.
oder glScale(2,1,1) würde das Objekt auf der X-Achse strecken.

Diese 3 Befehle werden wohl die sein, die euch am anfang mit am häufigsten begegnen... auch wenn sie für leute die nochnie irgendwas mit 3D Kram gemacht haben sehr verwirrend sein können.. wenn ihr es erstmal ausprobiert habt, kapiert ihr da schon ;) (Die die 3D Programme benutzen sind hier klar im Vorteil *g*)

Als nächstes kommen wir zu den Farben...
Eine farbe wird in OpenGL mit glColor3f angegeben, wobei das 3f am ende dafür steht das hier 3 Parameter vom typ f (float) erwartet werden. ein 2i würde bedeutetn das 2 Integer Werte erwartet werden.. 4ub = 4 Paratemer vom typ Bate.. ;)

ok, glColor3f erwartet also 3 Single-Werte.
Das was viele hier verwirren wird ist das Farbschema von OpenGL, denn Farben werden hier in der regel nicht von 0..255 vergeben, sondern nur von 0..1
Ein paar Beispiele:
Weiß: 255,255,255 ist in OpenGL 1,1,1
Schwarz: 0,0,0 = 0,0,0
Grün: 0,255,0 = 0,1,0
HellesRot: 0,128,0 = 0,0.5,0

etc etc etc... Im grudne ganz einfach ;)
Für die, die sich daran absolut nicht gewöhnen können/wollen bleibt noch glColor3ub wo als Parameter herkömmliche Byte Werte erwartet werden... (aber ich würde euch empfehlen euch gleich an den OpenGL standard zu gewöhnen, da er an anderen stellen öffters mal in dieser Form gebraucht wird)

Kommen wir also nun zum eigentlichen Zeichnen unserer Scene.
In OpenGL kann man nur folgene grunddinge Zeichnen:


uns interressiert als erstesmal nur das einfache Quadrat.


Delphi-Quelltext
1:
2:
3:
glBegin(GL_QUADS);
  //Koordinaten
glEnd;


Hier teilen wir OpenGL mit das wir gleich ein Quad Zeichnen möchten (glBegin), und wenn wir fertig sind damit (glEnd)

Die Koordinaten werden in OpenGL mit glVertex übergeben, da wir das ganze 3D und nicht 2D haben möchten benutzen wir glVertex3f = 3 Float Parameter für X, Y und Z.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
glBegin(GL_QUADS);
  glVertex3f(1,-1,-5);
  glVertex3f(1,1,-5);
  glVertex3f(-1,1,-5);
  glVertex3f(-1,-1,-5);
glEnd;


Hier übergeben wir OpenGL also 4x3 Koordinaten, welche die Eckpunkte unseres Quadrates ergeben.
Das -5 am ende ist unsere Z Koordinate. Wenn wir hier 0 hinmachen würden, würden wir nix sehen da wir dann in dem Quadrat drinständen. Deswegen bewegen wir die Koordinate in den Bildschrim hinein um 5 Einheiten.

Das ganze könnte man aber auch so lösen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
glTranslate(0,0,-5);
glBegin(GL_QUADS);
  glVertex3f(1,-1,0);
  glVertex3f(1,1,0);
  glVertex3f(-1,1,0);
  glVertex3f(-1,-1,0);
glEnd;


Wir schieben die ganze Scene also ersteinmal in den Bildschirm hinein und zeichen dann das Quad.

Wenn ihr jetzt F9 drückt, solltet ihr ein Weißes Quadrat in der mitte eurer Scene sehen.

Machen wir das ganze mal ein wenig Bunt, um zu verdeutlichen welcher Koordinate wo auf dem Bildschirm ist ;)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
glTranslate(0,0,-5);
glBegin(GL_QUADS);
  glColor3f(1,0,0);  //Rot
  glVertex3f(1,-1,0);
  glColor3f(1,1,0);  //Gelb
  glVertex3f(1,1,0);
  glColor3f(0,1,0);  //Grün
  glVertex3f(-1,1,0);
  glColor3f(0,0,1);  //Blau
  glVertex3f(-1,-1,0);
glEnd;


Hier weisen wir also jeder Koordinate eine eigene Farbe zu, womit recht gut verdeutlicht wird welche Koordinate wo gezeichnet wird ;)

Wenn wir jetzt das ganze Quad z.B. Rot haben wollen, brauchen wir nicht jeder Koordinate ihre eigene Farbe zuzuweisen, sondern können am anfang vor dem Zeichnen einmal glColor3f(1,0,0) aufrufen, dann wird die Farbe rot solange benutzt bis man wieder eine andere farbe wählt.

So, als nächstes wollen wir unser Quad mal rotieren lassen, ok? :)
Hierfür brauchen wir als erstes eine Globale Variable.


Delphi-Quelltext
1:
2:
var
  RotateX: Single;


nun setzen wir hinter unser glTranslate ein glRotate:


Delphi-Quelltext
1:
2:
3:
4:
glTranslate(0,0,-5);
glRotate(RotateX,1,0,0);
glBegin(GL_QUADS);
  [...]


Bedeutet, wir drehen unsere Scene auf der X achse um den Wert RotateX.

Jetzt noch diese 3 Zeilen an's ende unserer Draw Procedur:


Delphi-Quelltext
1:
2:
3:
RotateX:=RotateX + 1;
if RotateX>360 then
  RotateX:=RotateX - 360;


Hier erhöhen wir also RotateX dauernd um 1, und sobald es größer als 360 ist, ziehen wir 360 ab.

Ein druck auf F9 müßte unser Quad nun rotieren lassen.

Hier solltet ihr nun auch den ersten 3D Effekt sehen :D

So, als letztes für dieses Tutorial werde ich euch nun noch Zeigen wir ihr Texturen verwenden könnt, hierfür braucht ihr die Textures.pas aus dem ZIP (Siehe oben) und müßt diese in das Projekt einbinden.

Der grund warum wir hier eine externe datei verwenden ist ganz einfach, es ist extrem kompliziert sowas selbst zu machen ;)
Ich hab mich die letzten Tage hingesetzt und mal eine Texture-Unit geschrieben, davor habe ich auch immer fremde genommen dafür.

Ok, nachdem wir die Unit nun eingebunden haben, brauchen wir mal wieder eine neue Varbiable:


Delphi-Quelltext
1:
  MyTex: TTextur;                    


und am Ende von OnCreate (es muß NACH der Initialisation von OpenGL geschehen, da sonst kein Speicher auf der GrafikKarte für die Textur reserviert wird.):


Delphi-Quelltext
1:
  MyTex:=TTextur.Create('C:\Programme\Delphi\Bla.bmp');                    

Als format gehen hier Bitmaps, JPEG und TGA Dateien.

Bevor wir die Textur nun aber verwenden können, müßen wir unsere Zeichen Routine noch ein wenig abändern. Hier kommt nun der befehl glTexCoord2fzur geltung.

mit glTexCoord2f geben wir die Koordinaten für unsere Textur an, also die TexturKoordinaten ;) Da eine Textur 2D und nicht 3D ist, gibt es hier nur 2 Parameter.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
glBegin(GL_QUADS);
  glTexCoord2f(1,0); glVertex3f(1,-1,0);
  glTexCoord2f(1,1); glVertex3f(1,1,0);
  glTexCoord2f(0,1); glVertex3f(-1,1,0);
  glTexCoord2f(0,0); glVertex3f(-1,-1,0);
glEnd;


Ihr seht, wir müßen für jede Koordinate des Quadrates auch die TexturKoordinate festlegen. (Spielt damit einfahc mal ein wenig rum, wenn ihr es seht versteht ihr es schon.. ;) )

So, nun müßen wir OpenGL noch mitteilen das wir Texturen benutzen möchten, das tun wir wieder im OnCreate, also bei der Initialisierung der Scene.


Delphi-Quelltext
1:
glEnable(GL_TEXTURE_2D);                    

Wir aktivieren also Texturierung.

So, nun noch angeben welche Textur wir möchten, und fertig ist's:


Delphi-Quelltext
1:
2:
3:
4:
5:
[...]
glRotate(RotateX,1,0,0);
MyTex.Bind;
glBegin(GL_QUADS);
  [...]


So, ein druck auf F9 sollte euch nun eure Textur auf dem Quad zeigen welches rotiert... ;)

Und ich denke das reicht für den einstieg erstmal... am besten ihr spielt nun ein wenig damit rum, indem ihr z.B. aus 6 Quads einen Würfel bastelt etc.

Oder ihr verändert das RotateX nicht in der RenderLoop, sondern z.B. bei einem druck auf eine Taste.. so das ihr das Quad mit den Tasten rotieren könnt ;) etc etc etc...

Hoffe das tutorial hat euch gefallen.

Au'revoir,
Aya~

PS: Ich will ja nun zu dme Tutorial hier noch einen kleinen IRC Kurs geben, hierzu bitte nur im OffTopic Thread reden, denn hier sollen nur die dinge hin, die für das Tutorial wichtig sind. Also Termin etc für das IRC Treffen wird im OffTopic ausgemacht.


mars - Do 10.04.03 23:34

Hehe, ist ja ganz einfach :D
Ja, das Tutorial hat Spass gemacht. Danke, Aya. Noch eine kleine Anmerkung: Ich glaube, du solltest die Variable hDC umbenennen, nicht?
Ansonsten sehr gut beschrieben und läuft alles glatt.


Aya - Do 10.04.03 23:37

mh... stimmt.. jetzt wo du es sagst.... :)


FloFri - Fr 11.04.03 00:30

super tutorial. das beste, was ich bis jetzt zu opengl gesehen habe! ich hoffe auf eine baldige fortsetzung (z.B. über lichter, texturenmatrizen, bumpmapping, runde objekte (kugeln, zylinder), etc.)


Andi1982 - Fr 11.04.03 13:20

Hi,
also ich habs mir bis jetzt zwar nur mal durchgelesen, aber so wie es aussieht ist das endlich mal was einfaches! Das versteh ja sogar ich endlich mal :D

Werds am wochenende gleich mal durcharbeiten!

Vielen Dank mal von allen dass du dir die Arbeit gemacht hast und dann auch noch so fix!

Cu Andi


mimi - Fr 11.04.03 17:20

habe es mal ebend ausgedruck;)
(es sind 8 seiten)


t/f - Fr 18.04.03 14:38

Hi Board, hi Aya!

Irgendwas haut nicht hin.

Ich bin gerade soweit, dass ein weißes Rechteck gezichnet werden sollte. Es tut sich aber nichts. Habe ich etwas falsch gemacht? Auf meinem Bildschirm erscheintlich lediglich das normale Form1.

Ich erlaube mir, einfach 'mal hier meinen bisherigen Quellcode zu posten.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure InitGL; 
    procedure DrawScene;
    procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

procedure SetDCPixelFormat(Handle: HDC);

var
  Form1: TForm1;
  h_DC: hDC; 
  hRC: HGLRC;
  
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
InitOpenGL;
h_DC:=GetDC(Handle);
SetDCPixelFormat(h_DC);
hRC:=wglCreateContext(h_DC);
wglMakeCurrent(h_DC,hRC);
InitGL;
end;

procedure TForm1.ApplicationEvents1Idle(Sender: TObject; 
  var Done: Boolean); 
begin 
  DrawScene; 
  Done:=False; 
end;

procedure TForm1.DrawScene;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glLoadIdentity;

  glTranslate(0,0,-5);
  glBegin(GL_QUADS);
    glVertex3f(1,-1,0);
    glVertex3f(1,1,0);
    glVertex3f(-1,1,0);
    glVertex3f(-1,-1,0);
  glEnd;
  
  SwapBuffers(h_DC); 
end;

procedure TForm1.InitGL;
begin 
  glClearColor(0,0,0,0);
  glClearDepth(1);
  glDepthFunc(GL_LESS);
  glShadeModel(GL_SMOOTH); 
  glEnable(GL_DEPTH_TEST); 

  glViewport(0,0,Width,Height); 
  glMatrixMode(GL_PROJECTION); 
  glLoadIdentity; 
  gluPerspective(45,Width/Height,1,100); 
  glMatrixMode(GL_MODELVIEW); 
end;

procedure SetDCPixelFormat(Handle: HDC);
var
  nPixelFormat: GLUint;
const
  pfd: PIXELFORMATDESCRIPTOR = (
      nSize: sizeof( PIXELFORMATDESCRIPTOR );
      nVersion: 1;
      dwFlags: PFD_DRAW_TO_WINDOW
      or PFD_SUPPORT_OPENGL
      or PFD_DOUBLEBUFFER;
      iPixelType: PFD_TYPE_RGBA;
      cColorBits: 16;
      cRedBits: 0;
      cRedShift: 0;
      cGreenBits: 0;
      cBlueBits: 0;
      cBlueShift: 0;
      cAlphaBits: 0;
      cAlphaShift: 0;
      cAccumBits: 0;
      cAccumRedBits: 0;
      cAccumGreenBits: 0;
      cAccumBlueBits: 0;
      cAccumAlphaBits: 0;
      cDepthBits: 16;
      cStencilBits: 0;
      cAuxBuffers: 0;
      iLayerType: PFD_MAIN_PLANE;
      bReserved: 0;
      dwLayerMask: 0;
      dwVisibleMask: 0;
      dwDamageMask: 0
  );
begin
    nPixelFormat:=ChoosePixelFormat(h_DC, @pfd); 
    SetPixelFormat(h_DC,nPixelFormat,@pfd); 
  end;

end.

Compiler-Errors krieg ich keine.

Was ich noch nicht wirklich verstanden habe ist die Funktion ApplicationEvents1Idle ... wann und wo wird sie eigentlich aufgerufen?

greetz
//me


Raphael O. - Fr 18.04.03 15:20

du musst im oncreate ereignis folgendes einfügen:

Quelltext
1:
ApplicationEvents1Idle:=application.onEventsidle;                    


t/f - Fr 18.04.03 15:26

so?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.FormCreate(Sender: TObject);
begin
InitOpenGL;
h_DC:=GetDC(Handle);
SetDCPixelFormat(h_DC);
hRC:=wglCreateContext(h_DC);
wglMakeCurrent(h_DC,hRC);
InitGL;
ApplicationEvents1Idle := application.onEventsidle;
end;

geht nicht...
Compiler hat folgendes geschrieben:
[Fehler] Unit1.pas(40): Undefinierter Bezeichner: 'onEventsidle'
[Fehler] Unit1.pas(40): Nicht genügend wirkliche Parameter
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden

... superschnell seid ihr ja hier. Find ich klasse! Ich glaub, das Forum gefällt mir ;)

greetz
//me

Moderiert von user profile iconTino: Quote-Tags hinzugefügt.


t/f - Fr 18.04.03 15:45

(kurze Frage noch: wo kann ich eine Detaillierte übersicht über die Wichtigsten OpenGL-Befehle kriegen? Ich habe bereits einen Blick in die .pas-Datei geworfen, aber die ist mit schier zu lang. :? )


Alibi - Fr 18.04.03 15:45

Die Zeile muss so lauten:

Quelltext
1:
Application.OnIdle := ApplicationEvents1Idle;                    


t/f - Fr 18.04.03 15:51

:D *Daumen hoch* klappt! :)


Aya - Fr 18.04.03 17:12

huhu,

ok.. war ich wohl ein wenig zu spät diesmal ;)

Aber zu der frage wo du ne liste bekommst..
im MSDN oder PSDK sind alle drin beschrieben... oder z.B. auch hier:
http://pyopengl.sourceforge.net/documentation/manual/reference.html

gibt viele solche seiten :)

Au'revoir,
Aya~


chucky - Fr 18.04.03 20:54

Ich würde am anfang jedem empfehlen die leichtere variante zu wählen, ogl zu initialisieren, wodurch pixelformat usw wegfällt. sowas sollte man meiner meinung nach erst später verstehen was das überhaupt soll.

Quelltext
1:
2:
DeviceContext := GetDC (FormMain.Handle);
RenderingContext := CreateRenderingContext (DeviceContext, [opDoubleBuffered], iPixelDepth, 0, 0, 0, 0, TempPal);


Aya - Fr 18.04.03 20:58

Hi,

Man sollte es evtl erst später verstehen, aber sich gleich daran gewöhnen finde ich.. ;)

Au'revoir,
Aya~


Raphael O. - Sa 19.04.03 00:52

Alibi hat folgendes geschrieben:
Die Zeile muss so lauten:

Quelltext
1:
Application.OnIdle := ApplicationEvents1Idle;                    

:oops: stimmt schon...
hatte aber auf dem PC, wo ich dran war leider kein Delphi drauf, so das ich es nicht testen konnte...
ist aber natürlich eigentlich klar ;)


t/f - Sa 19.04.03 00:55

Wann findet dieses Ereignis eigentlich statt? Bei vielen Ereignissen ist es mir ja klar... OnClick -> *Klick* ... aber Idle? Wenn nix passiert?


Aya - Sa 19.04.03 01:00

huhu,

OnIdle wird ausgelöst wenn die CPU grad mal nix zu tun hat ;)

Au'revoir,
Aya~


mimi - Do 24.04.03 17:56

ich verzuche gerade openGl zu lehren, aber ich sehe nur ein schwartzes bild warum:?
Fehler gerfunden ;)


The-FoX - Do 08.05.03 20:31

Jo haste echt gut gemacht :wink:, nur irgendwie bekomm ich gleich am Anfang die Meldung:
[Fehler] Unit1.pas(31): Undefinierter Bezeichner: 'SetDCPixelFormat'


Alibi - Do 08.05.03 21:01

Einfach weiterlesen, die Funktion wird eingebunden.


mimi - Do 08.05.03 22:02

hast du die units eingebunden, die du einbinden musstes ?


ROB - Sa 31.05.03 10:31

Ich bekomme immer die fehlermeldun undefinierter bezeichner TTextur. Habe aber alles in die uses liste eingeführt aber bekomme immernoch diese fehlermeldung.


Aya - Mo 02.06.03 11:38

Hi,

schick mir dochmal deinen Code als PM oder poste ihn hier. Dann schau ich mal :)

Au'revoir,
Aya~

PS: Bin mir sicher du hast die Unit falsch eingebunden ;) Du mußt sie gaaaanz oben im Source bei USES einbinden, unter Interface.
Nicht unter implementation (bzw. ausser du schreibst deine Variablen auch UNTER implementation.)


Elayla - Mi 11.06.03 21:12

Ahh deshalb gings bei mir auch nicht (TTextures) ^^
Wie binde ich die Textures.pas bei Uses ein? :oops:
Textures.pas will er nicht, nur Textures auch nicht :?

Nur Textures geht zwar, aber dann kennt er TTextur und ein paar andere immernoch nicht :(


Elayla - Mi 11.06.03 22:15

Hab das mit den Textruen noch nicht geschafft aber einen Würfel gebastelt bei dem die Farben (wie sie gegeben waren) an allen Ecken gleich sind :D

http://www.pro3d.de/gonozal/Project1.zip

*freu* :P


ROB - Do 12.06.03 19:05

Hab den fehler gefunden! In deiner unit textures hast du Glut eingebunden und als ich mir alle Glut treiber besorgt hatte hat es ge funzt! :D

Mfg ROB


ROB - Mo 16.06.03 10:55

Habe noch ein problem! Wenn ich mir die Exe im Explorer anschaue sehe ich nur ein schwarzes bild und nicht den würfel! Habe ich vieleicht doch etwas für Windows vergessen da es bei Delphi alles funzt! :bawling:


Gottdrak99 - Mi 18.06.03 13:13
Titel: Problem
Hmm, ich hab D7 und habe folgendes problem bei compilieren von opengl12.pas

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
//--------------
{$IFNDEF VER140}
procedure RaiseLastOSError;
begin
  RaiseLastWin32Error;
end;
{$ENDIF}
//----------------

und bei RaiseLastWin32Error; erhalte ich eine Warung

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


Oliver - Mi 25.06.03 12:51
Titel: Fraggee
HI Leute

Erstmal ein Lob für das klasse Tutorial, sehr gut verständlich.

Hätte da aber mal eine Frage ich hoffe mir kann jemand helfen, und zwar wollte ich wissen ob es einen Möglichkeit gibt 3ds-Files (oder auch andere "3d Dateien") zu importieren und anzeigen zulassen? :?!?:
cu Oli


Aya - Mi 25.06.03 13:23
Titel: Re: Fraggee
Hi,
Oliver hat folgendes geschrieben:
Hätte da aber mal eine Frage ich hoffe mir kann jemand helfen, und zwar wollte ich wissen ob es einen Möglichkeit gibt 3ds-Files (oder auch andere "3d Dateien") zu importieren und anzeigen zulassen? :?!?:


klar geht das.. ;)
Für *.Obj Dateien habe ich mal einen Import-Klasse geschrieben, welche die Objekte als VertexArray und/oder DisplayList lädt und darstellt etc...

Für 3DS Objekte gibt's auch genügend möglichkeiten das zu Importieren..entweder du lädst dir ne fertige Unit runter, oder schautst dir das 3DS Format an und bastelst es selber ;)

Au'revoir,
Aya~


t/f - Sa 16.08.03 18:24

hi,

ich ahbe eben versucht dieses Tutorial auf Linux RedHat 9 anzuwenden und bemerkt, dass einigue teile windowsspeziefisch sind.

Gibt es da alternativen für Kylix?

Ist die Textures.pas auch auf Windows ausgelegt?

greetz
//me


Aya - Sa 16.08.03 18:26

Hi,

hab mich ehrlichgesagt nochnie mit Kylix beschäftigt = hab absolut KA ob da Windowsspezifische Befehle drin sind :oops: (klar.. alles was mit wgl beginnt is Win-Spezifisch)

Au'revoir,
Aya~


mimi - Sa 16.08.03 18:54

dann werden wohl diese befehler unter linux nicht laufen, würde ich mal sagen :(


t/f - Sa 16.08.03 19:45

hm ... kann mir jemand helfen ein Tutorial zu finden (möglichst deutsch)?

OpenGL12.pas konnte ich bereits durch OpenGLx.pas (via kylixforum.de) ersetzen.
Ich glaube aber ich brauche auch noch eine Textures.pas

So wie es aussieht ist die aber von Aya, stimmts? ...

greetz
//me

P.S. - Wenn ich mich im Netz umsehe, habe ich das Gefühl ich gehöre zu den ersten 3d-Hoby-Proggern unter Linux ;)


Aya - Sa 16.08.03 19:48

t/f hat folgendes geschrieben:
So wie es aussieht ist die aber von Aya, stimmts? ...

Jep, die Textures.pas ist von mir... sag mir mal welche Befehle er daraus nicht kennt unter Kylix.

Au'revoir,
Aya~


t/f - Sa 16.08.03 21:02

Also ich bin ja noch nicht weit gekommen, aber das erste Problem sieht so aus:

In der Textures.pas ist die Unit "Windows" eingebunden. Diese scheint zu fehlen

Zitat:

[Fataler Fehler] Textures.pas(73): Datei nicht gefunden: 'Windows.dcu'


greetz
//me


Aya - Sa 16.08.03 21:27

Öhm.. ja, und wieso schmeißt du die nicht einfach mal aus den Uses raus? ;)


t/f - Sa 16.08.03 23:43

Ähm ... ja, gute Frage *g

naja ich habs ma eben versucht. ich musste darauf hin auch "graphics" und "jpeg" entfernen ... und daraufhinhhat haben dann funktionen aus den uses gefehlt...

greetz
//me


Aya - So 17.08.03 00:02

Hi,

Dann schau mal ob es für Graphics und JPEG ersatzunits für Kylix gibt.
ansonsten wüsste ich auchnix, hab mich damit wie gesagt nochnie beschäfftigt ;)

Au'revoir,
Aya~


AndyB - So 17.08.03 01:21

Für Kylix:

Graphics = QGraphics

Bei Jpeg muss man ein wenig "tricksen":

Delphi-Quelltext
1:
2:
type
  TJpegImage = TBitmap

Das TBitmap kann unter Linux neben .bmp auch .xpm, .png und .jpg einlesen und schreiben.


10Markus - So 17.08.03 12:53
Titel: Problem mit dem ganzen...
Hi,

ich habe vor ein 3D-Koordinatensystem zu zeichnen, komme aber nicht richtig weiter. Es geht schon damit los, dass ich folgendes nicht machen kann: Ich habe einen Punkt mit x|y|z und will einen 2. Punkt zeichnen, der die gleichen x|y-koordinaten hat, nur eine andere z koordinate. Wie muss ich das anstellen?

Könnte mir vielleicht jemand den Code eines einfachen Würfels schicken, dann hätte ich mal eine Vorlage, mit der ich was anfangen könnte.

Ihr könnt mich auch per ICQ kontakten (#169699241).

Wäre für jede Hilfe Dankbar.

Grüße,
Markus


t/f - So 17.08.03 14:13

ok ich bin aber noch nicht viel weiter

ich habe folgende Änderungen vorgenommen:

Delphi-Quelltext
1:
2:
3:
uses
  OpenGL12, SysUtils, QGraphics, Classes;
  // Windows, OpenGL12, SysUtils, Graphics, JPEG, Classes;

und

Delphi-Quelltext
1:
2:
type
  TJpegImage = TBitmap;

Aber es scheint mehr zu fehlen ... ;)
Zitat:
[Fehler] Textures.pas(87): Undefinierter Bezeichner: 'TRGBQuad'
[Fehler] Textures.pas(88): Undefinierter Bezeichner: 'DWord'
[Fehler] Textures.pas(235): Undefinierter Bezeichner: 'CopyMemory'
[Fehler] Textures.pas(257): Undefinierter Bezeichner: 'CopyMemory'
[Fehler] Textures.pas(292): Undefinierter Bezeichner: 'BitmapFileHeader'
[Fehler] Textures.pas(293): Undefinierter Bezeichner: 'BitmapInfoHeader'
[Fehler] Textures.pas(302): 'THEN' erwartet, aber Bezeichner 'bfType' gefunden
[Fehler] Textures.pas(308): 'THEN' erwartet, aber Bezeichner 'biSize' gefunden
[Fehler] Textures.pas(313): Operator oder Semikolon fehlt
[Fehler] Textures.pas(314): ')' erwartet, aber Bezeichner 'biHeight' gefunden
[Fehler] Textures.pas(316): ';' erwartet, aber 'IF' gefunden
[Fehler] Textures.pas(317): Undefinierter Bezeichner: 'iHeader'
[Fehler] Textures.pas(319): Undefinierter Bezeichner: 'Bitmap'
[Fehler] Textures.pas(320): Inkompatible Typen
[Fehler] Textures.pas(321): Inkompatible Typen
[Fehler] Textures.pas(325): Inkompatible Typen
[Fehler] Textures.pas(329): Deklaration erwartet, aber 'IF' gefunden
[Fehler] Textures.pas(330): Undefinierter Bezeichner: 'PalSize'
[Fehler] Textures.pas(330): Operator oder Semikolon fehlt
[Fehler] Textures.pas(330): Anweisung erforderlich, aber Ausdruck vom Typ 'Integer' gefunden
[Fehler] Textures.pas(331): Undefinierter Bezeichner: 'Bitmap'
[Fehler] Textures.pas(331): Nicht gengend wirkliche Parameter
[Fehler] Textures.pas(331): ')' erwartet, aber ',' gefunden
[Fehler] Textures.pas(332): '.' erwartet, aber 'IF' gefunden
[Fehler] Textures.pas(332): Bezeichner redefiniert: 'Finalization'
[Fehler] Textures.pas(333): Undefinierter Bezeichner: 'Result'
[Fehler] Textures.pas(334): Inkompatible Typen
[Warnung] Textures.pas(336): Text hinter dem abschlie?nden 'END.' wird vom Compiler ignoriert
[Hinweis] Textures.pas(116): Das private-Symbol 'ImageSize' wurde deklariert, aber nie verwendet
[Fehler] Textures.pas(118): Ungengende Forward- oder External-Deklaration: 'TTextur.ClearMem'
[Hinweis] Textures.pas(119): Das private-Symbol 'SetAlpha' wurde deklariert, aber nie verwendet
[Hinweis] Textures.pas(120): Das private-Symbol 'SwapRB' wurde deklariert, aber nie verwendet
[Hinweis] Textures.pas(121): Das private-Symbol 'Load32' wurde deklariert, aber nie verwendet
[Hinweis] Textures.pas(122): Das private-Symbol 'Load24' wurde deklariert, aber nie verwendet
[Hinweis] Textures.pas(123): Das private-Symbol 'Load16' wurde deklariert, aber nie verwendet
[Hinweis] Textures.pas(124): Das private-Symbol 'Load8' wurde deklariert, aber nie verwendet
[Hinweis] Textures.pas(125): Das private-Symbol 'Load4' wurde deklariert, aber nie verwendet
[Hinweis] Textures.pas(126): Das private-Symbol 'ExpandTo32' wurde deklariert, aber nie verwendet
[Fehler] Textures.pas(139): Ungengende Forward- oder External-Deklaration: 'TTextur.SaveToFile'
[Fehler] Textures.pas(141): Ungengende Forward- oder External-Deklaration: 'TTextur.LoadFromResource'
[Fataler Fehler] Unit1.pas(7): Verwendete Unit 'Textures.pas' kann nicht compiliert werden

ich suche mal noch alternativen für jpeg... problem ist allerdings, dass mir für sowas oft die quellen fehlen.

greetz
//me


t/f - So 17.08.03 17:41

ich glaub', mir fallen gleich die haare ausm kopf ... :( ... ich kann einfach nichts finden.

hat den noch nie auf dieser welt irgendwer opengl mit kylix programmiert? ...

... mir qualmt die birne...

greetz
//me


Spurius - Mo 18.08.03 21:49

Hallo,
ich mach grad das tut durcj aber wenn ich das prog ausführen will kommt die fehlermeldung:
undefinierter bezeichner pwglswap
woran liegts?
MfG
Spurius


Mr_T - Di 19.08.03 11:24

@ t/f:
Der Umstieg auf openglx.pas ist nicht nötig, da die Unit OpenGl12.pas bereits
Cross-Platform ist! Dein Problem liegt in diesem Falle (leider) nicht an der Texturen-unit, sondern daran, das die Initialisierung unter Kylix (allegemain unter Linux) etwas anders verläuft... (es gibt halt keine Hanles, DeviceContexte, die Sache mit dem pixelformat ist etwas anders,usw) und die ganze Ini wird unter Linux über GLX-Funktionen gemacht...
Irgendwo hier auf meiner Platte habe ich noch eine Kylix (3 OE) init für Open Gl rumliegen, die theoretisch laufen sollte (Tat sie bei mir in der Praxis nicht, da ich scheinbar keine Vernümpftigen GLX-Treiber hatte....)
Textur-Units gibt sehr wenige, die Crossplattform laufen... mir selber fällt spontan nur eine ein, welche ich mir mal selber gezimmert habe (hatte nur eine einzige Funktion: JPEGs oder BMPs zu laden und an eine tglint-Variable zu übergeben, damit man via "glbindtexture" die Textur verwenden kann...)
Sollte ich die Init wiederfinden packe ich sie gleich mit dazu und lade den ganzen Krempel hoch... (sollteste die init eher schaffen, gib mir mal den Source, wie du es gemacht hast... bin mir wie gesagt nicht sicher, ob meine bei korrekten GLX-Treibern gefunzt hätte... bekommst dann auch die Textur-Unit als Dankeschön ;-) )


StefanH - Sa 23.08.03 16:51

Cooles Tut! 8) Wirklich!!!

Bloß mein Würfel sieht nach Streichholzschaltel aus...


Aya - Sa 23.08.03 17:10

Hi,

für alle die interresse haben.. Ich gebe am Sonntag um 20Uhr im IRC einen kleinen IRC Kurs.. :)

Findet im QuakeNet im Channel #delphi-praxis statt.

Au'revoir,
Aya~

PS: Es wird vorrausgesetzt das die beiden OpenGL Tutorials von mir durchgearbeitet wurden ;)


10Markus - Sa 11.10.03 16:03
Titel: Text??
Hi,

weiß jemand wie ich (ähnlich wie Canvas) mit OpenGL einen Text bei bestimmenten Koordinaten anzeigen kann? Muss keine Effekte oder so haben, nur ein Text.


Philer - So 09.11.03 09:51

Ich seh nur schwarz! :?
k.a. wo der fehler ist ich hab alles so gemacht wie es im tut stand! :? :(


FiedelKaystro - So 21.12.03 11:49
Titel: hilfe
Ich weis, das mein problem schon mehrmals aufgetreten ist aber ich komm nicht mehr weiter.
Mein code siht jetzt so aus:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure InitGL;
    procedure DrawScene; 
    procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
  private
    { Private-Deklarationen }
  public 
    { Public-Deklarationen }
  end;

procedure SetDCPixelFormat(Handle: HDC);

var
  Form1: TForm1; 
  h_DC: hDC;  
  hRC: HGLRC; 
   
implementation 

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
InitOpenGL; 
h_DC:=GetDC(Handle); 
SetDCPixelFormat(h_DC); 
hRC:=wglCreateContext(h_DC); 
wglMakeCurrent(h_DC,hRC); 
InitGL;
Application.OnIdle := ApplicationEvents1Idle;
end

procedure TForm1.ApplicationEvents1Idle(Sender: TObject;  
  var Done: Boolean);  
begin  
  DrawScene;  
  Done:=False;  
end

procedure TForm1.DrawScene; 
begin 
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); 
  glLoadIdentity;

  glTranslate(0,0,-5); 
  glBegin(GL_QUADS); 
    glVertex3f(1,-1,0); 
    glVertex3f(1,1,0); 
    glVertex3f(-1,1,0); 
    glVertex3f(-1,-1,0); 
  glEnd; 
   
  SwapBuffers(h_DC);  
end;

procedure TForm1.InitGL; 
begin  
  glClearColor(0,0,0,0); 
  glClearDepth(1); 
  glDepthFunc(GL_LESS); 
  glShadeModel(GL_SMOOTH);  
  glEnable(GL_DEPTH_TEST);  

  glViewport(0,0,Width,Height);  
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;  
  gluPerspective(45,Width/Height,1,100);  
  glMatrixMode(GL_MODELVIEW);  
end

procedure SetDCPixelFormat(Handle: HDC); 
var 
  nPixelFormat: GLUint; 
const 
  pfd: PIXELFORMATDESCRIPTOR = ( 
      nSize: sizeof( PIXELFORMATDESCRIPTOR );
      nVersion: 1
      dwFlags: PFD_DRAW_TO_WINDOW 
      or PFD_SUPPORT_OPENGL 
      or PFD_DOUBLEBUFFER; 
      iPixelType: PFD_TYPE_RGBA; 
      cColorBits: 16
      cRedBits: 0
      cRedShift: 0
      cGreenBits: 0
      cBlueBits: 0
      cBlueShift: 0;
      cAlphaBits: 0
      cAlphaShift: 0
      cAccumBits: 0
      cAccumRedBits: 0
      cAccumGreenBits: 0
      cAccumBlueBits: 0
      cAccumAlphaBits: 0
      cDepthBits: 16
      cStencilBits: 0
      cAuxBuffers: 0
      iLayerType: PFD_MAIN_PLANE;
      bReserved: 0
      dwLayerMask: 0
      dwVisibleMask: 0
      dwDamageMask: 0 
  ); 
begin 
    nPixelFormat:=ChoosePixelFormat(h_DC, @pfd);  
    SetPixelFormat(h_DC,nPixelFormat,@pfd);
  end;

end.


Aber nichts, ich sehe nur das normale form, kein hintergrund kein viereck.


Spieler1 - So 21.12.03 14:10

Das Tutorial ist echt gut! Ich find es immer toll, wenn Leute sowas machen.
Du solltest es vielliecht noch auf eine Webseite stellen, damit es nicht in ein paar Monaten im Forum "untergeht".
Außerdem kann man es dann auch leichter über Suchmaschinen finden. Du kannst ja trotzdem einen Link hierher machen.


Raphael O. - So 21.12.03 20:21

guckst du hier:
http://www.koshigaya.de


Spieler1 - So 21.12.03 20:58

Fiji-Fighter hat folgendes geschrieben:
guckst du hier:
http://www.koshigaya.de


Gut, dass es online steht, aber die Webseite braucht ewig lang zum laden (mit DSL).


G-McKree - Fr 02.01.04 20:07

is ja alles einfacher als ich dachte

aber
1. glrotate rotiert ja alles (oder nur die cam), wie bekomm ich das hin das nur etwas rotiert?
2. kann man objecte aus Maya importieren?


andy09071978 - Di 06.04.04 13:59

zum Rotieren von einzelnen Objekten verwende wie bei der Gesamtrotation sin und cos.

Benötigst du mehrere bastle Dir am Besten eine Klasse, die sich selbstständig drehen kann

Gruß

PS: dann wirds schon nimmer so einfach :roll:


Anonymous - Mo 12.04.04 02:59

hiho

In dem Tut steht
Zitat:
Hierfür benutzt ihr am besten für den anfang die TApplication Komponente, ein doppelklick auf den OnIdle Event der Kompo:
Über der Application.OnIdle Procedure... Wo bitte kann ich den doppelklicken? Ich find das irgendwie nicht :(

MfG, sCrAPt


Anonymous - Mo 12.04.04 03:20

hmm... glatt noch was:
wenn ich

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.DrawScene; 
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glLoadIdentity;

  glTranslate(0,0,-5);
  glBegin(GL_QUADS);
    glVertex3f(1,-1,0);
    glVertex3f(1,1,0);
    glVertex3f(-1,1,0);
    glVertex3f(-1,-1,0);
  glEnd;

  SwapBuffers(h_DC);
end;
compiliere kommt error:
Zitat:
[Fehler] Unit1.pas(42): Undefinierter Bezeichner: 'glTranslate'

Ich habe aber OpenGl12 bei uses eingetragen :/

MfG, sCrAPt


Raphael O. - Mo 12.04.04 11:05

unter zusätzlich gibts die Komponente "ApplicationEvents", die die Methode OnIdle bereitstellt :)
---
versuchs mal mit glTranslatef(x,y,z);

EDIT: achja, warum macht ihr keinen neuen Thread in einem Forum auf, wos hingehört?
ich schaue hier fast nie rein :roll:


Anonymous - Mo 12.04.04 11:06

1. TApplicationEvents?
2. GlTranslate(d/f)

EDIT: Mist, zu spät. :P


NetZwerg - Do 17.06.04 18:14

Hi,

schönes tut, endlich mal eins wo drin steht wie man einfach initialisieren kann. :D Wie kann ich das Teil denn in den Vollbildmodus bringen?


Flexxx - Fr 09.07.04 16:07

mimi hat folgendes geschrieben:
ich verzuche gerade openGl zu lehren, aber ich sehe nur ein schwartzes bild warum:?
Fehler gerfunden ;)

Guck mal ob deine FormCreate-Methode auch richtig ist:

Quelltext
1:
2:
3:
4:
5:
6:
  InitOpenGL;
  h_DC:=GetDC(Handle);
  SetDCPixelFormat(h_DC);
  hRC:=wglCreateContext(h_DC);
  wglMakeCurrent(h_DC,hRC);
  InitGL;


PS: Das gleiche Problem hatte ich auch.


Edit: Huch! Dieser Thread hat ja mehr als nur eine Seite... :oops:


Spieler1 - Di 17.08.04 16:18

Flexxx hat folgendes geschrieben:
mimi hat folgendes geschrieben:
ich verzuche gerade openGl zu lehren, aber ich sehe nur ein schwartzes bild warum:?
Fehler gerfunden ;)

Guck mal ob deine FormCreate-Methode auch richtig ist:

Quelltext
1:
2:
3:
4:
5:
6:
  InitOpenGL;
  h_DC:=GetDC(Handle);
  SetDCPixelFormat(h_DC);
  hRC:=wglCreateContext(h_DC);
  wglMakeCurrent(h_DC,hRC);
  InitGL;


PS: Das gleiche Problem hatte ich auch.


Edit: Huch! Dieser Thread hat ja mehr als nur eine Seite... :oops:

Gut, dass du nicht gesehen hast, dass der Thread mehr als eine Seite hast, sonst hätte ich extra nochmal nachfragen müssen, denn ich hatte das Problem wie einige andere auch (InitGL aufzurufen vergessen) -> Danke für die Hilfe. :wink:


Flexxx - So 12.09.04 15:50

NetZwerg hat folgendes geschrieben:
Hi,

schönes tut, endlich mal eins wo drin steht wie man einfach initialisieren kann. :D Wie kann ich das Teil denn in den Vollbildmodus bringen?


Man kann einfach das Fenster maximieren und den "Rand" entfernen:

Quelltext
1:
2:
BorderStyle := bsNone;
WindowsState := wsMaximized;


Wenn man jetzt noch eine andere Auflösung haben will muss man mal im Forum nach Beschreibungen suchen, wie man die Auflösung ändern kann... :D


GSE - So 12.09.04 16:04


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure Tmainform.GoToFullScreen(pWidth, pHeight, pBPP, pFrequency: Word);
var
 dmScreenSettings: DevMode;
begin
 // Fenster vor Vollbild vorbereiten
 WindowState := wsMaximized;
 BorderStyle := bsNone;
 ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
 with dmScreenSettings do
 begin
  dmSize := SizeOf(dmScreenSettings);
  dmPelsWidth := pWidth; // Breite
  dmPelsHeight := pHeight; // Höhe
  dmBitsPerPel := pBPP; // Farbtiefe
  dmDisplayFrequency := pFrequency; // Bildwiederholfrequenz
  dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL or DM_DISPLAYFREQUENCY;
 end;
 if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then
 begin
  MessageBox(0'Konnte Vollbildmodus nicht aktivieren!''Error', MB_OK or MB_ICONERROR);
  exit;
 end;
end;
musst du allerdings vor dem Erstellen deines RenderContextes aufrufen. Falls dein programm beendet wird oder abstürzt setzt Windows die Auflösung automatisch wieder auf den Ursprungswert zurück, musst dich also darum nicht kümmern.

mfg
GSE


Big Deal - Di 26.10.04 17:36

mist..
ich bekomme immer

Quelltext
1:
[Fatal Error] Unit1.pas(7): File not found: 'OpenGL12.dcu'                    


find ich es so aber nicht witzig. denn ich habe es sogar schon geschafft ohne die vcl opengl zu initialisieren, was mir aber auf dauer zu aufwendig wird, da ich dann auch auf die funktionen der vcl verzichten muss, und eben dadurch dauernd die systemnachrichtenabhorchen muss :(

hartcoded hatte ich das mit opengl.pas.
allerdings erkennt delphi nicht die neue opgengl12.pas :((
bitte um rat.


Paddymann - Di 21.03.06 18:15

Bei mir kommt bei dem LInk zu OPEN GL 12.pas und Textures.pas "Seite nicht gefunden".
Hat jemand noch einen Link wo ich die runter laden kann?
thx und mfg
patti


F34r0fTh3D4rk - So 09.04.06 09:55

Zitat:

Mehrere Verbundene Dreiecke (GL_QUAD_STRIP)

muss das nicht Quadrate heißen ?


jaenschi - Sa 29.04.06 16:11

user profile iconPaddymann hat folgendes geschrieben:
Bei mir kommt bei dem LInk zu OPEN GL 12.pas und Textures.pas "Seite nicht gefunden".
Hat jemand noch einen Link wo ich die runter laden kann?
thx und mfg
patti


Ich schließe mich der Suche mal an! ;)


F34r0fTh3D4rk - Sa 29.04.06 17:19

die textures.pas hab ich auch nicht gefunden, es wird jetzt auch häufiger zu glbitmap.pas gegriffen und den aktuellen header gibts auf http://www.delphigl.com


Raphael O. - Do 18.05.06 15:11

user profile iconjaenschi hat folgendes geschrieben:
user profile iconPaddymann hat folgendes geschrieben:
Bei mir kommt bei dem LInk zu OPEN GL 12.pas und Textures.pas "Seite nicht gefunden".
Hat jemand noch einen Link wo ich die runter laden kann?
thx und mfg
patti


Ich schließe mich der Suche mal an! ;)

früher war bei den Beispielen auf http://www.sulaco.co.za/ immer die textures.pas dabei.