实验2OpenGL交互

it2024-04-21  5

一.实验目的

理解并掌握一个OpenGL程序的常见交互方法。

二.实验内容

运行示范代码,掌握程序鼠标交互方法、鼠标坐标获取方法。尝试为示范代码添加键盘与菜单控制,来实现绘制一些基本图形功能。

三.实验原理

在OpenGL中处理鼠标事件非常方便,GLUT已经为我们注册好了函数,只需要我们提供一个方法。使用glutMouseFunc函数,就可以注册自定义函数,这样当发生鼠标事件时就会自动调用自己定义的方法。 函数的原型是:

void glutMouseFunc(void(*func)(int button,int state,int x,int y));

参数func指定处理鼠标click事件的函数名。 从上面可以看到,处理鼠标单击事件的函数,一定有四个参数。第一个参数表明哪个鼠标键被按下或松开,这个变量可以是下面的3个值中的一个:

GLUT_LEFT_BUTTON GLUT_MIDDLE_BUTTON GLUT_RIGHT_BUTTON

第二个参数表明,函数被调用时,鼠标的状态,也就是被按下或松开,可能取值如下:

GLUT_DOWN GLUT_UP

当函数被调用时,state的值是GLUT_DOWN,那么程序可能假定将会有一个GLUT_UP事件,甚至鼠标移动到窗口外面,也如此。然而,如果程序调用glutMouseFunc传递NULL作为参数,那么GLUT将不会改变鼠标的状态。参数x,y提供了鼠标当前的窗口坐标(以左上角为原点)。 键盘相关知识可参考:http://blog.csdn.net/xie_zi/article/details/1911891。 菜单相关知识可参考:http://blog.csdn.net/xie_zi/article/details/1963383。

四.实验代码

#include <GL/glut.h> #include <stdlib.h> GLfloat x = 0.0; GLfloat y = 0.0; GLfloat size = 50.0; GLsizei wh = 500, ww = 500; void drawSquare(GLint x, GLint y) { y = wh-y; glBegin(GL_POLYGON); glVertex3f(x + size, y + size, 0); glVertex3f(x - size, y + size, 0); glVertex3f(x - size, y - size, 0); glVertex3f(x + size, y - size, 0); glEnd(); } void myDisplay() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); drawSquare(x, y); glutSwapBuffers(); glutPostRedisplay(); } void init() { glClearColor (0.0, 0.0, 0.0, 1.0); } void myReshape(GLint w, GLint h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, w, 0, h, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); ww = w; wh = h; } void myMouse(GLint button, GLint state, GLint wx, GLint wy) { if(button ==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) exit(0); if(button ==GLUT_LEFT_BUTTON && state == GLUT_DOWN) { x = wx; y = wy; } } void main(int argc, char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(0,0); glutCreateWindow("click to display square"); init(); glutDisplayFunc(myDisplay); glutReshapeFunc(myReshape); glutMouseFunc(myMouse); glutMainLoop(); }

五.实验提高

实现一个通过鼠标右键菜单切换的简单绘图程序,可以尝试绘制直线、三角形、正方形等常见图形。

最新回复(0)