gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:37:00 26 4
gpt4 key购买 nike

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

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

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

这是我的代码:

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 先生的建议,我尝试将单精度切换为 double 。缩放问题沿垂直轴有所改善,但无论何时我向任一方向拖动水平轴,形状仍会按明显的比例缩放。它始终保持相同的形状,但目视检查告诉我,无论执行哪个 glOrtho,窗口为 150x300 时的形状大小与窗口为 600x800 时的形状大小不同。

最佳答案

我知道了。这是我更改代码的方式:

//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);
}

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

关于c++ - 使用 freeglut 保持纵横比和比例独立于窗口大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22735111/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com