OpenGL基础知识(四)
今天将继续修改OpenGL基础知识(三)中的例子,并进行了一些简单的动画绘制。在编写代码之前先介绍一下函数glutTimerFunc(unsigned int msecs,void (*func) (int value),int value); 这个函数是GLUT库中的函数,主要功能是再等待msecs秒之后,执行func函数,并且可以通过value向这个函数传递参数。
程序代码如下:
#include <GL/glut.h>
//方块初始化
GLfloat x1 = 0.0f;
GLfloat y1 = 0.0f;
GLfloat rsize = 25;
//x轴方向上移动的距离
GLfloat xstep = 1.0f;
//y轴方向上移动的距离
GLfloat ystep = 1.0f;
//窗口宽高变化
GLfloat windowWidth;
GLfloat windowHeight;
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT); //清除颜色
glColor3f(1.0f,0.0f,0.0f); //设置颜色为红色
glRectf(x1,y1,x1+rsize,y1-rsize); //绘制边长为50的矩形
glutSwapBuffers(); //刷新
}
void TimerFunction(int value)
{
if(x1 > windowWidth-rsize || x1 < -windowWidth)
xstep = -xstep;
if(y1 > windowHeight || y1 < windowHeight+rsize)
ystep = -ystep;
x1 += xstep;
y1 += ystep;
if(x1 > (windowWidth-rsize+xstep))
x1 = windowWidth-rsize-1;
else if(x1 < -(windowWidth+xstep))
x1 = -windowWidth - 1;
if(y1 > (windowHeight + ystep))
y1 = windowHeight-1;
else if(y1 < -(windowHeight-rsize+ystep))
y1 = -windowHeight+rsize-1;
glutPostRedisplay();
glutTimerFunc(33,TimerFunction, 1);
}
//当窗口大小变化时调用
void ChangeSize(GLsizei w,GLsizei h)
{
GLfloat aspectRatio;
if(0 == h)
h = 1;
//设置视口大小
glViewport(0,0,w,h);
//重置坐标系
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//建立裁剪区
aspectRatio = (GLfloat)w / (GLfloat)h;
if(w <= h)
glOrtho(-100.0,100.0,-100.0/aspectRatio,100/aspectRatio,1.0,-1.0);
else
glOrtho(-100.0*aspectRatio,100.0*aspectRatio,-100.0,100.0,1.0,-1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//设置渲染
void SetupRC(void)
{
glClearColor(0.0f,0.0f,1.0f,1.0f);
}
int main(int argc,char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("OpenGL Sample");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
glutTimerFunc(33,TimerFunction,1);
SetupRC();
glutMainLoop();
return 0;
}
以下是截图:
以上程序展示的是一个运动的正方形。
......
OpenGL基础知识(四)相关推荐
- OpenGL基础知识介绍和简单使用
OpenGL基础知识介绍 OpenGL简介 OpenGL 专业词解析 1.OpenGL上下文[context] 2.渲染 3.顶点数组和顶点缓冲区 4.着色器程序Shader 5.顶点着色器(Vert ...
- (七)JS基础知识四(搞定异步)【三座大山之三,必考!!!】
JS基础知识四(异步) 提问 单线程 应用场景 callback hell和promise 提问 同步和异步的区别是什么 手写用Promise加载一张图片 前端使用的异步的场景有哪些 单线程 JS是单 ...
- 跳槽者、应届生必看JAVA面试题系列 - JAVA基础知识(四)
一: 前言 莫等闲,白了少年头,空悲切. 二: 面试挑战 在文章开始前,首先安利下"面试挑战": 凡是满足下面的挑战条件的,如果一个月内没有拿到一个Offer的,免费提供简历封 ...
- C# 基础知识 (四).C#简介及托管代码
暑假转瞬即逝,从10天的支教生活到1周的江浙沪旅游,在这个漫长的暑假中我经历了很多东西,也学到了很多东西,也认识到了很多不足之处!闲暇之余我准备重新进一步巩固C#相关知识,包括C#入门 ...
- post获取重定向的链接 python_【转载】python面试基础知识(四) 网络部分
最近,小编在整理python面试基础知识,看了很多博客.文章和咨询了一些大厂公司大牛.了解到,在python面试的时候,不仅要求你有项目经验,还要考试代码呢!今天,小编和大家分享一下python面试基 ...
- Android OpenGL基础(四、图片后处理)
一.后处理 在Android OpenGL基础(三.绘制Bitmap纹理)一文中,我们简单介绍了如何把一张图片绘制到四边形上.现在我们可以在绘制原始图片的基础上再实现一些后处理的功能,例如灰度.反 ...
- Java基础知识(四) 基本类型与运算
Java基础知识 基本类型与运算 1. Java提供了哪些基本数据类型 2. 什么是不可变类 3. 值传递与引用传递的区别 4. Math类中的round.ceil和floor方法的功能各是什么 5. ...
- OpenGL基础知识
基本概念 透视(Perspective) 变换(Transformation) 投影矩阵(Projection Matrix):用于将3D坐标转换为2D屏幕坐标 光栅化(Rasterization): ...
- Android学习之基础知识四-Activity活动7讲(活动的启动模式)
在实际的项目开发中,我们需要根据特定的需求为每个活动指定恰当的启动模式.Activity的启动模式一共有4种:standard.singleTop.singleTask.singleInstance. ...
最新文章
- win7关闭开机启动项_电脑开机全是各种广告?来看看我怎么解决的吧
- oracle怎么导出筛选后的数据,ORACLE,筛选单字段不重复的记录,保留其他字段....
- 【BZOJ4821】【SDOI2017】相关分析 [线段树]
- python 模糊匹配_很冷门,但非常实用的 Python 库
- C#如何反射出委托的签名,如何使用反射调用委托
- thinkphp3.2 代码生成并点击验证码
- “中国式”盗版该何去何从?
- 编写java判断闰年_编写java程序判断闰年。
- 对AIOps架构框架比较
- 老蒋征婚启示啊啊啊啊啊啊
- jpadao层继承什么_实木复合地板特点是什么
- OpenCV精进之路(十五):特征检测和特征匹配方法汇总
- Linux内存管理--基本概念【转】
- SQL中char、varchar、nvarchar的区别
- rdlc报表 矩形高固定_什么是 BI?和报表有什么关系?有了 BI 还要做报表吗?
- 简易支付系统的架构设计
- Performance Test Framework (PTF)是压力测试框架(轩)
- lca rmq 算法资料
- 【洛谷 P3191】 [HNOI2007]紧急疏散EVACUATE(二分答案,最大流)
- 無間道III 終極無間