openGL如何在改变窗口大小时,使自己的图形不被拉伸
2024-10-03 16:35:53
这里要注意两个概念:视口和视景体,当视口的纵横比和视景体的纵横比相同的时候,改变窗口大小,图像才不会变形;
视景体是指成像景物所在空间的集合。它是一个空间集合体。
单个的视景体,比如一个球体,若要完全显示,其视景体应该是该球体的最小外接立方体;若要只显示上半部分,则取上半球,其视景体是上半球的最小外接立方体。对于半球而言,上半球是视景体,那么其只有上半球有显示权限,下半球没有,所以就算是将该球体位置拉远,也只能看到上半球。
若视景体仅仅为上半球,那么默认情况下,上半球所映射的画布刚好充满摄像机。将摄像机下移,则摄像机画面中显示的是上半球切面的水平线,水平线以下是黑色背景色。即使此时从理论上来说摄像机对着下半球,但由于视景体仅为上半球,所以下半球是没有显示权限的,是不会被显示的。
对OpenGL而言,视景体就意味着可显示空间,在该空间内的一切物体都可以被显示,都可以被看到,该空间外的一切物体都不能被看到。相机若要看到该空间中的物体,则相机本身就必须处于该视景体空间中。若相机在视景体空间外,哪怕该视景体就在相机正对的面前,相机依然无法看到
例如:
控制视口大小为:glViewprot(0,0,400,200);则其纵横比为2
那么控制视景体的参数为:gluPerspective(fovy,2,near,far);可以了
添加代码如下:
void changeSize(GLsizei w, GLsizei h)
{
if (h == )
h = ;
glViewport(, , w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); if (w <= h)
{
glOrtho(0.0f, 300.0f, 0.0f, 300.0f * h / w, 1.0f, -1.0f);
}
else
{
glOrtho(0.0f, 300.0f * w / h, 0.0f, 300.0f, 1.0f, -1.0f);
} glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
注意:绘制图形时需要使用像素坐标系,左下角为原点。例如:glRectf(100.0f, 100.0f, 200.0f, 200.0f); 而不是glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
最新文章
- SOUI与WTL
- Effective java读书笔记
- MySQL update时使用联表,聚合
- Orchard中的命令行工具
- 学DIV+CSS技术,如何入门?(2)
- (旧)子数涵数&#183;PS——冷色调与LOMO
- SQLSERVER 16进制与10进制转换
- Java把内存划分为4个部分 1. 代码区 1、栈区 3、堆区 4、静态区域
- python中的 zip函数详解
- javascript中===与==
- lua字符匹配
- ios随机数
- 升级node与npm
- eclipse mars2在高分辨率下(macpro)图标极小的问题
- 使用synchronized的几种场景
- 给普通用户添加root权限
- RSA公钥文件解密密文的原理分析
- Nodejs----注册登录
- php获取指定文件夹中文件名称
- [UE4]蓝图重构
热门文章
- 学习wavenet_vocoder之预处理、训练
- Gradle 学习笔记
- 关于 Visual stdio 编译报错:error MSB6006: “CL.exe”已退出
- 架构-数据库访问-SQL语言进行连接数据库服务器:SQL语言进行连接数据库服务器
- java将url里面的中文改成ASCII字符集 和 SCII字符集 改成 中文
- 类BigInteger
- Myeclipse 快捷键大全(绝对全)
- Maven构建Struts2框架的注意事项
- 浏览器输入url按回车背后经历了哪些?
- HDU 4014 Jimmy’s travel plan(图计数)