C++ OpenGl二维缩放(使用缩放和平移而不是glOrtho)

C++ OpenGl二维缩放(使用缩放和平移而不是glOrtho),c++,opengl,zooming,C++,Opengl,Zooming,这似乎是一个很常见的问题,但我找不到一个和我处境相同的人。最接近的似乎是: 我真的希望得到一些帮助的问题是,在使用OpenGl放大(或缩小)2d场景的同时移动。缩小的代码非常简单: void RefMapGLScene::zoomOut(){ currentScale = currentScale-zoomFactor; double xAdjust = (((get_width())*zoomFactor/2)); double yAdjust = ((get_height()*z

这似乎是一个很常见的问题,但我找不到一个和我处境相同的人。最接近的似乎是:

我真的希望得到一些帮助的问题是,在使用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重新实现我的代码来处理缩放,但最终遇到了其他问题,所以又回到了这种方式。有谁能建议我如何处理这些拖拉事件吗

操作顺序很重要。对矩阵的操作按与矩阵相乘的相反顺序应用。在本例中,在缩放之前应用画布移动,因此也会缩放鼠标拖动

将代码更改为:

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

我发现了问题,你的代码和我的代码都很好。我只是把totalMovedX和totalMovedY保存为int,这意味着小数被截断了。真是一个基本的错误。谢谢你的回答。