实验二 交互与动画

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.应用被动移动回调函数,可以不用按鼠标按钮就可以连续画正方形;

相关文档
最新文档