【问题标题】:OpenGl 2d zooming (using scale and translate instead of glOrtho)OpenGL 2d 缩放(使用缩放和平移而不是 glOrtho)
【发布时间】:2011-05-02 06:49:20
【问题描述】:

这似乎是一个很常见的问题,但我找不到与我相同情况的人。最接近的似乎是: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 重新实现我的代码来处理缩放,但最终遇到了其他问题,所以回到了这种方式。有人可以建议我如何处理这些拖动事件吗?

【问题讨论】:

    标签: c++ opengl zooming


    【解决方案1】:

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

    将您的代码更改为:

    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,这意味着小数点会被截断。真的很初级的错误。谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多