Russian Qt Forum
Ноябрь 25, 2024, 06:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с рисованием openGL.  (Прочитано 4213 раз)
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, но не работает, я в замешательстве, может я что-то не так делаю?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Октябрь 25, 2008, 14:54 »

А если сделать так?


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

drawer = new MyGLDrawer(this);
setCentralWidget(drawer);
}
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
naico
Гость
« Ответ #2 : Октябрь 25, 2008, 15:07 »

А если сделать так?


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

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

Увы, ничего не изменилось.Грустный

Получается, что есть "связь" с drawer'oм, т.к "очищение" работает нормально, но не может же лично у меня GL работать неправильно:)
Записан
Sergeich
Гость
« Ответ #3 : Октябрь 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();
}
Записан
naico
Гость
« Ответ #4 : Октябрь 26, 2008, 09:41 »

Cпасибо Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 23.