实验二:OpenGL的简单动画

这篇具有很好参考价值的文章主要介绍了实验二:OpenGL的简单动画。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验二:OpenGL的简单动画

一、实验目的

1.掌握OpenGL的闲置函数。
2.掌握OpenGL的时间函数。
3.掌握OpenGL的简单动画功能。
4.了解OpengGL裁剪窗口、视区、显示窗 口的概念和它们之间的关系。
5.进一步掌握OpenGL基本图元的绘制。

二、实验内容

1.闲置函数的使用与简单动画。
1)旋转的六边形如实验图2-1所示。
阅读6.3.3节中旋转的六边形样本程序,分 析程序的实现步骤。运行该程序,观察旋转动画效果。
思考:如果要调整旋转速度,旋转更快或更慢,应该如何修改程序?
修改旋转角增量,即通过更改myidle()闲置函数的属性值theta大小实现
2)线框六边形。
在display函数中,添加多边形模式设置语句观看效果。

glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);			//线框模式

实验二:OpenGL的简单动画

添加线宽语句观看效果。

glLineWidth(2.0);											//设置线宽

实验二:OpenGL的简单动画

重回多边形填充模式:

glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);			//填充模式

3)在图形中添加字符“Hello”,观察结果,然后将“Hello”字符改为自己名字的拼音或英文名字。
提示:在图形中添加如下代码。

glColor3f(1,0,0); 									//设置红色绘图颜色
glRasterPos2i(3,2); 								//定位当前光标,起始字符位置
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ‘H’);	//写字符"H"
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ‘e’)	;	//写字符"e"
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ‘l’)	;	//写字符"l"
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ‘l’)	;	//写字符"l"
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ‘o’);	//写字符"o"

实验二:OpenGL的简单动画

变色技术举例。
在程序头部设置全部变量:

int k=0;

在myidle函数中添加代码:

if (k==l){
glColor3f (1,0,0);
k=0;
}
else
{
glColor3f(1,1,0); k=l;
}

然后在绘制函数中屏蔽原来的绘制颜色, 运行查看效果。

观察到旋转的六边形图案颜色红黄闪烁

六边形静止,直线单独旋转。
修改前面的程序,使得六边形保持静止, 以六边形中心为起点画一条不同颜色的直线, 终点为六边形某一顶点,使得直线不停绕中心 点旋转。代码保存下来备用。
实验二:OpenGL的简单动画

void Display(void){
    glClear(GL_COLOR_BUFFER_BIT);                       //清屏
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);			//填充模式
    glColor3f(1.0, 1.0, 0);                             //设置黄色绘图颜色
    glBegin(GL_POLYGON);                                //开始绘制六边形 
        for (int i = 0; i < n; i++)
            glVertex2f( R * cos(theta + i * 2 * PI / n), R * sin(theta + i * 2 * PI / n));  //顶点坐标 
            glEnd();
    glBegin(GL_LINES);                                //开始绘制直线 
            glColor3f(1.0, 1.0, 1.0);
            glVertex2f(0.0, 0.0);                   //旋转点坐标 
            glVertex2f(R * cos(theta_line + 2 * PI / n), R * sin(theta_line + 2 * PI / n));  
            glEnd();
    glutSwapBuffers();              //双缓存的刷新模式
}

思考:如果需要直线保持与机器时钟的秒针节拍吻合,应该如何修改?
提示:可使用Sleep函数,如Sleep(1000)表示延时1秒,放在myidle函数中。

要直线保持与机器时钟的秒针节拍吻合,可在myidle函数中设置Sleep(1000)延时1秒,并设置theta += 6*PI/180,使得每秒转过6°,一分钟转一周。

  1. 时间函数的使用与简单动画。将以上程序中的闲置函数替换为时间函数。
    1 )主程序中:
glutldleFunc(myidle) ;	//注册闲置回调函数

改为:

glutTimerFunc(1000, mytime, 10) ; //1000 毫秒后调用时间函数 mytime

myidle。闲置回调函数改为时间函数mytime(t),在程序顶部函数声明语句也要相应更改:

void myidle();

改为:

void mytime(int t);

3)在时间函数mytime(t)最后再添加:

glutTimerFunc(1000, mytime, 10) ; //1000 毫秒后调用时间函数 mytime
  1. 简单时钟的设计。
    1)在程序头部定义系统时间变量、时分秒变量:
SYSTEMTIME timeNow; 
float hh,mm,ss;

2) 在程序头部定义7T常量:

#define PI 3.1415926

3) 在程序头部引入数学头文件、时间头文件:

