计算机图形学 -- 变换之旋转二 [鼠标操作]
来源:互联网 发布:unity3d对电脑的要求 编辑:程序博客网 时间:2024/06/11 01:23
在上一次的旋转中加入鼠标的动作,
按左键加速,右键减速,中键停止
滚轮的动作文件中好像没有,总之没有找到,只有键的定义
稍后补上
#include<GL/glut.h>#include<stdlib.h>#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") GLfloat rtri;float add = 0.1f;void init(){glClearColor(0.0f,0.0f,0.0f,0.0f);glShadeModel(GL_SMOOTH);//GL_FLAT和GL_SMOOTH在这里的区别很明显哟glEnable(GL_DEPTH_TEST); }void mydisplay(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();glTranslatef(0.0f,0.2f,-4.0f);glRotatef(rtri,0.0f,1.0f,0.0f);glBegin(GL_TRIANGLES);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(1.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glEnd();rtri += add;glutSwapBuffers();}void reshape(int width,int height) { glViewport(0,0,width,height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity(); } void mouse(int button,int state,int x,int y){//前面三行是按键,后面是滚轮if(button == GLUT_LEFT_BUTTON){ if(add==0) add = 0.1f; add = add*2;}if(button == GLUT_MIDDLE_BUTTON)add = 0;if(button == GLUT_RIGHT_BUTTON){ if(add==0) add = 0.1f; add = add/2;}}int main(int argc,char * argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowPosition(300,100);glutInitWindowSize(650,500);glutCreateWindow("change");init();glutDisplayFunc(mydisplay);glutReshapeFunc(reshape);glutIdleFunc(mydisplay);//设置空闲时调用的函数,idle就是空闲的、闲置的意思glutMouseFunc(mouse);glutMainLoop();return 0;}
这一次只是在上一次的基础上加了一个mouse函数再在主函数里面调用一下,里面只有简单的判断
下面附上函数介绍:->->
-----------------------------------华丽丽的分割线----------------------------------------------------------
和键盘处理一样,GLUT为你的注册函数(也就是处理鼠标clicks事件的函数)提供了一个方法。函数glutMouseFunc,这个函数一般在程序初始化阶段被调用。函数原型如下:
void glutMouseFunc(void(*func)(int button,int state,int x,int y));
参数:
func:处理鼠标click事件的函数的函数名。
从上面可以看到到,处理鼠标click事件的函数,一定有4个参数。
第一个参数表明哪个鼠标键被按下或松开,这个变量可以是下面的三个值中的一个:
GLUT_LEFT_BUTTON
GLUT_MIDDLE_BUTTON
GLUT_RIGHT_BUTTON
第二个参数表明,函数被调用发生时,鼠标的状态,也就是是被按下,或松开,可能取值如下:
GLUT_DOWN
GLUT_UP
当函数被调用时,state的值是GLUT_DOWN,那么程序可能会假定将会有个GLUT_UP事件,甚至鼠标移动到窗口外面,也如此。然而,如果程序调用glutMouseFunc传递NULL作为参数,那么GLUT将不会改变鼠标的状态。
剩下的两个参数(x,y)提供了鼠标当前的窗口坐标(以左上角为原点)。
检测动作(motion)
GLUT提供鼠标motion检测能力。有两种GLUT处理的motion:active motion和passive motion。
Active motion是指鼠标移动并且有一个鼠标键被按下。(拖动鼠标)
Passive motion是指当鼠标移动时,并有没鼠标键按下。(移动鼠标)
如果一个程序正在追踪鼠标,那么鼠标移动期间,没一帧将产生一个结果。
和以前一样,你必须注册将处理鼠标事件的函数(定义函数)。GLUT让我们可以指定两个不同的函数,一个追踪passive motion,另一个追踪active motion
它们的函数原型,如下:
void glutMotionFunc(void(*func)(int x,int y));
void glutPassiveMotionFunc(void (*func)(int x,int y));
参数:
Func:处理各自类型motion的函数名。
处理motion的参数函数的参数(x,y)是鼠标在窗口的坐标。以左上角为原点。
检测鼠标进入或离开窗口
GLUT还能检测鼠标鼠标离开,进入窗口区域。一个回调函数可以被定义去处理这两个事件。GLUT里,调用这个函数的是glutEntryFunc,函数原型如下:
void glutEntryFunc(void(*func)(int state));
参数:
Func:处理这些事件的函数名。
上面函数的参数中,state有两个值:
GLUT_LEFT 鼠标离开窗口
GLUT_ENTERED 鼠标进入窗口
表明,是离开,还是进入窗口。
- 计算机图形学 -- 变换之旋转二 [鼠标操作]
- 计算机图形学(四)_几何变换_1_基本的二维几何变换(二)_旋转
- 计算机图形学 -- 变换之旋转一 [金字塔旋转] [各种详解哦]
- 计算机图形学实验-几何图形的比例和旋转变换
- 几何变换---计算机图形学
- 计算机图形学,各种变换
- 计算机图形学 矩阵变换
- 计算机图形学坐标变换
- 计算机图形学 变换矩阵
- 计算机图形学基础(二) 三维变换和四元数
- 计算机图形学 学习笔记(七):二维图形变换:平移,比例,旋转,坐标变换等
- 计算机图形学 几何变换代码
- 计算机图形学 复合变换矩阵
- 计算机图形学图形的变换
- 计算机图形学基础知识-三维变换
- 计算机图形学基础-三维变换
- 计算机图形学—几何变换
- 计算机图形学之二维平移旋转缩放代码
- C4.5算法
- 配置Azure命令行工具连接中国区
- 2个android程序之间的调用
- 文件(XML)解析处理工具类
- 黑马程序员-------面向对象基础(二)
- 计算机图形学 -- 变换之旋转二 [鼠标操作]
- 搜索引擎信息采集
- email发送工具类
- (转)C++11的语法新特性
- 原型模式lua实现
- jquery.tablesorter.js 使用 table js 排序
- Android应用开发之RGB & ARGB
- sftp传输用工具类
- 随机生成5位不重复的数