使用 freeglut 保持纵横比和比例独立于窗口大小

Posted

技术标签:

【中文标题】使用 freeglut 保持纵横比和比例独立于窗口大小【英文标题】:Maintaining Aspect Ratio and Scale Independent of Window Size with freeglut 【发布时间】:2014-03-29 18:30:36 【问题描述】:

我一直想用 freeglut 试验平台物理,但在我允许自己开始之前,我有一个老问题要解决。

你看,我想编写一个重塑处理程序,它不仅可以保持比例并消除视图的任何失真,而且还允许所有屏幕上的形状保持它们的大小,即使窗口太小而无法容纳它们(即让它们被剪掉)。

我几乎解决了所有三个部分,但是当我缩放窗口时,我在其上绘制的圆圈只是略微缩放。否则,我得到了剪辑,并且我已经消除了失真。 更新:我想要实现的是一个保持比例和纵横比独立于窗口大小的程序。

这是我的代码:

void reshape(int nwidth,int nheight)

    glViewport(0,0,nwidth,nheight);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    //here begins the code
    double bound = 1.5;
    double aspect = double(nwidth)/nheight;

    //so far, I get the best results by normalizing the dimensions
    double norm = sqrt(bound*bound+aspect*aspect);
    double invnorm = sqrt(bound*bound+(1/aspect)*(1/aspect));

    if(nwidth <= nheight)
        glOrtho(-bound/invnorm,bound/invnorm,-bound/aspect/invnorm,bound/aspect/invnorm,-1,1);
    else
        glOrtho(-bound*aspect/norm,bound*aspect/norm,-bound/norm,bound/norm,-1,1);

    //without setting the modelview matrix to the identity form,
    //the circle becomes an oval, and does not clip when nheight > nwidth
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

更新:根据 Coleman 先生的建议,我尝试将单精度换成双精度。沿垂直轴的缩放问题有所改善,但每当我在任一方向拖动水平轴时,形状仍会按明显的量缩放。它始终是相同的形状,但目视检查告诉我,窗口为 150x300 时的形状与窗口为 600x800 时的大小不同,无论执行的是哪个 glOrtho。

【问题讨论】:

glOrtho (...) 采用GLdouble 参数,顺便说一句。您是否考虑过在计算中使用双精度而不是单精度? 【参考方案1】:

我明白了。以下是我更改代码的方式:

//at the top of the source file, in global scope:
int init_width;//the initial width
int init_height;//the initial height
void reshape(int new_width, int new_height)

    //moved the glViewport call further down (it was part of an earlier idea that didn't work out)
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();//these two lines are unchanged

    double bound = 1.0; //I reduced the edge distance to make the shape larger in the window
    double scaleX = double(new_width)/init_width;
    double scaleY = double(new_height)/init_height;

    glOrtho( -bound*scaleX/2, bound*scaleX/2, //these are halved in order to un-squash the shape
        -bound*scaleY, bound*scaleY, -1,1 );

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glViewport(0,0,new_width,new_height);

这就是我的代码现在的样子。它保持我在屏幕上的比例和形状,并允许它在窗口太小而无法包含整个形状时离开屏幕。

【讨论】:

以上是关于使用 freeglut 保持纵横比和比例独立于窗口大小的主要内容,如果未能解决你的问题,请参考以下文章

固定缩略图比例大小和保持纵横比?

根据高度保持div的纵横比[重复]

容器中显示的图像 - 如何按比例缩小并保持纵横比

如何在屏幕上拉伸三个图像以保持纵横比?

保持div的纵横比但在CSS中填充屏幕宽度和高度?

响应式图像全屏和居中 - 保持纵横比,不超过窗口