Кажется, это довольно распространенный вопрос, но я не могу найти человека с такими же обстоятельствами.Наиболее близким кажется: 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 для обработки масштабов, но в итоге столкнулся с другими проблемами, поэтому вернулся к этому.Кто-нибудь может предложить, как я справляюсь с этими событиями перетаскивания?