OpenGL 2D Graphik (QT4)

Alles rund um die Programmierung mit Qt
Antworten
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

OpenGL 2D Graphik (QT4)

Beitrag von kowi1134 »

Hallo!


Ich habe Probleme mit OpenGL Deshalb beschreibe ich hier sehr ausführlich was genau mein Programm können soll!!!


Zu Lernzwecken schreibe ich momentan an einem Programm, dass verschiedene Sortieralgorithmen visuell veranschaulichen soll.
Die Idee ist es, zuerst einmal ein Feld mit einer festgelegten Anzahl an Pseudo-Zufallszahlen zu erzeugen, die es zu sortieren gilt.
Als nächstes sollen diese Zahlen dann graphisch in einem QGLwidget dargestellt werden.

Mein Programm ist folgendermaßen organisiert:
MainWindow.cpp/h : enthält sämtlichen Programmcode für mein Hauptfenster (siehe Bild)
GLDrawer.h : enthält die von QGLwidget abgeleitete Klasse GLDrawer (das widget ist im Bild rot eingekreist)

In der Datei MainWindow.h habe ich einen öffentlichen Zeiger auf GLDrawer angelegt, der in MainWindow.cpp (im Konstruktor) so initialisiert wird:

Code: Alles auswählen

glWidget = new GLDrawer(frame_Graphics);
(Anmerkung: "frameGraphics" ist ein gewöhnlicher Frame.)

Hier ist meine GLDrawer.h Datei:

Code: Alles auswählen

#ifndef GL_DRAWER_H
#define GL_DRAWER_H

#include <QGLWidget>

class GLDrawer : public QGLWidget
{
	Q_OBJECT;
	
	public:
    GLDrawer(QWidget *parent) : QGLWidget(parent)
		{
			makeCurrent();
		}
		
		void drawField(int *field, int size, int min, int max)
		{
   		glClearColor(1.0, 1.0, 1.0, 1.0);
			glClear(GL_COLOR_BUFFER_BIT);
   		glColor3f(0.0, 0.0, 0.0);
   		// Koordinatensystem einrichten mit: -x,+x,-y,+y,-z,+z
   		glOrtho(0.0, (GLfloat) size, (GLfloat) min, (GLfloat) max, -1.0, 1.0);

			glBegin(GL_POINTS);
			for (int i = 0; i < size; i++)
			{
				glVertex2i(i,field[i]);
			}
			glEnd();
   		glFlush();
		}
		
  protected:

  	void initializeGL()
  	{
		}

		void resizeGL(int w, int h)
  	{
  	}

  	void paintGL()
  	{
		}
};

#endif
Die Methode drawField soll auf Kommando Punkte in das glWiget zeichnen, die sich aus dem Feldindex (x-Koordinate) und dem Feldwert (y-Koordinate) ergeben. Der Feldwert liegt zwischen "min" und "max" und das Feld hat "size" viele Einträge. Um ein Feld zu zeichnen, muss ein folgender Aufruf möglich sein:

Code: Alles auswählen

int field[3] = {100, 200, 300};
glWidget->drawField(field,3,100,300);
Aber irgendetwas stimmt an meiner GLDrawer Klasse nicht. Wer kann mir weiterhelfen?

Ciao
Dateianhänge
Unbenannt-1.gif
Unbenannt-1.gif (16.28 KiB) 2741 mal betrachtet
Zuletzt geändert von kowi1134 am 6. August 2005 23:20, insgesamt 1-mal geändert.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: OpenGL 2D Graphik (QT4)

Beitrag von macman »

kowi1134 hat geschrieben:

Code: Alles auswählen

	void initializeGL()
	{
	}

	void resizeGL(int w, int h)
	{
	}

	void paintGL()
	{
	}
Das ist ja alles leer. So lange da nichts drin steht, wird auch nichts gemalt. Schau dir noch mal die Doku zu QGLWidget an und dann vielleicht noch die Beispiele zu OpenGL.
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

Beitrag von kowi1134 »

Ich hatte in paintGL() etwas drin stehen, das so ähnlich aussah wie dass in drawField(), aber das wurde dann immer schon gezeichnet, wenn ich das widget initialisiere.
Die Doku habe ich gelesen, aber ich raffe nicht, warum ich in paintGL z.B. ein glClear() o.ä. aufrufen soll, wenn ich doch mit drawField() zeichnen will.

Außerdem will ich das widget erstmal nicht in der Größe verändern.

Mein OpenGL-Wissen reicht auch noch nicht aus, um initializeGL() auszuprogrammieren. Ich hatte gehofft, dass ich mit dem bischen 2D Graphik um solche Dinge wie Viewport und Matrizen herumkomme. Wahrscheinlich irre ich hier, da OpenGL mit homogenen Koordinaten und immer in 3D rechnet.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

In paintGL() muß was rein, sonst malt OpenGL nichts. Hier ein paar Links, vielleicht verdeutlicht das etwas die Arbeitsweise von OpenGL:
http://www.it.fht-esslingen.de/~schmidt ... pengl.html
http://www.3dsource.de/faq/
http://nehe.gamedev.net/

Am besten wird es aber sein, Du nimmst Dir ein OpenGL Beispiel und spielst mal damit rum.
Antworten