Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: naico от Октябрь 25, 2008, 14:21



Название: Проблема с рисованием openGL.
Отправлено: naico от Октябрь 25, 2008, 14:21
Мне нужно нарисовать небольшую сценку с помощью openGL, стал разбираться как можно сделать это в кьюте.

Написал простейший класс для отображения:
Код:
#include <QGLWidget>
#include "ui_mygldrawer.h"
#include <QtOpenGL>
class MyGLDrawer : public QGLWidget
{
Q_OBJECT       

public:
MyGLDrawer(QWidget *parent) ;
~MyGLDrawer ();

protected:
void initializeGL();
void paintGL();
void resizeGL (GLint, GLint);
};

MyGLDrawer :: MyGLDrawer(QWidget *parent)
: QGLWidget(parent) {resize(500, 500);}

MyGLDrawer::~MyGLDrawer()
{

}

void MyGLDrawer :: resizeGL(int w, int h)
{
glViewport(0, 0, (GLint)w, (GLint)h);
}

void MyGLDrawer ::initializeGL()
{
glClearColor (0, 0, 0, 1);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
void MyGLDrawer ::paintGL ()
{
glBegin (GL_LINES);
glColor3ub (230, 230, 230);
qglColor (qRgb (255,255,255));
glVertex2i (20, 30) ;
glVertex2i (113.0, 4.0);
glVertex2i (511.0, 61.0);
glVertex2i (7.0, 8.0);
glEnd();
}

Вроде бы все проще паренной репы. Сам класс использую так :


Код:
room2::room2(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{

drawer = new MyGLDrawer(this);

}

Откомпилировал, запустил.
Область виджета черная, происходит "очищение экрана" (проверил заменив цвет), но линии не появляются. Проверил - управление передается на paintGL, т.е рисование по-идее должно происходить, но что-то не так. Код практически выдран из пособия по openGL, но не работает, я в замешательстве, может я что-то не так делаю?


Название: Re: Проблема с рисованием openGL.
Отправлено: pastor от Октябрь 25, 2008, 14:54
А если сделать так?


Код:
room2::room2(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{

drawer = new MyGLDrawer(this);
setCentralWidget(drawer);
}


Название: Re: Проблема с рисованием openGL.
Отправлено: naico от Октябрь 25, 2008, 15:07
А если сделать так?


Код:
room2::room2(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{

drawer = new MyGLDrawer(this);
setCentralWidget(drawer);
}

Увы, ничего не изменилось.:(

Получается, что есть "связь" с drawer'oм, т.к "очищение" работает нормально, но не может же лично у меня GL работать неправильно:)


Название: Re: Проблема с рисованием openGL.
Отправлено: Sergeich от Октябрь 25, 2008, 21:18
Ты не установил проекционную матрицу, по умолчанию отображается объем с координатами от -1 до 1 по каждому измерению. Если тебе нужно рисовать в координатах виджета матрицу надо выставить как-то так:
Код:
#include <QtOpenGL>
#include <QApplication>

class MyGLDrawer : public QGLWidget
{
Q_OBJECT       
public:
MyGLDrawer(QWidget *parent) ;
~MyGLDrawer ();
protected:
void initializeGL();
void paintGL();
void resizeGL (GLint, GLint);
};

MyGLDrawer :: MyGLDrawer(QWidget *parent)
: QGLWidget(parent)
{
resize(500, 500);
}

MyGLDrawer::~MyGLDrawer()
{
}

void MyGLDrawer :: resizeGL(int w, int h)
{
    glViewport(0, 0, (GLint)w, (GLint)h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho( 0, w, h, 0, -1, +1 );

    updateGL();
}

void MyGLDrawer ::initializeGL()
{
glClearColor (0, 0, 0, 1);
}
void MyGLDrawer ::paintGL ()
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
qglColor (qRgb (255,255,255));
glBegin (GL_LINES);
glVertex2i (20, 30) ;
glVertex2i (113.0, 4.0);
glVertex2i (511.0, 61.0);
glVertex2i (7.0, 8.0);
glEnd();
}


Название: Re: Проблема с рисованием openGL.
Отправлено: naico от Октябрь 26, 2008, 09:41
Cпасибо :)