#include"math.h"
#include"time.h"

4) 在初始化函数中获取系统时间。
在主程序中顶部声明初始化子函数:

void init ();

在main函数中添加子函数调用语句,可放在创建窗口之后:

init ();

在main函数后面添加初始化子函数,并在函数中添加获取系统时间语句:

void init ()
{	GetLocalTime(&timeNow); 	hh=timeNow.wHour; 	mm=timeNow.wMinute; 	ss=timeNow.wSecond;
}

5)在绘制函数中计算时、分、秒,确定绘制时分秒针起始点坐标,例如:

//xc, yc为时针中心点坐标
//xs, ys为秒针终止点坐标
//xm, ym为分针终止点坐标
xs=xc+R*cos(PI/2.0-ss/60*2*PI);
ys=yc+R*sin(PI/2.0-ss/60*2*PI);
xm=xc+R*cos(PI/2.0-(mm+ss/60.0)/60.0*2.0*PI);
ym=yc+R*sin(PI/2.0-(mm+ss/60.0)/60.0*2.0*PI);
xh=xc+(R-5)*cos(PI/2.0-(hh+(mm+ss/60.0)/60.0)/12.0*2.0*PI);
yh=yc+(R-5)*sin(PI/2.0-(hh+(mm+ss/60.0)/60.0)/12.0*2.0*PI);

6)在绘制函数中以直线方式简易绘制时、分、秒针:

glColor3f(1,0,0); 
glBegin(GL_LINES); 
glVertex2f(xc,yc); 
glVertex2f(xs,ys); 
glEnd();

glColor3f(1,1,0); 
glBegin(GL_LINES); 
glVertex2f(xc,yc);
glVertex2f(xm,ym); 
glEnd();

glColor3f(0,l,1)glBegin(GL_LINES);
glVertex2f(xc,yc);
glVertex2f(xh,yh);
glEnd ()

7)闲置函数中或时间函数中重复获取系统时间:

GetLocalTime(&timeNow); //获取系统时间 
hh=timeNow.wHour; 		//获取小时时间 
mm=timeNow.wMinute; 	//获取分钟时间 
ss=timeNow.wSecond; 	//获取秒时间

实验二:OpenGL的简单动画

三、参考函数和相关知识

1 )void glutIdleFunc((*f) (void)) //注册闲置相应函数

2 )

void myidle()					//闲置响应回调函数
	{
		//当时间限制时系统要做的事情
}

3 )void glPolygonMode(GLenum face,GLenum mode)//多边形线框模式
4 )void glutTimerFunc(unsigned int msecs, void (*Func)(int value),int value)
• msecs是等待的时间单位。
• Func是注册的函数,它的参数value是指定的一个数值,用来传递到回调函数Func中。
5) glutPostRedisplay(); //重画函数,相当于重新调用display(),改变后的变量得以传给绘制函数
6)时钟相关知识。
系统时间转换成角度技术
①把系统时间取出后,分钟应考虑秒钟的影响,时钟应考虑分钟的影响。例如,

mm=mm+ss/60
hh=hh+mm/60

②角度坐标提示。窗体角度坐标如图所示。
实验二:OpenGL的简单动画实验二:OpenGL的简单动画

③时、分、秒针角度计算。
秒针:当ss=O时,秒针角度=90°=l/2Pi弧度;60秒转一圈,即1秒钟转360/60=6°=Pi/30孤度。
分针:当mm=0时,分针角度=90°=l/2
Pi弧度;60分转一圈,即1分钟转360/60= 6°=Pi/30 弧度。
时针:当hh=O时,时针角度=90°=l/2*Pi弧度;12小时转一圈,即1小时转360/12= 30°=Pi/6 弧度。
时、分、秒针绘制技术
关键是获取时、分、秒针终止点的坐标。假设时针中心点(Xc,Yc),秒针、分针和时针长度分别为 slength、mlength、hlength:
秒针终止点:Xc+slength*Cos(l/2*3.14+ss*3.14/30),Yc+slength*sin(l/2*3.14+ss*3.14/30)
分针终止点:xc+mlength*Cos(l/2*3.14+mm*3.14/30),Xc+mlength*sin(l/2*3.14+mm*3.14/30)
时针终止点:xc+hlength*cos(3/2*3.14+hh*3.14/6),Yc+hlength*sin(3/2*3.14+hh*3.14/6)

实验二:OpenGL的简单动画文章来源地址https://www.toymoban.com/news/detail-450005.html

