Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: [РЕШЕНО] C++ и openGL. масштабирование.  (Прочитано 8055 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #15 : 26 Октября 2010, 22:22:14 »
Цитировать
Возможно, ... очень может быть с GLUT'ом что-нибудь напутали. Я его (GLUT) не использовал и мало чем смогу помочь....
Я сам его только пару раз из лубопытства использовал.

Я кажется не верно понял суть проблемы. Если я сейчас правильно тебя понимаю, то когда ты кликаешь левой кнопкой масштабирование анимируется, а когда правой нет. Но у тебя при этом есть только одно условие, в твоей функции fscale, анимировать если левая кнопка была нажата.

Тоесть твоя программа должна запускать анимацию по левому клику до тех пор пока параметры мастштабирования не примут предельные значения. Если в процессе анимации кликнуть правой мышкой, то анимация замирает до следующего клика мышкой. Тебе по идее в fscale нужно
#define STEP 0.1
#define MAX_SCALE 2.3
#define MIN_SCALE 0.1

...

void fscale()
{
    if (scale) {
        if(a>=MIN_SCALE && s<=MAX_SCALE) {
            a-=STEP;
            s+=STEP;
        }
        glutPostRedisplay ();
    } else {
        if(s>=MIN_SCALE && a<=MAX_SCALE) {
            a+=STEP;
            s-=STEP;
        }
    }
}
надеюсь на этот раз я правильно понял что ты хочешь.
« Последнее редактирование: 26 Октября 2010, 22:24:37 от VestniK »

Оффлайн losvik

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #16 : 26 Октября 2010, 22:39:31 »
Да в целом все верно. Только при нажатие ЛКМ должно запустить всю анимацию то есть  от if(a>=MIN_SCALE && s<=MAX_SCALE) до if(s>=MIN_SCALE && a<=MAX_SCALE) и нон стопом до ПКМ
Я вот это и пытался сделать, только почему то без define ) . Спасибо за код, Анимация проходит вся но не нон стопом.
Но направление я понял, спасибо.

Пользователь решил продолжить мысль 26 Октября 2010, 23:18:32:
Да в целом все верно. Только при нажатие ЛКМ должно запустить всю анимацию то есть  от if(a>=MIN_SCALE && s<=MAX_SCALE) до if(s>=MIN_SCALE && a<=MAX_SCALE) и нон стопом до ПКМ
Я вот это и пытался сделать, только почему то без define ) . Спасибо за код, Анимация проходит вся но не нон стопом.
Но направление я понял, спасибо.
вот как все на самом деле, после того как я протер очки).  Сейчас после добавления куска кода, при нажати ЛКМ запускается анимация.
и первое условие выполняется:
if(a>=MIN_SCALE && s<=MAX_SCALE) {
            a-=STEP;
            s+=STEP;
        }
        glutPostRedisplay ();
все что за else не выполняется, видимо условия необходимо поправить.
Еще раз о цели( т.к мб я не так что то сформулировал) ЛКМ должна запустить анимацию(до предельных значений) нон-стопом до нажатия ПКМ. ПКМ в свою очередь должен отсановить итерацию.
Если есть  какие то идеи, буду рад :)
« Последнее редактирование: 26 Октября 2010, 23:23:09 от dhuss »

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #17 : 27 Октября 2010, 01:46:34 »
Всё что за else не рисуется так как я забыл glutPostRedisplay (); туда вставить. В любом случае я тебя неправильно понял.

Если ты хочешь сделать циклическую анимацию, то можно сделать простое "отражение". Когда масштабный коэффициент становится больше максимального или меньше минимального значения меняем знак у шага изменения этого масштабного коэффициента:
#define MIN_SCALE 0.1
#define MAX_SCALE 2.3
#define STEP 0.1

double GLfloat stepA = STEP;
double GLfloat stepS=-STEP;

void fscale()
{
    if (!scale) return;
    if (a<MIN_SCALE || a>MAX_SCALE) stepA = -stepA;
    if (s<MIN_SCALE || s>MAX_SCALE) stepS = -stepS;
    a += stepA;
    s += stepS;
    glutPostRedisplay ();
}

Оффлайн losvik

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #18 : 27 Октября 2010, 02:51:34 »
Всё что за else не рисуется так как я забыл glutPostRedisplay (); туда вставить. В любом случае я тебя неправильно понял.

Если ты хочешь сделать циклическую анимацию, то можно сделать простое "отражение". Когда масштабный коэффициент становится больше максимального или меньше минимального значения меняем знак у шага изменения этого масштабного коэффициента:
#define MIN_SCALE 0.1
#define MAX_SCALE 2.3
#define STEP 0.1

double GLfloat stepA = STEP;
double GLfloat stepS=-STEP;

void fscale()
{
    if (!scale) return;
    if (a<MIN_SCALE || a>MAX_SCALE) stepA = -stepA;
    if (s<MIN_SCALE || s>MAX_SCALE) stepS = -stepS;
    a += stepA;
    s += stepS;
    glutPostRedisplay ();
}


Хм, как ловко) Благодарю, работает. только там GLdouble.  Спасибо, еще раз.

 

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