实验二 交互与动画
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二交互与动画
姓名叶传军学号 E11414103 得分
【实验目的】
1.掌握基本交互式程序的编程方法。
2.掌握基本动画程序的编程方法。
一.实验题目
1.阅读squareMouse.c, 回答下面的问题:
(1)glFlush()函数和glClear(GL_COLOR_BUFFER_BIT)函数的作用分别是什么?(可将这两个函数注释掉,和注释前的结果对比)
(2)修改squareMouse.c,分别实现如下功能:
a.通过利用移动回调函数可以在不释放鼠标按钮的情况下,连续画一
系列正方形;
b.应用被动移动回调函数,可以不用按鼠标按钮就可以连续画正方形;
c.按下Alt+c或Alt+C时,终止程序。
2. 编写一个程序,实现如下的功能:连续两次单击鼠标左键,以两次单击的位置作为矩形的对角线来绘制一个矩形,且该矩形各边与屏幕对齐。鼠标右键用于程序的退出。
(1)将绘制矩形的函数放在鼠标回调函数中完成。
(2)修改(1)中的程序,将绘制矩形的函数放在显示回调函数中完成。鼠标回调函数用于状态的修改,并调用显示回调函数(利用glutPostRedisplay())。
3.将正方形旋转的程序squareRotate.c改成正六边形旋转的程序。
4.创建一个绘图程序,使得可用鼠标来创建一些简单的形状,如线段,三角形,矩形,并可通过菜单来实现下列功能。要求:
(1)可改变形状的颜色。
(2)可改变形状的大小。
(3)可移动形状。
(4)可旋转形状。
(5)你能想到的任何功能。
二.设计思想
本次实验主要通过改变几个主要回调函数来实现一些图形的绘制,主要使用的回调函数有
glutMouseFunc();鼠标回调函数
glutMotionFunc();鼠标移动回调函数
glutPassiveMotionFunc();被动移动回调函数
glutKeyboardFunc();键盘回调函数
void display();显示回调函数
其中应注意每个函数参数的含义以及glutPostRedisplay()函数与display()函数的使用。
三.程序清单
1.阅读squareMouse.c, 回答下面的问题:
(1)glFlush()函数和glClear(GL_COLOR_BUFFER_BIT)函数的作用分别是什么?(可将这两个函数注释掉,和注释前的结果对比)
glFlush()函数的作用是清空OPENGL命令缓冲区,执行OPENGL程序。
GlClear(GL_COLOR_BUFFER_BIT)函数的作用是用当前背景色填充窗口。
(2)修改squareMouse.c,分别实现如下功能:
a.通过利用移动回调函数可以在不释放鼠标按钮的情况下,连续画一系列正方形;#include"stdafx.h"
#include
#include
#include
/* globals */
GLsizei wh = 300, ww = 300; /* initial window size */
GLfloat size = 5.0; /* half side length of square */
void drawSquare(int x, int y)
{
y=wh-y;
glColor3ub( (char) rand()%256, (char) rand()%256, (char) rand()%256);
//glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(x+size, y+size);
glVertex2f(x-size, y+size);
glVertex2f(x-size, y-size);
glVertex2f(x+size, y-size);
glEnd();
glFlush();
}
/* rehaping routine called whenever window is resized
or moved */
void myReshape(GLsizei w, GLsizei h)
{
/* adjust clipping box */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, (GLdouble)w, 0.0, (GLdouble)h, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
/* adjust viewport and clear */
glViewport(0,0,w,h);
glClearColor (0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
/* set global size for use by drawing routine */
ww = w;
wh = h;
}
void myinit(void)
{
/* set clear color to black */
glClearColor (0.0, 0.0, 0.0, 1.0);
}
void mouse(int btn, int state, int x, int y)
{
if(btn==GLUT_RIGHT_BUTTON && state==GLUT_DOWN) exit(0);
if(btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN) drawSquare(x, y); }
/* display callback required by GLUT 3.0 */
void display(void)
{}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(300,300);
glutInitWindowPosition(0,0);
glutCreateWindow("E11414103叶传军");
glutDisplayFunc(display);
glutReshapeFunc (myReshape);
glutMotionFunc (drawSquare);
myinit ();
glutMainLoop();
}
b.应用被动移动回调函数,可以不用按鼠标按钮就可以连续画正方形;