LINUX.ORG.RU

OpenGL Двигать viewport в границах «области рисования» как ?


0

2

Приветствую, немного загрузился с одним вопросом:

Определил себе некую область, на ней нарисовал белый прямоугольник(это типа полотно для будущего рисования). Сдвинул систему координат в нижний левый угол. Добавил масштабирование. Соответственно, теперь при изменении масштаба, когда мой прямоугольник не влазит в экран, мне надо добавить перемещение окна, т.е viewport-а в границах моей области(чтобы он не выходил за её границы) Вроде всё просто, используем glTranslatef(...) но не понимаю, как это правильно сделать, что-то не идёт это у меня :( Подскажите, может примерами покидаетесь. Ну или хотя бы на пальцах объясните :)


mPaperSize = new FXSize(8268, 11693);  // 210x297 mm
mAreaSize = new FXSize(mPaperSize->w*2, mPaperSize->h*2);

void MainWindow::render()
{
  mGLCanvas->makeCurrent();
    glViewport(0, 0, mGLCanvas->getWidth(), mGLCanvas->getHeight());
    glClearColor(0.85, 0.85, 0.85, 1.0);
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    
  // mAreaSize - моя область для рисования, на котором рисуется полотно, 
  // чтобы оставить некоторый отступ от полотна до края области
  glOrtho(0,  mAreaSize->w, 0, mAreaSize->h, -100, 100);
  glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

  glScalef(mScaleFactor, mScaleFactor, mScaleFactor);
    
  // начало положения листа
  int x = 50;
  int origin_x = mAreaSize->w/2 - mPaperSize->w/2; 
  int origin_y = mAreaSize->h/2 - mPaperSize->h/2;

  FXPoint points[4] = {  FXPoint(origin_x, origin_y), 
              FXPoint(origin_x + mPaperSize->w, origin_y), 
              FXPoint(origin_x + mPaperSize->w, origin_y + mPaperSize->h), 
              FXPoint(origin_x, origin_y + mPaperSize->h) };
  
  // чтобы было видно начало системы координат
  glBegin(GL_LINES);
    glVertex2i(1, 1);
    glVertex2i(1, 250);
    glVertex2i(1, 1);
    glVertex2i(100, 1);
  glEnd();

  glColor3f(1.0, 1.0, 1.0);  //paper blank
  glBegin(GL_QUADS);
    glVertex2i(points[0].x-x, points[0].y+x*2);
    glVertex2i(points[1].x-x, points[1].y+x*2);
    glVertex2i(points[2].x-x, points[2].y+x*2);
    glVertex2i(points[3].x-x, points[3].y+x*2);
  glEnd();

  
  glColor3f(0.0, 0.0, 0.0);  // edging 
  glBegin(GL_LINE_LOOP);
    glVertex2i(points[0].x-x, points[0].y+x*2);
    glVertex2i(points[1].x-x, points[1].y+x*2);
    glVertex2i(points[2].x-x, points[2].y+x*2);
    glVertex2i(points[3].x-x, points[3].y+x*2);
  glEnd();
  
    mGLCanvas->swapBuffers();
    mGLCanvas->makeNonCurrent();
}



// при масштабировании просто меняю коэффициент и перерисовываю

long MainWindow::onMouseWheel(FXObject*, FXSelector, void* ptr)
{
  FXEvent *ev = (FXEvent*)ptr;

  if(ev->code > 0)
    mScaleFactor += 0.1;
  else
    mScaleFactor -= 0.1;

  updateStatusBar();

  render();
  return 1;
}

Так же есть ещё один вопрос, как устанавливать коэффициент масштабирования? Т.е его лучше брать просто каким-то фиксированным, например 10, 100, 1000... или как-то высчитывать в соответствии с масштабом?

★★★★★
Ответ на: комментарий от ozkriff

Спасибо за ссылку. В принципе я тоже пробовал так сделать, т.е перед glScalef() добавлял вызов glTranslatef(), значения аргументов которой менял в обработчике нажатия кнопок. Вроде как перемещалось, но вместе с тем, двигалось и начало системы координат, т.е нижний левый угол. Так и должно быть? Что касается устаревшей версии, то думал, хотя бы на старой сначала освоиться, а там уже можно и на новые версии со временем перейти )

xterro ★★★★★
() автор топика
Ответ на: комментарий от xterro

почитай про стэк матриц,и про модельно-видовые трансформации.

jo_b1ack ★★★★★
()
Ответ на: комментарий от xterro

то думал, хотя бы на старой сначала освоиться, а там уже можно и на новые версии со временем перейти

Это не будет переход - это будет замена, все очень сильно отличается, можешь учить сразу новое.

abs ★★★
()
Ответ на: комментарий от abs

Это не будет переход - это будет замена, все очень сильно отличается, можешь учить сразу новое.

Я бы сказал так - знать историю будет не лишним, но ездить на паравозе во времена летающих тарелок несколько недальновидно.

andreyu ★★★★★
()
Ответ на: комментарий от abs

Но все эти матрицы и операции с ними же остались, правильно? Наверно еще и glScalef, glTranslatef остались ) Пока надо понять, как сделать так, чтобы вьюпорт можно было перемещать по сцене.

xterro ★★★★★
() автор топика
Ответ на: комментарий от xterro

... Так и должно быть?

Да. Присоединяюсь к рекомендации «почитай про стэк матриц, и про модельно-видовые трансформации» - в любом случае будет полезно, независимо от версии OpenGL, уроков очень много и они легко гуглятся.

Но все эти матрицы и операции с ними же остались, правильно? Наверно еще и glScalef, glTranslatef остались ) ...

Это все, как и весь фиксированный конвеер, убрали в третей версии. Я тоже считаю, что проще сразу учить OpenGL 3 и старше.

ozkriff
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.