到了这里,关于实验二:OpenGL的简单动画的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机图形学实验四 OpenGL的鼠标交互绘制

    一、实验目的 1.掌握OpenGL的鼠标按钮响应函数。 2.掌握OpenGL的鼠标移动响应函数。 3.进一步巩固OpenGL的基本图元绘制基础。 二、实验内容 1.鼠标画草图——实现鼠标点到哪,线就画到哪。 思路: 1)在主程序注册鼠标响应和鼠标移动子函数: glutMouseFunc(mymouse); glutMotionFunc(mym

    2023年04月20日
    浏览(99)
  • OpenGL太阳系行星系统简单实现

    使用OpenGL(glfw, glad)模拟太阳系(地球、月球、太阳)系统,涉及三维图形变换、坐标系统,光照模型(待添加)、键盘鼠标事件处理等内容,在main函数中封装了绝大部分的OpenGL接口,极大的减少了代码量,操作简便。 Shader.h Camera.h与Texture.h封装着色器、摄像机与纹理类,其

    2024年02月04日
    浏览(29)
  • Android OpenGL ES实现简单绿幕抠图

    目录 正文 OES Filter BlendShader Filter 最后的效果 缺陷 实现绿幕抠图,其实想法很简单。 这里简单粗暴的使用着色器替换。 OES Filter 直接实现在相机预览上的Shader ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #extension GL_OES_EGL_image_external : require precision mediump float ;        

    2024年02月13日
    浏览(24)
  • unity人物基础动画应用。行走、待机之类的简单动画切换。

    @[TOC]unity人物基础动画应用 直接将项目拖入资源层级就好。这里推荐一个网站,可以给导入网站的模型自动绑骨,并且可挑选动画下载。网站自身也带有很多模型可以直接下载。免费又好用,就是可能网有点慢。 链接: link 1)在项目管理器中右键-创建-动画控制器。双击新建的

    2024年02月08日
    浏览(43)
  • Blender:渲染一个简单动画

    接上 Blender:对模型着色_六月的翅膀的博客-CSDN博客 目标是做一个这种视频 先添加一个曲线,作为相机轨迹 然后添加一个相机   对相机添加物体约束,跟随路径,选择曲线,然后点击动画路径 假如对相机设置跟随路径后,相机的位置出现了闪现位移,只需要将相机的位置坐

    2024年02月07日
    浏览(32)
  • Unity 游戏开发、02 基础篇 | 知识补充、简单使用动画、动画状态机

    Unity 游戏开发、01 基础篇 Q 手型工具(鼠标中键): 上下左右移动场景 ALT + 鼠标左键: 以视图为中心旋转 鼠标右键: 以观察者为中心旋转 SHIFT + Gizmo方块: Y轴归位 物体节点 + F: 观察者定位至物体 3D项目一般窗口布局如下 全局光照GI(Glballlumination)(编辑模式下才能生成

    2024年02月09日
    浏览(55)
  • Unity | 动画组件篇-动画组件的认识和如何简单使用序列帧

    动画系统包含两个东西: 1.动画 2.控制动画啥时候播放的东西 1.创建Animation界面 首先,有一个面板,名字叫做Animation 我们的动画都是在这上面制作的。 再来一个静止的图片,你通过上面过程打开是这样子的 我们做动画,一般得有个物体,所以想做动画,也要先选择一个初始

    2024年02月15日
    浏览(45)
  • 【HTML】制作一个简单的线性动画

     目录 前言 HTML部分 CSS部分 JS部分 效果图 总结         无需多言,本文将详细介绍一段HTML代码,具体内容如下:         首先新建文件夹,创建一个文本文档,两个文件夹,其中HTML的文件名改为[index.html];CSS的文件名改为[css],里面新建一个文本文档重命名为[normalize.mi

    2024年04月12日
    浏览(32)
  • 一个简单的Python樱花飘落动画代码

    以下是一个简单的Python樱花飘落动画代码示例: 这个示例代码将在控制台中显示一个樱花飘落的动画效果,使用了 ANSI Escape Codes 来控制颜色。请注意,这段代码可能在某些操作系统上无法正常运行,因为不同的操作系统支持的 ANSI Escape Codes 可能不同。

    2024年02月11日
    浏览(38)
  • Three.js 模型加载及加载简单动画

    时间过的好快啊~再一次感叹,忙忙碌碌一年又过去了,新年第一帖,新的一年也要加油呀! 简单介绍下Three.js吧,Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多、使用最广泛的三维引擎。因为使用简单,入门比较容易。 Three.js的具体

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包