OpenGL学习-2-鼠标事件响应练习工程代码

#include#include#include#includevoid init(void);void drawCoordinates(void);void CALLBACK reshape(GLsizei w,GLsizei h);void CALLBACK OnLButtonDown(AUX_EVENTREC *);void CALLBACK OnLButtonMove(AUX_EVENTREC *);void CALLBACK display(void);GLint mx,my;//鼠标的坐标GLfloat x_angle,y_angle;//摄像机的角度void init(void){}void CALLBACK reshape(GLsizei w,GLsizei h)//回调函数,用于在改变窗口大小时由系统自行调用//!!注意!!GLsizei为正确类型!而非GLsize{glViewport(0,0,w,h);//视口函数,指定了视口的左下角(在第一象限内,以(0,0)为原点)位置?glMatrixMode(GL_PROJECTION);//指定哪一个矩阵是当前矩阵glLoadIdentity();//将当前用户坐标系的原点移到了屏幕中心,类似于一个复位操作if(w>h)glOrtho(-1.0f*w/h,1.0f*w/(GLfloat)h,-1.0f,1.0f,-1.0,1.0);//将当前的可视空间设为正投影空间,六个参数的意义为空间长方体的左、右、下、上、近、远坐标//此处设置参数的意义是保证绘制区域为窗口中心可以取到的最大正方形区域//?为何在右宽度将高度转为GLfloat格式意义不明elseglOrtho(-1.0f,1.0f,-1.0f*h/w,1.0f*h/(GLfloat)w,-1.0,1.0);glMatrixMode(GL_MODELVIEW);//对模型视景矩阵堆栈应用随后的矩阵操作glLoadIdentity();//将当前用户坐标系的原点移到了屏幕中心,类似于一个复位操作}void CALLBACK OnLButtonDown(AUX_EVENTREC *event)//鼠标按下时的回调函数,记录按下时鼠标的位置,作为计算位移的初始点{mx=event->data[AUX_MOUSEX];my=event->data[AUX_MOUSEY];}void CALLBACK OnLButtonMove(AUX_EVENTREC *event)//鼠标拖拽使的回调函数,根据位移后的位置和记录的开始位移位置改变摄像头的拍摄角度{GLint dx,dy;//声明记录位移大小的变量dx = event->data[AUX_MOUSEX]-mx;dy = event->data[AUX_MOUSEY]-my;//计算位移//在鼠标未按下时,鼠标位移调用的mx,my与dx,dy相同,所以不会造成角度变换,对于这个设置的保证在下方y_angle += dx*0.01f;x_angle += dy*0.01f;//由位移计算出绕x,y轴旋转的角度,保存至y_angle,x_angle//!!特别注意!!因为使用上的感觉,左右的位移就像是在转动竖直的坐标轴的操作,所以在X方向上的位移是保存至y_angle,在Y方向上的位移保存至x_angledisplay();mx=event->data[AUX_MOUSEX];my=event->data[AUX_MOUSEY];//将鼠标位置更新为当前位置,若没有这一步图像可能在点击一次后移动鼠标即会快速转动,并且离点击位置越远转动速度越快,无法表现出拖拽的效果}void CALLBACK display(void)//回调函数,用于在窗口内显示图像时由系统调用,在窗口大小改变后会被自动调用{glClearColor(0.0f,0.0f,0.0f,0.0f);//清理窗口内容,设置背景颜色。由RGBA数字代表颜色;//绘制图形时尽量避免设置透明图形,因为透明效果显示时需要对图像显示层数进行排序glClear(GL_COLOR_BUFFER_BIT);//清除缓冲,此参数代表清除颜色缓冲,color改为depth为清除深度缓冲glRotatef(x_angle,1.0f,0.0f,0.0f);glRotatef(y_angle,0.0f,1.0f,0.0f);//旋转坐标系,第一个参数为旋转角度,后三个参数为旋转轴的方向向量drawCoordinates();glFlush();//强制刷新缓冲函数,保证图形绘制命令被执行而不是存储在缓冲区auxSwapBuffers();//利用双缓冲技术避免经常刷新带来的屏幕闪烁}void drawCoordinates(void)//绘制坐标轴{glLineWidth(3.0f);//设置绘制线段的宽度glColor3f(1.0f,0.0f,0.0f);//设置接下来绘制图形的颜色,此为红色glBegin(GL_LINES);//此函数代表某种图形绘制的开始,参数为所要绘制图形的类型;glVertex3f(0.0f,0.0f,0.0f);glVertex3f(1.0f,0.0f,0.0f);//代表绘制的线段的两个端点在坐标系中的位置//!!注意!!坐标系中一个单位长度为视口高/宽的1/2glEnd();//此图形绘制结束glColor3f(0.0f,1.0f,0.0f);//设置接下来绘制图形的颜色,此为绿色glBegin(GL_LINES);//此函数代表某种图形绘制的开始,参数为所要绘制图形的类型;glVertex3f(0.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);//代表绘制的线段的两个端点在坐标系中的位置glEnd();//此图形绘制结束glColor3f(0.0f,0.0f,1.0f);//设置接下来绘制图形的颜色,此为蓝色glBegin(GL_LINES);//此函数代表某种图形绘制的开始,参数为所要绘制图形的类型;glVertex3f(0.0f,0.0f,0.0f);glVertex3f(0.0f,0.0f,1.0f);//代表绘制的线段的两个端点在坐标系中的位置glEnd();//此图形绘制结束}void main(void){auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);//glaux函数:设置显示模式,single代表单缓冲,一般用于静态绘制,RGBA表示红绿蓝透明度色彩模式auxInitPosition(0,0,500,500);//glaux函数:设置窗口位置和大小,前两位代表新建窗口时左上角的位置,后两位代表窗口的宽和高auxInitWindow("MyWindow");//glaux函数:创建窗口,函数参数为窗口的名字init();auxReshapeFunc(reshape);//注册回调函数,使之能被系统调用auxMouseFunc(AUX_LEFTBUTTON,AUX_MOUSEDOWN,OnLButtonDown);//注册回调函数,使之能被系统调用auxMouseFunc(AUX_LEFTBUTTON,AUX_MOUSELOC,OnLButtonMove);//注册回调函数,使之能被系统调用auxMainLoop(display);//注册回调函数,使之能被系统调用}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值