Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.81/16: Рейтинг темы: голосов - 16, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 17.12.2014
Сообщений: 5
1

Qt + OpenGL. Анимация

20.12.2014, 15:24. Просмотров 2957. Ответов 2
Метки нет (Все метки)

Пытаюсь сделать анимацию, но не понимаю что да как... Объясните пожалуйста.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
*.h
class GLWidget : public QGLWidget
{
    Q_OBJECT
private:
    GLdouble x;
    GLdouble y;
    QTimer *timer;
public:
   explicit GLWidget(QWidget *parent = 0);
   void initializeGL();
   void paintGL();
   void resizeGL(int w, int h);
public slots:
   void change();
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
*.cpp
#include "glwidget.h"
 
int id_timer;
 
GLWidget::GLWidget(QWidget *parent):
    QGLWidget(parent)
{
    timer = new QTimer;
       QObject::connect(timer,SIGNAL(timeout()),SLOT(change()));
       timer->start(10);
}
 
/*GLWidget::~GLWidget()
{
 
}*/
 
 
 
void GLWidget::initializeGL()
{
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glShadeModel(GL_FLAT);
}
 
void GLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(0.0, 0.0, 0.0);
    glBegin(GL_LINES);
    glLineWidth(10.5);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(0.0, 1.0, 0.0); 
    glEnd();
 
    glPushMatrix();
    glTranslated(x, y, 0.0);
    glColor3f(0.0, 0.0, 0.0);
    glBegin(GL_LINES);
    glLineWidth(6);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(0.0, 1.0, 0.0);
    glEnd();
    glPopMatrix();
 
 
 
}
 
void GLWidget::change()
{
    x += 0.06;
    y += 0.02;
    updateGL();
}
 
void GLWidget::resizeGL(int w, int h)
{
    glViewport(0, 0, (GLint)w, (GLint)h);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2014, 15:24
Ответы с готовыми решениями:

Анимация в OpenGL, а где собсно, анимация?
// Bounce.cpp // Demonstrates a simple animated rectangle program with GLUT // OpenGL SuperBible,...

OpenGl анимация
Всем привет. Нужно написать анимацию для вывода спрайта. Анимация заключается в замене...

анимация в openGL на С++
У кого работает на пишите пожалуйста? #include <GL/freeglut.h> Предоприделим глобальными...

opengl анимация снег
не могу создать анимацию снега, помогите пожалуйста! вот снеговик, его нужно сделать прозрачным,...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
2
4189 / 2295 / 388
Регистрация: 05.10.2013
Сообщений: 6,394
Записей в блоге: 177
08.01.2015, 00:19 2
После запуска программы paintGL() сработает раньше, чем change(), поэтому x и y нужно инициализировать явно в конструкторе

Вы не установили трёхмерную канву, если вы хотите рисовать в ортографической проекции. Либо создайте канву с перспективой. Вот пример, как учесть ещё и отношения сторон, чтобы объекты не искажались, когда пользователь меняет размер окна:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void GLWidget::resizeGL( int w, int h )
{
    // Prevent a divide by zero
    if( h == 0 ) {
        h = 1;
    }
 
    // Set Viewport to window dimensions
    glViewport( 0, 0, w, h );
 
    // Reset projection matrix stack
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
 
    GLfloat nRange = 100.0f;
 
    // Establish clipping volume (left, right, bottom, top, near, far)
    if ( w <= h ) {
        glOrtho ( -nRange, nRange, -nRange*h/w, nRange*h/w,
                  -nRange, nRange );
    } else {
        glOrtho ( -nRange*w/h, nRange*w/h, -nRange, nRange,
                  -nRange, nRange );
    }
 
    // Reset Model view matrix stack
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
}


С учётом вышесказанного исправил ваш пример:

GLWidget.h
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef GLWIDGET_H
#define GLWIDGET_H
 
#include <QGLWidget>
#include <QTimer>
 
class GLWidget : public QGLWidget
{
    Q_OBJECT
 
public:
    GLWidget( QWidget *parent = 0 );
    ~GLWidget();
 
private slots:
   void change();
 
private:
    void initializeGL();
    void paintGL();
    void resizeGL( int w, int h );
 
    GLdouble x;
    GLdouble y;
    QTimer *timer;
};
 
#endif // GLWIDGET_H


GLWidget.cpp
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "GLWidget.h"
 
GLWidget::GLWidget(QWidget *parent) :
    QGLWidget( parent ),
    x( 0.0 ),
    y( 0.0 )
{
    timer = new QTimer;
    connect( timer,SIGNAL( timeout() ),SLOT( change() ) );
    timer->start(10);
}
 
GLWidget::~GLWidget()
{
 
}
 
void GLWidget::change()
{
    x += 0.06;
    y += 0.02;
    updateGL();
}
 
void GLWidget::initializeGL()
{
    glClearColor( 1.0, 1.0, 1.0, 1.0 );
    glShadeModel( GL_FLAT );
}
 
void GLWidget::paintGL()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glColor3f( 0.0, 0.0, 0.0 );
    glBegin( GL_LINES );
    glLineWidth( 10.5 );
    glVertex3f( 0.0, 0.0, 0.0 );
    glVertex3f( 0.0, 1.0, 0.0 );
    glEnd();
 
    glPushMatrix();
    glTranslated( x, y, 0.0 );
    glColor3f( 0.0, 0.0, 0.0 );
    glBegin( GL_LINES );
    glLineWidth( 6 );
    glVertex3f( 0.0, 0.0, 0.0 );
    glVertex3f( 0.0, 1.0, 0.0 );
    glEnd();
    glPopMatrix();
}
 
void GLWidget::resizeGL( int w, int h )
{
    // Prevent a divide by zero
    if( h == 0 ) {
        h = 1;
    }
 
    // Set Viewport to window dimensions
    glViewport( 0, 0, w, h );
 
    // Reset projection matrix stack
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
 
    GLfloat nRange = 10.0f;
 
    // Establish clipping volume (left, right, bottom, top, near, far)
    if ( w <= h ) {
        glOrtho ( -nRange, nRange, -nRange*h/w, nRange*h/w,
                  -nRange, nRange );
    } else {
        glOrtho ( -nRange*w/h, nRange*w/h, -nRange, nRange,
                  -nRange, nRange );
    }
 
    // Reset Model view matrix stack
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
}
0
Миниатюры
Qt + OpenGL. Анимация  
4189 / 2295 / 388
Регистрация: 05.10.2013
Сообщений: 6,394
Записей в блоге: 177
08.01.2015, 00:23 3
glBegin()/glEnd() - это очень старый способ рисования. Нужно рисовать с использованием шейдеров

Ещё в новом коде нужно использовать классы, которые начинаются с QOpenGL*, а не с QGL*. К примеру, нужно использовать QOpenGLWidget, а не QGLWidget и обновлять с помощью update(), а не updateGL() Посмотрите, как я рисую современным способом: 001 Qt C++ OpenGL GLSL Рисуем треугольник
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2015, 00:23

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Спрайтовая анимация в OpenGL
Здравствуйте. Собственно, вопрос таков: как реализовать спрайтовую (покадровую) анимацию персонажа...

Анимация куба OpenGL (C++)
У меня нарисована по граням игральная кость. Используется glEnable(GL_DEPTH_TEST) для глубины и...

opengl - анимация сферы
Пожалуйста, помогите. хотя бы советом)). задача состоит в том, чтобы прога рисовала трехмерный...

Анимация сортировки массива на OpenGL
Задали курсовую анимация сортировки массива на OpenGL, элементы массива представляются...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.