OpenGL之路(二)设置观测矩阵和避免图形拉伸变形

环境配置成功后,运行了示例代码,你一定发现随着窗口的拉伸变化,三角形变形了,下面就来解决这个问题

代码如下

#include <gl/glut.h>
#include <gl/GLU.h>
#include <gl/GL.h>
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glut32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glut.lib")

void renderScene(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glBegin(GL_TRIANGLES);
	glVertex3f(0.0, 0.0, 0.0);
	glVertex3f(0.5, 0.0, 0.0);
	glVertex3f(0.0, 0.5, 0.0);
	glEnd();
	glBegin(GL_QUADS);
	glVertex3f(1.0, 1.0, 0.0);
	glVertex3f(2.0, 1.0, 0.0);
	glVertex3f(2.0, 0.0, 0.0);
	glVertex3f(1.0, 0.0, 0.0);
	glEnd();
	glutSwapBuffers();
}
void changeSize(int w, int h) {

	// 防止除数即高度为0
	// (你可以设置窗口宽度为0).
	if (h == 0)
		h = 1;
	float ratio = 1.0* w / h;

	// 单位化投影矩阵。
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	// 设置视口大小为整个窗口大小
	glViewport(0, 0, w, h);

	// 设置正确的投影矩阵
	gluPerspective(45, ratio, 1, 1000);
	//下面是设置模型视图矩阵
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, -1.0, 0.0f, 1.0f, 0.0f);//设置观测点
}
int main(int argc, char * argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(320, 320);
	glutCreateWindow("Hello OpenGL");
	glutDisplayFunc(renderScene);
	glutIdleFunc(renderScene); //指定程序空闲时调用函数
	glutReshapeFunc(changeSize); //指定窗口形状变化时的回调函数
	glEnable(GL_DEPTH_TEST);
	glutMainLoop();
	return 0;
}
时间: 2024-10-13 11:53:19

OpenGL之路(二)设置观测矩阵和避免图形拉伸变形的相关文章

小菜学Chromium之OpenGL学习之二

在这个教程里,我们一起来玩第一个OpenGL程序.它将显示一个空的OpenGL窗口,可以在窗口和全屏模式下切换,按ESC退出.它是我们以后应用程序的框架. 在CodeBlock里创建一个新的GLUT Win32程序(不是console控制台程序)后,我们还需要链接OpenGL库文件. 代码的前4行包括了我们使用的每个库文件的头文件.如下所示: #include <windows.h> // Windows的头文件 #include <glew.h>       // 包含最新的gl

Android流媒体开发之路二:NDK开发Android端RTMP直播推流程序

NDK开发Android端RTMP直播推流程序 经过一番折腾,成功把RTMP直播推流代码,通过NDK交叉编译的方式,移植到了Android下,从而实现了Android端采集摄像头和麦克缝数据,然后进行h264视频编码和aac音频编码,并发送到RTMP服务器,从而实现Android摄像头直播.程序名为NdkRtmpEncoder,在这里把整个过程,和大体框架介绍一下,算是给需要的人引路. 开发思路 首先,为什么要用NDK来做,因为自己之前就已经实现过RTMP推流.RTMP播放.RTSP转码等等各种

我的编程之路(二十一) 规范

不知不觉一周就过去了,这周细想真的没有做成什么,因为几乎都是做了改,改了做··· 1.代码规范 以前自认为自己很注重代码规范,但是没有想到自己项目组的开发会将代码规范审查的那么严谨,这突然让我想到之前说到程序员都喜欢追求完美,都喜欢自己和自己的风格一致,否则就会觉得别扭,不过与此不同,这是团队开发,代码规范是为了统一风格,便于别人的阅读与后人的修改与维护,虽然因为这我前前后后改了三次dao层的代码,一是要用公司封装的借口,二是要把异常处理都放在这一层或者service层,三是要用公司自己写的工具

编程题之打印二维螺旋矩阵

当size=4时, 二维螺旋矩阵如下图所示: 规律总结 可以把这个二维矩阵看成一层套一层,如上图所示,1->4->7->10->12为第零层, 13->14->15->16为第一层,所以当size=4时,总共有两层.规律如下: 可分层数为:若size为偶数,层数=size/2, 若为奇数,则层数=(size+1)/2; 第n层一个方向上的数字的数量为:size-2*n; 这是因为第零层的一个方向上数字的数量就是size, 而第一层是size-2,...第n层就是s

Maven入门系列(二)--设置中央仓库的方法

原文地址:http://www.codeweblog.com/maven入门系列-二-设置中央仓库的方法/ Maven仓库放在我的文档里好吗?当然不好,重装一次电脑,意味着一切jar都要重新下载和发布. 下载的地址是中央仓库mvnrepository.com,当然,全球很多个仓库. 资源的坐标简称GVA 那么,现在如何修改maven的本地仓库路径呢? 关键在于maven文件夹的config下的settings.xml(E:\IDE\apache-maven-3.3.1\conf\settings

压缩感知中常用的观测矩阵

接上文:<压缩感知中常用的待还原信号种类>,http://blog.csdn.net/zhyoulun/article/details/25600311 在压缩感知中,观测矩阵就是指y=Ax中的A.A是一个n*m的矩阵,矩阵中的每一个元素独立同分布于一个特定的分布.分布的种类如下: 1.USE.一致球集合,Uniform spherical ensemble,首先计算出一个n*m的矩阵,矩阵中的每一个元素服从标准正态分布,然后对这个矩阵的每一列做归一化. 2.RSE.随机信号集合,Random

我的VSTO之路(二):VSTO程序基本知识

原文:我的VSTO之路(二):VSTO程序基本知识 开始之前,首先我介绍一下我的开发环境:VS2010 + Office 2010,是基于.Net framework 4.0和VSTO 4.0.以下的范例代码都基于这个,如果你使用的是VS2008,那么问题也不大,基本可以移植过去.需要注意的是.Net framework 4.0中增加了dynamic类型和可选参数,而这两点新的特性在VSTO 4.0中被广泛使用,新特性的详细内容我就不介绍了,(其实介绍的地方很多,Google一下就可以了),移植

我的编程之路(二十) 新的环境、新的开始

被其他项目组借用了三个星期,这周终于要给自己的项目组干活了,之前就听同事说过省厅,这次终于要去了,有点激动哈: 1.挤公交 星期二跟着同事一起去省厅,那个公交呀,真是挤呀,以前还庆幸自己上班不用挤公交呢,唉~~~看来这一个多月都要重复着早上7点20起床,7点50挤半个多小时公交的生活了~~~ 2.同事 还记得刚来公司的时候,强哥就跟我说,zqq(一个女生)就做的很好,对自己要求很高,一直在省厅那边,上次我们项目组聚会,第一次见到本人,也见到不少其他同事,那次还自己把自己灌醉了,幸亏宝强哥把我送了

java痛苦学习之路[二] ---JSONObject使用

一.Strut2必须引入的包 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: 1.commons-lang.jar 2.commons-beanutils.jar 3.commons-collections.jar 4.commons-logging.jar 5.ezmorph.jar 6.json-lib-2.2.2-jdk15.jar 当然除了这些包,strut2基础包也得引入 struts2-core-2.1.6.jar freemarker-2.