Einzelnen Beitrag anzeigen
Alt 08.02.2005, 09:06   #13
MarkusV
Elite
 
Registriert seit: 18.01.2000
Alter: 51
Beiträge: 1.264


Standard

Hallo Phil,

> Was ich noch nicht verstehe ist: wie kriege
> ich Delphi dazu, OpenGL zu benutzen?

> Also welche zeilen muss ich schreiben damit das genommen
> wird und wie geht es dann weiter,

Genau das nimmt dir z.B. die cgLib von www.delphi3.net
ab. Ich vermute, daß deren aktueller Nachfolger, DOT, das genau
so macht.

Konkret passiert folgendes: standardmäßig ist das Hauptfenster
einer Applikation ein Nachfolger der Klasse TForm. In cgLib für
Delphi wird das durch TcgForm ersetzt. TcgForm ist eine Klasse,
die mit TForm identisch ist, aber beim Initialisieren den OpenGL-
spezifischen Code hinzufügt. Das ist Systemprogrammierung, die
dich nicht zu interessieren braucht (Stichwort: Pixel Format
Descriptors) und die deswegen komplett in der Klasse TcgForm
versteckt wird. Bei DOT wird es ähnlich sein.

Alles, was du als Programmierer tun muß, ist

TFlightInstrumentsForm = class(TForm)

durch

TFlightInstrumentsForm = class(TCGForm)

zu ersetzen.

Dann fehlt nur die Initialisierung von OpenGL. Bei cgLib wird
das durch den Befehl "InitGL" erledigt, der in der Standard-
Routine "FormCreate" aufgerufen wird. (FormCreate wird von
Delphi ja immer dann erzeugt, wenn du bei TForm / TcgForm das
Event "OnCreate" definierst.)

Die komplette Initialisierung von OpenGL sieht bei mir so aus:

// OpenGL initializations
InitGL; // this is specific to the Delphi OpenGL headers.
// OpenGL initialization code concering 2D projections
glLoadIdentity();
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_MODELVIEW);
glOrtho(0, 1.0*displaySize, 0, 1.0*displaySize , -1, 1);

Das ist alles. glLoadIdentify setzt das Koordinatensystem
zurück, glViewport definiert, in welchem Bereich von deinem
Fenster zu zeichnen willst, und der Rest definiert Kamera-
position und 2D-Koordinatensystem mit dem Größenbereich
x = 0..displaySize, y = 0..displaySize

Fertig.

> kann ich dann die OpenGL-befehle einfach so hinschreiben
> oder müssen die noch "Delphisiert" werden?

Das ist das Schöne. Wenn du Delphi erst einmal initialisiert
hast, dann kannst du alle Delphi-Befehle auf allen Systemen
und Sprachen identisch verwenden. Da muß nichts angepasst
werden.

Das ganze sieht dann z.B. so aus, am Beispiel des PLIs, der
anzeigt, bei welchem Pitch-Winkel der Stall einsetzen würde
(B747-400 PFD):

Zitat:
procedure THorizon.DrawPitchLimit;
var PLIpitch : single;
const HorPtchScale = 2.0;
begin
// Pitch Limit is received in PS1.3 pixel unit. Convert ...
PLIpitch := 5*(57 - Limit) / 12;
// Of course, the PL indicator is only shown with Flaps OUT of up position
if (FlpYpos <> 261) and (FlpYPos <> 0) then
begin
glPushMatrix; // Push #03
glTranslated(0,PLIpitch*HorPtchScale,0);
glColor3f(1,1,0); glLineWidth(0.6*FDBarWidth);
glBegin(GL_LINES);
glVertex2f(-26, 0);
glVertex2f(-19, 0);
glVertex2f(-19, 0);
glVertex2f(-19, -2);

glVertex2f(-26 , 3); glVertex2f(-24, 0);
glVertex2f(-24.5, 3); glVertex2f(-22.5, 0);
glVertex2f(-23 , 3); glVertex2f(-21, 0);

glVertex2f( 26 , 3); glVertex2f( 24, 0);
glVertex2f( 24.5, 3); glVertex2f( 22.5, 0);
glVertex2f( 23 , 3); glVertex2f( 21, 0);

glVertex2f( 19, -2);
glVertex2f( 19, 0);
glVertex2f( 19, 0);
glVertex2f( 26, 0);
glEnd();
glPopMatrix;
end;
end;
Du siehst, hier passiert nicht viel. Nach einem Stück Logik
am Anfang werden nur Linien (GL_LINES) gezeichnet. glVertex2f
(2f = 2 Floating Point Numbers) sind einfach Vektoren,
die Anfangs- und Endpunkte jeweils einer Linie angeben. Das
Ganze wird in Gelb (glColor3f(1,1,0) mit RGB = 1,1,0) gezeichnet.

Viele Grüße,

Markus
____________________________________
WinPS1 - Aerowinx PS1.3 als echte Windows-Applikation
MarkusV ist offline   Mit Zitat antworten