[QT] OpenGL interface

0

Opanowałem jako takie podstawy OpenGL'a używają FreeGLUT'a. Jednak ostatnio naszedł mnie taki kaprys by OGL'a użyć z interfejsem Qt. Z dokumentacji wyczytałem, że obiekt OGL możemy zrobić jako normalnego widget'a (dziedzicząc z QGLWidget) i zwyczajnie wrzucić na formę. Na początek chciałem zrobić sobie najzwyczajniejszy trójkąt i kwadrat. Kod na pierwszy rzut oka wydaje się dość długi jak na forum jednak po prawdzie żadnej filozofii tu nie ma:

qgl_firstSteps.h

//--------------------
//--Klasa widget'u--
//---------------------
class CGLwidget : public QGLWidget
{
	Q_OBJECT

public:
	CGLwidget(QWidget *parent = 0);
	~CGLwidget();

	QSize minimumSizeHint() const;
        QSize sizeHint() const;

	
protected:
	void initializeGL();
	void paintGl();
	void resizeGL(int width, int height);
};

//---------------------
//----Klasa okna-------
//---------------------

class CWindow: public QWidget
{
	Q_OBJECT
public:
	CWindow();
	~CWindow();
private:
	CGLwidget *glScene;
};

qgl_fristSteps.cpp

CGLwidget::CGLwidget(QWidget *parent)
	: QGLWidget(QGLFormat(QGL::SampleBuffers), parent)
{
	
	
}

CGLwidget::~CGLwidget()
{

}
//**********
void CGLwidget::initializeGL()
{
	glShadeModel(GL_SMOOTH);
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
	glClearDepth(1.0f);         // ustawienie bufora głebi
	glEnable(GL_DEPTH_TEST);         // włączenie testowania głębi
	glDepthFunc(GL_LEQUAL);
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

}
//************
void CGLwidget::paintGl()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

	glTranslatef(-1.5f,0.0f,-6.0f);

	glBegin(GL_TRIANGLES);         // Rysujemy trójkąty
        glVertex3f( 0.0f, 1.0f, 0.0f);         // Góra
        glVertex3f(-1.0f,-1.0f, 0.0f);         // Lewy
        glVertex3f( 1.0f,-1.0f, 0.0f);         // Prawy
    glEnd();         // Koniec rysowania trójkąta

	glTranslatef(3.0f,0.0f,0.0f);

	glBegin(GL_QUADS);
		glVertex3f(-1.0f,1.0f,0.0f);//gorny lewy
		glVertex3f(-1.0f,-1.0f,0.0f);//dolny lewy
		glVertex3f(1.0f,-1.0f,0.0f);//dolny prawy
		glVertex3f(1.0f,1.0f,0.0f);//gorny prawy
	glEnd();

}
//***********
void CGLwidget::resizeGL(int width, int height)
{

}

QSize CGLwidget::minimumSizeHint() const
{
	return QSize(50, 50);
}

QSize CGLwidget::sizeHint() const
{
	return QSize(400, 400);
}
//----------------
//---Klasa okna---
//----------------

CWindow::CWindow()
{
	glScene=new CGLwidget;

	QHBoxLayout *mainLayout = new QHBoxLayout;
        mainLayout->addWidget(glScene);

	setLayout(mainLayout);

}
//*******
CWindow::~CWindow()
{
	

}

Wszystko się kompiluje, uruchamia się bez problemu ale rezultat jest taki: http://img299.imageshack.us/img299/3431/qglresult.jpg
I teraz pytanie, czego nie uwzględniłem?

//q: nie pisze posta, bo nie wiem i ni epomoge, ale az mi sie cisnie na usta: wow. sliczne. zupelnie jakby framebuffer sie zrąbał.. ale inne formaty pikseli to by wyszly horyzontalne paski a nie prostokatne regiony.. jak niska warstwa moglaby inaczej kopiowanie skopac?

0

A ja odświeżę bo jestem prawie pewien że ktoś tutaj używaj OpenGL z Qt :>

0

Nie znam openGL, ale powinieneś zajrzeć do przekładów Qt. Dam sobie głowę urwać, że jest tam przykład (chyba nawet nie jeden) jak można wykorzystać OpenGL w aplikacjach Qt.

EDIT: sprawdziłem ile jest tych przykładów. AŻ 10!

0

Wiem że jest sporo przykładów, ja robiłem na podstawie Hello GL: http://doc.trolltech.com/4.6/opengl-hellogl.html
I zastosowałem taką samą zasadę, robię widget reimplementujac odpowiednie metody wirtualne QGLWidget i wrzucam je na formę.
No nic, będę kombinował dalej.

0
several napisał(a)

[..]

[..]
	void paintGl();
[..]
[..]
void CGLwidget::paintGl()
[..]

Na Ozyrysa i na Apisa, jakie paintGl? Ma być paintGL. Czytajże dokumentacje http://doc.trolltech.com/3.3/qglwidget.html#paintGL!

0

Damn, nie ten link http://doc.qt.nokia.com/4.0/qglwidget.html#paintGL, ale tamten też może być jako lekcja poglądowa.

0

Czytam dokumentację, dlatego pozostałe metody napisałem dobrze. Zwykła literówka dzięki ;) Teraz mam całe czarne tło ale to już raczej nie problem z Qt, jeszcze raz dzięki ;)

0
several napisał(a)

Czytam dokumentację, dlatego pozostałe metody napisałem dobrze. Zwykła literówka dzięki ;) Teraz mam całe czarne tło ale to już raczej nie problem z Qt, jeszcze raz dzięki ;)

No popatrz, to musieli dzisiaj zaktualizować stronę http://doc.qt.nokia.com/4.0/qglwidget.html#details

resizeGL() - Sets up the OpenGL viewport, projection, etc. Gets called whenever the the widget has been resized (and also when it is shown for the first time because all newly created widgets get a resize event automatically).

a u ciebie:

void CGLwidget::resizeGL(int width, int height)
{

}

Tak wrzuć w ta metodę coś mniej wiecej takiego:

     int side = qMin(width, height);
     glViewport((width - side) / 2, (height - side) / 2, side, side);

     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     glFrustum(-5.0, 5.0, -5.0, 5.0, 5.0, 60.0);
     glMatrixMode(GL_MODELVIEW);
0

Tak tak, masz rację. Ale wpadłem na to gdy rozkminiałem dlaczego mam czarne okno, ja zrobiłem tak:

void CGLwidget::resizeGL(GLsizei width, GLsizei height)
{
	if (height==0)         // zapobiegamy dzieleniu przez 0
	{
		height=1;         
	}
	glViewport(0, 0, width, height);
	glMatrixMode(GL_PROJECTION);         
	glLoadIdentity();         
			
	gluPerspective(55.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); 
	glMatrixMode(GL_MODELVIEW);        
	glLoadIdentity(); 
}

Dzięki anyway.

1 użytkowników online, w tym zalogowanych: 0, gości: 1