使用鼠标选择缩放OpenGL场景

时间:2014-03-18 10:52:41

标签: c++ qt opengl

我正在尝试使用鼠标根据屏幕上的选定区域实现opengl场景的缩放。

我的目标是使用户能够使用鼠标缩放2D opengl世界的任何一部分。 他也应该能够多次放大。

努力实现这一目标。

绘图用以下内容打孔:

    glViewport(fullscreen)
    gluOrtho2D()
    ...drawing...

尝试改变gluOrtho2D中的世界坐标,但似乎不可能多次放大......

所以我试图为glScalef和glTranslatef ...

计算数字

也许any1尝试做过这样的事情,可以提供一些建议吗?

2 个答案:

答案 0 :(得分:0)

如何使用glLoadIdentity将矩阵重置为合理的值。每当你调用一个OpenGL的矩阵操作函数时,它就会在当前活动矩阵堆栈的顶部进行就地乘法。

您的典型显示功能应如下所示(伪代码)

display:
    glClear(…)

    # just to illustrate that you can mix multiple projection
    # setups throughout rendering a single frame
    foreach l in layers:
        glViewport(l→viewport)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        l→setup_projection() # for example glOrtho

        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        l→setup_view() # for example gluLookAt

        foreach m in models:
            glMatrixMode(GL_MODELVIEW)
            # make a copy of the current modelview so that we can
            # restore it after the model has been drawn, by pushing onto the stack
            glPushMatrix()

            setup_model_transformation()
            draw_model()

            glMatrixMode(GL_MODELVIEW)
            # restore to the previous matrix by poping it from the stack
            glPopMatrix()

请注意,这使用了已弃用的(即旧的和从现代OpenGL中删除的)矩阵堆栈。现代OpenGL程序可以自己进行矩阵数学运算,只需将相关的有效矩阵加载到所绘制的每个模型的所谓着色器制服中。

答案 1 :(得分:0)

取得了一些进展......

    displayedMapCoords[0] = mapCenterPoint[0] - sceneSize * aspectRatio;
    displayedMapCoords[1] = mapCenterPoint[0] + sceneSize * aspectRatio;
    displayedMapCoords[2] = mapCenterPoint[1] - sceneSize;
    displayedMapCoords[3] = mapCenterPoint[1] + sceneSize;
    ...
    gluOrtho2D( displayedMapCoords[0], displayedMapCoords[1],
                displayedMapCoords[2], displayedMapCoords[3] ); 
    glScalef(mapScale, mapScale, 0);
    ...

当用鼠标选择矩形时,我计算比例因子和新的中心点:

    mapScale = (float) CfgManager::Instance()->getScreenHeight() / selectedAreaSize;
    mapCenterPoint[0] = -(float) mapScale * (CfgManager::Instance()->getScreenWidth()/2 - zoomArea[0] - selectedAreaSize / 2) * sceneSize / CfgManager::Instance()->getScreenHeight();
    mapCenterPoint[1] = (float) mapScale * (CfgManager::Instance()->getScreenHeight()/2 - zoomArea[1] - selectedAreaSize / 2) * sceneSize / CfgManager::Instance()->getScreenHeight();

这段代码工作得很好......但只有一次。在我放大之后,我希望能够选择另一个区域。 计算比例因子不是问题,但计算新的中心点位置并不容易:/