OpenGL 2d масштабирование (используя масштаб и перевод вместо glOrtho) - PullRequest
3 голосов
/ 02 мая 2011

Кажется, это довольно распространенный вопрос, но я не могу найти человека с такими же обстоятельствами.Наиболее близким кажется: OpenGL: масштаб, затем перевод?и как? .

Проблема, с которой я действительно хотел бы помочь, состоит в том, чтобы перемещаться, когда масштабируется (и выходит) из 2-мерной сцены с использованием OpenGl.Код для уменьшения масштаба довольно прост:

void RefMapGLScene::zoomOut(){
  currentScale = currentScale-zoomFactor;
  double xAdjust = (((get_width())*zoomFactor/2));
  double yAdjust = ((get_height()*zoomFactor/2));
  zoomTranslateX -= xAdjust;
  zoomTranslateY -= yAdjust;
}

Код для увеличения практически одинаков (добавьте zoomFactor к currentScale и увеличьте zoomTranslateX и Y).

Код дляПройти все также просто:

glPushMatrix();
glTranslated(-zoomTranslateX, -zoomTranslateY, 0);

glScaled(currentScale, currentScale, 1);
glTranslated(totalMovedX, totalMovedY, 0);

graph->draw();

glPopMatrix();

По сути, zoomTranslate хранит настройки, необходимые для небольшого смещения экрана к середине при масштабировании.Я не делаю ничего хорошего, как перемещение туда, куда указывает мышь, я просто перемещаюсь в середину (то есть вправо и вверх / вниз в зависимости от вашей системы координат).TotalMovedX и Y сохраняют движение мыши следующим образом:

if (parent->rightButtonDown){
  totalMovedX += (-(mousex-curx))/currentScale;
  totalMovedY += (-(mousey-cury))/currentScale;
}

Перетаскивание без увеличения или увеличения отлично работает.Масштабирование работает отлично.Перетаскивание при увеличении / уменьшении не работает отлично :) По сути, при увеличении холст движется намного медленнее, чем мышь.Обратное для уменьшения масштаба.

Я перепробовал все, что мог придумать, и много читал на этом сайте о людях с похожими проблемами.Я также пытался переопределить свой код, используя glOrtho для обработки масштабов, но в итоге столкнулся с другими проблемами, поэтому вернулся к этому.Кто-нибудь может предложить, как я справляюсь с этими событиями перетаскивания?

1 Ответ

3 голосов
/ 02 мая 2011

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

Измените свой код следующим образом:

glPushMatrix();
glTranslated(-zoomTranslateX, -zoomTranslateY, 0);

glTranslated(totalMovedX, totalMovedY, 0);
glScaled(currentScale, currentScale, 1);

graph->draw();

glPopMatrix();

Также после изменения этого порядка вам не нужно масштабировать движения мыши, поэтому вы можете пропустить это деление по currentScale

if (parent->rightButtonDown){
  totalMovedX += (-(mousex-curx));
  totalMovedY += (-(mousey-cury));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...