这似乎是一个相当普遍的问题,但我找不到一个情况相同的人。最接近的似乎是: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重新实现我的代码来处理缩放,但最终还是遇到了其他问题,所以回过头来。有人可以建议我如何处理这些拖拽事件?
答案 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));
}