OPENGL如何在改变窗口大小时,使自己的图形不被拉伸保持自己的纵横比,把原理也解释下,不要只给代码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OPENGL如何在改变窗口大小时,使自己的图形不被拉伸保持自己的纵横比,把原理也解释下,不要只给代码相关的知识,希望对你有一定的参考价值。
OPENGL如何在改变窗口大小时,使自己的图形不被拉伸保持自己的纵横比,把原理也解释下,不要只给代码 谢谢
请务必详细解释下原理,我想知道计算机后台如何执行这一动作的,谢谢
例如:
控制视口大小为:glViewprot(0,0,400,200);则其纵横比为2
那么控制视景体的参数为:gluPerspective(fovy,2,near,far);可以了
控制视景体还有其他函数,原理是一样的
opengl编程指南有详细解释本回答被提问者和网友采纳
调整窗口大小时,如何使 SDL 窗口中的 OpenGL 视口保持静止?
【中文标题】调整窗口大小时,如何使 SDL 窗口中的 OpenGL 视口保持静止?【英文标题】:How to keep the OpenGL viewport in an SDL window stationary when a window is resized? 【发布时间】:2011-06-24 22:30:28 【问题描述】:我有一个包含 OpenGL 视口的 SDL 窗口。当用户通过拖动窗口边缘来调整窗口大小时,我希望 (1) 扩大视口以填充窗口,以及 (2) 让视口的内容保持静止。
例如:
------------------------
| | |
| <------ | |
| | X |
| <------ | |
| | |
------------------------
如果窗口的左边缘被进一步向左拖动,则 OpenGL 视口中的对象 X 应该保持静止。
我发现我在 SDL_VIDEORESIZE 事件上调用的代码不仅没有这样做,而且还会导致一些可怕的闪烁:
SDL_FreeSurface(window);
window = SDL_SetVideoMode(_w, _h, 32, SDL_OPENGL | SDL_RESIZABLE);
glViewport(0, 0, _w, _h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
const double w_2 = _w/2.0;
const double h_2 = _h/2.0;
gluOrtho2D(-w_2, w_2, -h_2, h_2);
// adjust model matrix
const double s_cosT = _scale*cos(_theta);
const double s_sinT = _scale*sin(_theta);
model[ 0] = s_cosT;
model[ 1] = s_sinT;
model[ 4] = -s_sinT;
model[ 5] = s_cosT;
model[12] = s_cosT*_x - s_sinT*_y;
model[13] = s_sinT*_x + s_cosT*_y;
glMatrixMode(GL_MODELVIEW);
glLoadMatrixd(model);
调整窗口大小时,这段代码的作用似乎是将旧视口中心的内容转换为新视口的中心。当与 GLUT 而不是 SDL 一起使用时,相同的代码的行为与我预期的一样——使用 GLUT,通过拖动边缘来调整窗口大小不会导致视口的内容重新居中。
造成这种差异的原因是什么?我该如何解决?
【问题讨论】:
您没有显示其余代码。具体来说,您没有展示在窗口大小改变时如何更新视口/投影矩阵。 添加代码更新模型矩阵。 【参考方案1】:这样做的唯一方法是让视图矩阵也随窗口移动。这意味着除了在调整大小时更改变换矩阵之外,还必须在单击并拖动窗口时对其进行调整。为了演示移动窗口和重复调整大小的等效性,考虑一下如果你像这样进行一堆增量调整会发生什么:
|---------------| 1. Starting window
|-------| 2. Resize left edge
|---------------| 3. Resize right edge
因此,要获得所需的行为,您应该将 gluOrtho2D 矩阵设置为以下值,每次您的窗口移动/调整大小时(或者在您绘制所有内容的帧开始时):
int wind_x, wind_y;
SDL_GetWindowPosition(window, &wind_x, &wind_y);
gluOrtho2D(wind_x, wind_x + w, wind_y, wind_y + h);
【讨论】:
好点。大多数拖动右边缘的解决方案在拖动左边缘时可能会严重损坏。这应该适用于两者。SDL_GetWindowPosition
不存在,据我所知。
您使用的是哪个版本?它在最新版本中:wiki.libsdl.org/moin.cgi/…
啊。然后,您将无法使用本机调用来获取窗口坐标。或者,您也可以只升级您的 libsdl 版本...以上是关于OPENGL如何在改变窗口大小时,使自己的图形不被拉伸保持自己的纵横比,把原理也解释下,不要只给代码的主要内容,如果未能解决你的问题,请参考以下文章
如何使 OpenGL 视口具有渲染到其中的 QML 项目的确切大小和位置?