OpenGl 2d缩放(使用缩放和平移而不是glOrtho)

时间:2011-05-02 06:49:20

标签: c++ opengl zoom

这似乎是一个相当普遍的问题,但我找不到一个情况相同的人。最接近的似乎是:OpenGL: scale then translate? and how?

我真正喜欢的一个问题就是在使用OpenGl放大(和退出)2D场景时四处移动。缩小的代码非常简单:

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 个答案:

答案 0 :(得分:3)

操作顺序很重要。矩阵运算的应用顺序与矩阵相乘的顺序相反。在您的情况下,您在缩放之前应用画布移动,因此您的鼠标拖动也会缩放。

将您的代码更改为:

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));
}