使用 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 保持纵横比和比例独立于窗口大小的主要内容,如果未能解决你的问题,请参考以下文章