Модераторы: Rickert, Alexeis, BorisVorontsov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [qt, opengl] изменение размеров рисунка 
:(
    Опции темы
gordmiand
Дата 9.8.2010, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



Хочу сделать простейшую анимацию – перемещение крестика по OpenGL-сцене...
Делаю так:
Код

class GL_klass:  public QGLWidget
{
public:
    GL_klass();
    void initializeGL();
    void resizeGL(int width, int height);
    void paintGL();
    float  dx, dy;
};
///////////////////////////////////////////////////////////////////
#include "GL_klass.h"
GL_klass::GL_klass()
{       }

void GL_klass::initializeGL()
{
    dx=0, dy=0;
    qglClearColor(Qt::black);
}

void GL_klass::resizeGL(int width, int height)
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0,0,(GLint) width, (GLint) height);
    glOrtho(0, 100, 100,  0,-100,100);
    glMatrixMode(GL_MODELVIEW);
}


void GL_klass::paintGL()
{
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      glLoadIdentity();
   float X=25, Y=25, rr=1;

glPushMatrix();
   glTranslatef(dx,dy,0);

         glBegin (GL_LINES);
             glVertex2f (X-rr*0.5, Y);
             glVertex2f (X+rr*0.5, Y);
             glVertex2f (X, Y-rr*0.5);
             glVertex2f (X, Y+rr*0.5);
         glEnd();
 glPopMatrix();
}
///////////////////////////////////////////////////////////////////
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "GL_klass.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    GL_klass *gl = new GL_klass;
    ui->horizontalLayout->addWidget(gl);

    QTimer *main_timer=new QTimer(this);
    connect(main_timer, SIGNAL(timeout()), this, SLOT(ShowGrafika()));
    main_timer->start(2000);
}

void MainWindow::ShowGrafika()
{
    gl->dx+=0.25;
    gl->dy+=0.25;
    gl->updateGL();
}


Вопрос – почему у меня почти каждый новый крестик отличается от предыдущего? то есть одна палка крестика рисуется смещенной относительно другой, а то и визуально короче, хотя они должны рисоваться  относительно точки (X,Y,) и одинаковой длины (см. код выше)...Если рисовать крестик побольше (задать коэф. rr = 5), то вроде все нормально перерисовывается, но мне надо рисовать маленький крестик (примерно как при rr = 1) . Подскажите пож-та в чем тут дело и как решить практически такую проблему? в прилагаемом архиве - данная программка...

Это сообщение отредактировал(а) gordmiand - 12.8.2010, 20:00

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  gl_primer.rar 4,26 Kb
PM MAIL   Вверх
gordmiand
Дата 10.8.2010, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



нет ну правда - что за глюк такой? может я хочу нарисовать слишком мелкий рисунок или надо задавать размеры в "целых" opengl-пикселах? почему-то же ведь этот же рисунок, но в увеличенном виде перерисовывается без искажений, а при рисовании крестика меленьким - иногда (в некоторых перерисовках) возникают "глюки" в виде смещения палочек креста относительно друг друга... 
подскажите пож-та в чем тут дело и как сие исправить?
PM MAIL   Вверх
gordmiand
Дата 12.8.2010, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



 smile :люди, подскажите пож-та хотя бы теоретически - ну почему у меня при перерисовке обыкновенного крестика или квадрата данная(ые) фигура(ы) геометрически искажается - вроде все переменные типа float, размеры примитивов тоже вещественные числа...а если рисуешь например тот же квадрат, но побольше - тогда он нормально перерисовывается, но мне-то его надо маленьким нарисовать (примерно 0.7*0.7 gl-пикселей при размере gl-сцены 100*100) - пробовал и масштабирование использовать, и целочисленный размер квадрата (1*1), но с увеличением размеров сцены (200*200) для сохранения нужной мне пропорции, вместо float использовал GLfloat  - эффектов ноль (то получается, что крестик несимметричный относ-но его центра, то вместо квадрата - явный прямоугольник)... smile 

