OpenGL的简单动画与交互
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OpenGL的简单动画与交互
一、实验目的
1、学会OpenGL的简单键盘交互操作。
2、掌握OpenGL鼠标交互功能及其简单应用。
3、掌握OpenGL的闲置函数与简单动画。
4、掌握反走样思想和算法。
二、实验内容与要求
1、在实验一(画矩形)的基础上添加键盘交互,按W键绘制的矩形上移,
按S键矩形下移,按A键矩形左移,按D键矩形右移,如图3-1。参考
步骤如下:
(1)在主函数里添加键盘注册回调函数
glutKeyboardFunc(mykeyboard);
此函数可放在 glutDisplayFunc(display);后面。
(2)在display()绘制函数中修改绘制矩形代码,用变量代替数值参数。
例如: glRectf(-0.5,-0.5,0.5,0.5)改为glRectf(x1,y1,x2,y2);
(3)在程序中增加mykeyboard键盘子函数,并在如下代码中进行修改,实现键盘控制矩形移动
void mykeyboard(unsigned char key, int x, int y)
{
switch(key)
{ case 'W':
case 'w':// 矩形对角坐标变量修改使得矩形上移 break;
case 'S':
case 's'://矩形对角坐标变量修改使得矩形下移 break;
case 'A':
case 'a'://矩形对角坐标变量修改使得矩形左移 break;
case 'D':
case 'd'://矩形对角坐标变量修改使得矩形右移 break;
}
//参数修改后调用重画函数,屏幕图形将发生改变
glutPostRedisplay();
}
2、闲置函数的使用与简单动画。
旋转的六边形,如图3-3所示
阅读OpenGL旋转的六边形样本框架程序rotate-polygon.cpp,分
析程序的实现步骤:
//样本程序:旋转的六边形
#include
#include
#define PI 3.14159 //设置圆周率
int n=6, R=10; //多边形变数,外接圆半径
float theta=0.0; //旋转初始角度值
void Keyboard(unsigned char key, int x, int y);
void Display(void);
void Reshape(int w, int h);
void myidle();
void main(int argc, char** argv)
{ glutInit(&argc, argv); //初始化GLUT库;
glutInitWindowSize(700,700); //设置显示窗口大小
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //设置显示模式;(注意双缓冲)
glutCreateWindow("A Rotating Square"); // 创建显示窗口
glutDisplayFunc(Display); //注册显示回调函数
glutReshapeFunc(Reshape); //注册窗口改变回调函数
glutIdleFunc(myidle); //注册闲置回调函数
glutMainLoop(); //进入事件处理循环
}
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0,0); //设置红色绘图颜色
glBegin(GL_POLYGON); //开始绘制六边形
for (int i=0;i glVertex2f( R*cos(theta+i*2*PI/n), R*sin(theta+i*2*PI/n)); glEnd(); glutSwapBuffers(); //双缓冲的刷新模式; } void myidle() { theta+=1.0; if (theta>=2*PI) theta-=2*PI; glutPostRedisplay(); //重画,相当于重新调用Display(),改编后的变量得以传给绘制函数} void Reshape(GLsizei w,GLsizei h) { glMatrixMode(GL_PROJECTION); //投影矩阵模式 glLoadIdentity(); //矩阵堆栈清空 gluOrtho2D(-1.5*R*w/h,1.5*R*w/h,-1.5*R,1.5*R); //设置裁剪窗口大小 glViewport(0,0,w,h); //设置视区大小 glMatrixMode(GL_MODELVIEW); //模型矩阵模式 } 运行该程序,观察旋转动画效果。 思考: 如果要调整旋转速度,旋转更快或更慢,应该如何修改程序? 图3-3 3、鼠标交互。 (1) 鼠标画线 阅读OpenGL鼠标画线程序draw-lines.cpp,能够实现在绘制窗口 用鼠标交互绘制若干条直线,鼠标左键首先按下,确定直线的起始 点,鼠标左键按下同时移动,看到画线过程,鼠标左键松开时,确 定直线的终点,可重复画多条直线。如图3-4所示。