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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вращение в OpenGL  (Прочитано 10855 раз)
¤Se®ega¤
Гость
« : Апрель 06, 2009, 02:12 »

Вопрос из серии "глупо не знать", ну уж простите.
Начал читать про OpenGL, взял простейший пример с вращением пирамиды при помощи мыши.Как мне сделать это вращение автоматическим?по таймеру?
Записан
mal
Гость
« Ответ #1 : Апрель 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(); //перерисовываем сцену
}

Удачи
Записан
¤Se®ega¤
Гость
« Ответ #2 : Апрель 07, 2009, 12:21 »

Спасибо. Но я думаю, что вся анимация в OpenGL должна отрисовываться на только по событиям и таймерам, но и каким то еще методом.
Записан
mal
Гость
« Ответ #3 : Апрель 07, 2009, 14:04 »

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

ЗЫ я тоже  непротив чтоб код сам писался :-)
Записан
¤Se®ega¤
Гость
« Ответ #4 : Апрель 07, 2009, 18:48 »

Спасибо.
 Смеющийся
Записан
¤Se®ega¤
Гость
« Ответ #5 : Апрель 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();
...
}
 
По  клику с перемещением все работает, по таймеру нет.Как надо организовать таймер?


« Последнее редактирование: Апрель 09, 2009, 15:55 от pastor » Записан
mal
Гость
« Ответ #6 : Апрель 09, 2009, 16:27 »

у меня кусок вашего кода с организацией таймера работает один в один  Непонимающий
проверьте приходят ли сообщения в change() ?
Записан
¤Se®ega¤
Гость
« Ответ #7 : Апрель 09, 2009, 16:47 »

 том то и проблема, что таймер со слотом не связывается.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Апрель 09, 2009, 16:53 »

том то и проблема, что таймер со слотом не связывается.

Добавь макрос Q_OBJECT
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
¤Se®ega¤
Гость
« Ответ #9 : Апрель 09, 2009, 16:55 »

спасибо.Все заработало ))) Веселый
Записан
¤Se®ega¤
Гость
« Ответ #10 : Апрель 09, 2009, 16:58 »

А еще не подскажете как мне заставить теперь это все генериться с частотой в 50 fps?таймер как я понял не подходит.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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