Это сообщение отредактировал(а) gordmiand - 12.8.2010, 19:58
PM MAIL   Вверх
Alexeis
Дата 12.8.2010, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



  Лучше было тему создать в разделе C/C++: Мультимедия, OpenGL/DirectX .

 По умолчанию опенгл считает область рисования квадратной, вне зависимости от соотношения сторон. 
Исправляется это так.
Код

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glScalef(1 / MaxWidth, 1 / MaxHeight, 1);
 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
gordmiand
Дата 12.8.2010, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



Alexeis: первые 2 строки из првиеденного Вами вышее ответа у меня и так уже есть - в функции resizeGL (см. выше в моем примере)...
а вот куда именно вставить и зачем уменьшать изображение в 100 раз???
Код

 glScalef(1 / MaxWidth, 1 / MaxHeight, 1);

если эту строку поставить в resizeGL или paintGL(), то естес-но ничего не увидишь - настолько фигура мелкая и куда-то она смещается из-за масш-ия...ответьте пож-та поподробнее что куда.... 

Это сообщение отредактировал(а) gordmiand - 12.8.2010, 20:41
PM MAIL   Вверх
Alexeis
Дата 13.8.2010, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



Цитата(gordmiand @  12.8.2010,  19:41 Найти цитируемый пост)
если эту строку поставить в resizeGL или paintGL(), то естес-но ничего не увидишь - настолько фигура мелкая и куда-то она смещается из-за масш-ия...ответьте пож-та поподробнее что куда.... 

  Ну я сделал экран таким, чтобы пикселы экрана соответствовали пикселам OpenGL (по умолчанию ведь область рисования -1..1) В принципе, никто ведь не мешает сделать что-то типа
Код

 glScalef(std::min(MaxWidth, MaxHeight) / MaxWidth, std::min(MaxWidth, MaxHeight) / MaxHeight, 1);

Как известно домножение на константу не искажает пропорции.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
gordmiand
Дата 15.8.2010, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



Alexeis: поставил Ваш glScale сразу перед отрисовкой крестика:
Код

glScalef(std::min(100.0f, 100.0f) / 100.0f, std::min(100.0f, 100.0f) / 100.0f, 1.0f);

glPushMatrix();
   glTranslatef(dx,dy,0);
         glBegin (GL_LINES);
             glVertex2f (X-rr*0.5, Y);
             glVertex2f (X+rr*0.5, Y);
             glVertex2f (X, Y-rr*0.5);
             glVertex2f (X, Y+rr*0.5);
         glEnd();
 glPopMatrix();


это масштабирование ничего не дает - как крестик криво перерисовывался ранее, так он и сейчас так же перерисовывается....или этот cr'qk не сюда надо ставить и что он вообще дает?
и вообще - хотелось бы понять в теории почему происходят такие метаморфозы с "пропорциями" (смещение палок крестика друг относительно друга) фигуры при ее перерисовке?
PM MAIL   Вверх
Alexeis
Дата 15.8.2010, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



Цитата(gordmiand @  15.8.2010,  18:44 Найти цитируемый пост)
это масштабирование ничего не дает 

Конечно ничего не дает если пропорции оставить 1:1 с чего бы что-то поменялось? Неужели окно квадрат, а не прямоугольник?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
gordmiand
Дата 16.8.2010, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



вообще мне не принципиальны размеры gl-сцены - я взял например как 100*100, так как при прямоугольных размерах сцены соот-но и картинка будет сплющена по Y или растянута по Х...но почему нельзя оставить квадратные размеры сцены и что тогда будет с остальными моими примитивами на экране? просьба пояснить вообще почему такое у меня происходит при перерисовке примитива(ов)? подскажите пож-та предметно на моем примере (см.выше) что и как мне надо сделать, а то я уже замучился перебирать различные варианты...
PM MAIL   Вверх
Alexeis
Дата 16.8.2010, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



