Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: ¤Se®ega¤ от Апрель 06, 2009, 02:12



Название: Вращение в OpenGL
Отправлено: ¤Se®ega¤ от Апрель 06, 2009, 02:12
Вопрос из серии "глупо не знать", ну уж простите.
Начал читать про OpenGL, взял простейший пример с вращением пирамиды при помощи мыши.Как мне сделать это вращение автоматическим?по таймеру?


Название: Re: Вращение в OpenGL
Отправлено: mal от Апрель 07, 2009, 11:31
Как я понимаю в функции paintGL() для разворота используется функция glRotate(...) для всех координат...
 Заведите переменные под значения углов - в моем примере x_Rot, y_Rot, z_Rot. Проинициализируйте их,
в paintGL() разворот сделайте:
Код:
glRotated(x_Rot , 1.0, 0.0, 0.0);
glRotated(y_Rot , 0.0, 1.0, 0.0);
glRotated(z_Rot , 0.0, 0.0, 1.0);

Создать таймер, свяжите его со слотом. В этом слоте изменяйте угол разворота вокруг нужной оси  и зовите updateGL()
Код:
slot_timer()
{
   y_Rot++; //меняем угол
   if(y_Rot >360)
      y_Rot = 0;

   updateGL(); //перерисовываем сцену
}

Удачи


Название: Re: Вращение в OpenGL
Отправлено: ¤Se®ega¤ от Апрель 07, 2009, 12:21
Спасибо. Но я думаю, что вся анимация в OpenGL должна отрисовываться на только по событиям и таймерам, но и каким то еще методом.


Название: Re: Вращение в OpenGL
Отправлено: mal от Апрель 07, 2009, 14:04
в опенжеэльных книжках в примерах при анимации организуются циклы, QT предлагает вам таймер...
иного способа не встречал пока.

ЗЫ я тоже  непротив чтоб код сам писался :-)


Название: Re: Вращение в OpenGL
Отправлено: ¤Se®ega¤ от Апрель 07, 2009, 18:48
Спасибо.
 ;D


Название: Re: Вращение в OpenGL
Отправлено: ¤Se®ega¤ от Апрель 09, 2009, 15:20
объсните, что я не так делаю?

***.h
Код
C++ (Qt)
#include <QGLWidget>
#include <QTimer>
 
class OGLPyramid : public QGLWidget {
private:
GLuint m_nPyramid;
GLfloat m_xRotate;
GLfloat m_yRotate;
QPoint m_ptPosition;
QTimer *timer;
protected:
virtual void initializeGL ();
virtual void resizeGL (int nWidth, int nHeight);
virtual void paintGL ();
virtual void mousePressEvent(QMouseEvent* pe );
virtual void mouseMoveEvent (QMouseEvent* pe );
GLuint createPyramid (GLfloat fSize = 1.0f );
public slots:
void change();
public:
OGLPyramid(QWidget* pwgt = 0) ;
};
 
***.cpp
#include <qevent.h>
 
OGLPyramid::OGLPyramid(QWidget* pwgt/*= 0*/) : QGLWidget(pwgt)
, m_xRotate(0)
, m_yRotate(0)
{
  timer = new QTimer;
  QObject::connect(timer,SIGNAL(timeout()),SLOT(change()));
  timer->start(500);
}
void OGLPyramid::change()
{
m_xRotate++;
if(m_xRotate>360)
  m_xRotate=0;
updateGL();
}
...
void initializeGL ()
{
...
}
void resizeGL (int nWidth, int nHeight)
{
...
}
 
void paintGL ()
{
...
}
 
void mousePressEvent(QMouseEvent* pe )
{
...
}
 
void mouseMoveEvent (QMouseEvent* pe )
{
m_xRotate += 180 * (GLfloat) (pe->y() - m_ptPosition.y () ) / height ();
m_yRotate += 180 * (GLfloat)(pe->x() - m_ptPosition.x()) / width();
updateGL();
...
}
 
По  клику с перемещением все работает, по таймеру нет.Как надо организовать таймер?




Название: Re: Вращение в OpenGL
Отправлено: mal от Апрель 09, 2009, 16:27
у меня кусок вашего кода с организацией таймера работает один в один  ???
проверьте приходят ли сообщения в change() ?


Название: Re: Вращение в OpenGL
Отправлено: ¤Se®ega¤ от Апрель 09, 2009, 16:47
 том то и проблема, что таймер со слотом не связывается.


Название: Re: Вращение в OpenGL
Отправлено: pastor от Апрель 09, 2009, 16:53
том то и проблема, что таймер со слотом не связывается.

Добавь макрос Q_OBJECT


Название: Re: Вращение в OpenGL
Отправлено: ¤Se®ega¤ от Апрель 09, 2009, 16:55
спасибо.Все заработало ))) :D


Название: Re: Вращение в OpenGL
Отправлено: ¤Se®ega¤ от Апрель 09, 2009, 16:58
А еще не подскажете как мне заставить теперь это все генериться с частотой в 50 fps?таймер как я понял не подходит.