Цитата(gordmiand @  16.8.2010,  08:00 Найти цитируемый пост)
вообще мне не принципиальны размеры gl-сцены - я взял например как 100*100

  Т.е. искажения наблюдаются даже в случае если окно квадратное?  smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
gordmiand
Дата 16.8.2010, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



Alexeis: в то-то и дело, что именно при размерах сцены 100*100 (оно у меня изначально было, другое мне в принципе и не надо) и получаются какие-то искажения фигуры при ее перерисовке - см. приложенный архив программы в начале данной темы...и я не могу понять почему такое в приципе происходит...но если выводить эту фигуру (крестик), но покрупнее (допустим размером 5*5), то все нормально перерисовывается (а может это просто менее заметно, хотя даже в этом увеличенном варианте гориз-ая палка выглядит-рисуется длиннее вертикальной при их одинаковых размерах и размерах сцены 100*100)...может размеры пикселей надо задавать или что-то еще в этом духе? или в моем коде что-то не так....не понимаю я в чем тут может быть дело в принципе...может как по-другому анимацию легче сделать (в смысле двигать крестик не относительно его центра, а отн-но начала координат и т.п.)?
PM MAIL   Вверх
gordmiand
Дата 17.8.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



 smile : блин, ну что за мистика такая с перерисовкой мелкого примитива? неужели никто не сталкивался? тогда подскажите свой способ smile  нарисовать (а главное анимировать) мелкий примитив аля крестик или квадрат...мой способ (см. в начале темы) не хочет корректно перерисовывать примтив (он искажается)...
PM MAIL   Вверх
gordmiand
Дата 18.8.2010, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



допустим квадрат (это один из примтивов, который мне надо анимировать) я могу нарисовать как точку большого размера - такой квадрат нормально перерисовывается, так как он является "единым-неделимым" примитивом, а другие нужные мне (крестик, снежинка, ромб и др..) граф. объекты можно получить только из примитивов - прямых,ломаных,многоугольников и т.п. - вот тут-то и начинаются непонятки... smile   по-мо-ги-те....
PM MAIL   Вверх
Alexeis
Дата 19.8.2010, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



gordmiand, покажите скрин. Кроме того выложите экзешник. Попробуем на других компах, сравним у кого что получиться.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
gordmiand
Дата 19.8.2010, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



Alexeis: выкладываю экзешник (непонятно зачем скрин тогда нужен) - смотрите внимательно, а то скажите, что все окей...
в экзешнике фигуры выводятся след. образом:
в таймере:
Код

    ...dx+=0.25;
    ...dy+=0.25;
    ...updateGL();


Код

void GL_klass::initializeGL()
{
    dx=0, dy=0;
    qglClearColor(Qt::black);
    X = 25, Y = 25;
}

void GL_klass::resizeGL(int width, int height)
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0,0,(GLint) width, (GLint) height);
    glOrtho(0, 100, 100,  0,-100,100);
     glMatrixMode(GL_MODELVIEW);
}

////////////////////////////////////////////////////////////

 glPushMatrix();
     glTranslatef(dx,dy,0);
           glBegin (GL_LINES);
               glVertex2f (X-0.5, Y);
               glVertex2f (X+0.5, Y);
               glVertex2f (X, Y-0.5);
               glVertex2f (X, Y+0.5);
           glEnd();
   glPopMatrix();


   glPushMatrix();
      glTranslatef(10,10,0);
        glTranslatef(dx,dy,0);
   glBegin (GL_QUADS);
       glVertex2f (X, Y);
       glVertex2f (X, Y-0.6);
       glVertex2f (X+0.6, Y-0.6);
       glVertex2f (X+0.6, Y);
   glEnd();
   glPopMatrix();
 

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  Dimka.rar 208,97 Kb
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.2061 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.