OpenGL学习(二)用户与交互

重绘回调函数

    void glutReshapeFunc(void(*f)(int width,int height))

当用户用鼠标改变窗口的尺寸时,窗口回调函数f()即被调用,然后调用显示回调函数。新窗口的h和w将返回函数f()

注:窗口首次创建时,重回回调函数也将被调用。

Idle回调函数

    void glutIdleFunc(void(*f)(void))

当事件对列为空时,函数f()将得到执行。

void glutPostRedisplay()

请求在当前回调函数返回之后,执行回调函数。

下面给出一个矩形旋转的例子

#include <gl/glut.h>
#include <math.h>

#define DEG_TO_RAD 0.017453

GLfloat theta=0.0;

void init()
{
	glClearColor(0.0,0.0,0.0,0.0);      //指定屏幕背景为黑色

	glColor3f(1.0,1.0,1.0);             //设置绘制颜色为白色

	glShadeModel(GL_FLAT);              //设置颜色插值为平面模式

}

void display()
{
	glClear(GL_COLOR_BUFFER_BIT);         //清理屏幕颜色为我们指定的颜色

	glBegin(GL_POLYGON);              //绘制模式为凸多边形
	glVertex2f(-cos(DEG_TO_RAD*theta),-sin(DEG_TO_RAD*theta));
	glVertex2f(sin(DEG_TO_RAD*theta),-cos(DEG_TO_RAD*theta));
	glVertex2f(cos(DEG_TO_RAD*theta),sin(DEG_TO_RAD*theta));
	glVertex2f(-sin(DEG_TO_RAD*theta),cos(DEG_TO_RAD*theta));
	glEnd();                          

	glFlush();                       //强制以上绘图操作执行
}

void reshape(int w,int h)
{
	glMatrixMode(GL_PROJECTION);       //设置为投影模式
	glLoadIdentity();
	gluOrtho2D(-1.0,1.0,-1.0,1.0);

	glViewport(0,0,(GLsizei)w,(GLsizei)h);
}

void myidle()
{
	theta+=2.0;
	if(theta>360) theta-=360;
	glutPostRedisplay();
}

int main(int argc,char**argv)
{
	glutInit(&argc,argv);                           //初始化glut
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);    //设置窗口模式为单缓冲和RGB模式
	glutInitWindowSize(500,500);                    //设置窗口大小
	init();
	glutCreateWindow("test");                       //设置窗口标题
	glutDisplayFunc(display);                       //设置绘图回调函数
	glutReshapeFunc(reshape);                       //设置窗口回调函数
	glutIdleFunc(myidle);                           //设置空闲回调函数
	glutMainLoop();                                 //开始循环,等待响应
	return 0;
}

运行程序得到如下结果:

双缓存

      使用两个颜色缓存--前台缓存的后台缓存,前台缓存时显示硬件所显示的内容,而后台缓存则是     应 用程序进行绘制的地方。后台缓存绘制玩整个正方形后,我们要做的仅仅是交换这两个缓存的内     容。在显示回调函数中用函数glutSwapBuffers()代替glFluash()即可。

注:该函数是一个glut函数,交换过程中涉及与窗口系统的交互。因此必须在初始化阶段请求双     缓存模式,即glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)。

键盘的使用

    void glutKeyboardFunc(void* f(unsigned char key,int x,int y))

指定当任何键被按下,函数f将被调用。所按下的建同光标的位置一并传入f。光标位置为像素,从

窗口左上角开始度量的。

注:该函数只响应按下的操作,释放按键的消息将被忽略。

特殊键

    void glutSpecialFunc(void* f(unsigned char key,int x,int y))

指定特殊键的回调函数。

如:

if(key == GLUT_KEY_F1)

if(key == GLUT_KEY_UP)

int glutGetModifiers()

如果键在鼠标或键盘事件产生时,键被按下,则该函数返回GLUT_ACTIVE_SHIFT,GLUT_ACTIVE_CTRL     或者GLUT_ACTIVE_ALT的逻辑与结果。

例如为了让Ctrl+c或C种植一段程序,则可这样写:

if(glutGetModifiers()==GLUT_ACTIVE_CTRL && ((key==‘c‘) || (key=‘C‘))) exit(0);

鼠标回调函数

    void glutMouseFunc(void (*f)(int button,int state,int x,int y))

表明三件事:鼠标回调函数f返回鼠标在窗口的位置、其状态(GLUT_UP或GLUT_DOWN)以及鼠标事       件的来源(GLUT_LEFT_BUTTON,GLUT_MIDDLE_BUTTON 或 GLUT_RIGHT_BUTTON)

鼠标的移动

    当鼠标移动,无论键是否被按下,也会引发事件。

移动事件:键被按下鼠标移动(move event)。

被移动事件:移动时未有键被按下(passive move event);

void glutMotionFunc(void (*f)(int x,int y))

void glutPassiveMotionFunc(void (*f)(int x,int y))

指定移动和被移动事件的回调函数,鼠标的位置(x,y)返回给这两个函数

当鼠标进入或里考OpenGL窗口时将产生一个进入事件

void glutEntryFunc(void (*f)(int state))

指定进入回调函数,返回的状态为GLUT_ENTERED或GLUT_LEFT。

时间: 2024-12-21 20:08:17

OpenGL学习(二)用户与交互的相关文章

OpenGL学习(二)用户与交互

菜单     GLUT提供了重要的组件--菜单.通常这些菜单都被实现为弹出式菜单.往往在鼠标的某一键被按下时才会出现.定义菜单的三个步骤: 1.确定菜单中有哪些选项,即菜单的每行将显示哪些字符串. 2.菜单的每一行关联一种特定操作. 3.每个菜单与鼠标按键建立关联. 菜单通常在主函数或主函数调用的初始化函数中被创建.GLUT允许创建级联菜单,方法是一个菜单项指向一个子菜单.顶级菜单由如下函数创建: int glutCreateMenu(void (*f)(int value)) 创建一个使用回调

OpenGL学习笔记3 —— 绘制3D物体、鼠标交互、反向变换

/* reference http://nehe.gamedev.net/article/using_gluunproject/16013/ */ #include <windows.h> // windows系统要加这个.因为下面2个头文件的一些宏是在这个文件中定义的 #include <gl/Gl.h> #include <gl/glut.h> //这两个头文件在OpenGL程序中几乎必加. #include <cstdio> //标准输入输出,用来打印

OpenGl学习进程(7)第五课:点、边和图形(二)边

本节是OpenGL学习的第五个课时,下面介绍OpenGL边的相关知识: (1)边的概念: 数学上的直线没有宽度,但OpenGL的直线则是有宽度的.同时,OpenGL的直线必须是有限长度,而不是像数学概念那样是无限的.可以认为,OpenGL的“直线”概念与数学上的“线段”接近,它可以由两个端点来确定.     (2)如何绘制边: 1)OpenGL支持绘制三种类型的边: GL_LINES :指定两个顶点,在它们之间绘制一条直线.如果为GL_LINES指定了奇数个顶点,那么最后一个顶点会被忽略. GL

OpenGL学习之路(四)

1 引子 上次读书笔记主要是学习了应用三维坐标变换矩阵对二维的图形进行变换,并附带介绍了GLSL语言的编译.链接相关的知识,之后介绍了GLSL中变量的修饰符,着重介绍了uniform修饰符,来向着色器程序传入输入参数. 这次读书笔记的内容相对有趣一些,主要是和园友们分享讨论三维坐标变换矩阵在三维几何体上的应用,以及介绍一下如何实现三维图形与用户操作的交互.这一次笔记在三维编程中也是非常重要的——我们最后开发的三维程序最终就是要和目标用户进行交互的. 之前一直没有在博客上放过gif格式的动画图片,

OpenGL学习进程(3)第一课:初始化窗体

    本节是OpenGL学习的第一个课时,下面介绍如何初始化一个窗体:     (1)显示一个有蓝色背景的窗体: #include <GL/glut.h> #include <stdlib.h> void display(void) { /* clear all pixels */ glClear (GL_COLOR_BUFFER_BIT); glFlush (); } int main(int argc, char** argv) { glutInit(&argc, a

OpenGL学习脚印: 视变换(view transformation)

写在前面 OpenGL中的坐标处理过程包括模型变换.视变换.投影变换.视口变换等内容,这个主题的内容有些多,因此分节学习,主题将分为5节内容来学习.上一节模型变换,本节学习模型变换的下一阶段--视变换.到目前位置,主要在2D下编写程序,学习了视变换后,我们可以看到3D应用的效果了.本节示例程序均可在我的github下载. 通过本节可以了解到 视变换的概念 索引绘制立方体 LookAt矩阵的推导(对数学不感兴趣,可以跳过) 相机位置随时间改变的应用程序 坐标处理的全局过程(了解,另文详述) Ope

Swift开发学习(二):Playground

Swift开发学习:Playground 关于 对于软件用户.游戏玩家,大家一直都在提倡用户体验.其实软件开发者自己也是用户,是各种开发工具的使用者,也会喜欢用户体验做得好的工具软件.这次苹果想开发者所想,提供了一个可以玩转swift的游乐场--Playground,它为开发着提供了方便.提供了乐趣. 原文作者:Power 转载请保留此链接. Playground可以干什么 快速练习swift 不需要编译.不需要点击执行,编写代码后直接看效果 是不是比脚本语言还方便? 开发者可以通过Playgr

[Python 学习] 二、在Linux平台上使用Python

这一节,主要介绍在Linux平台上如何使用Python 1. Python安装. 现在大部分的发行版本都是自带Python的,所以可以不用安装.如果要安装的话,可以使用对应的系统安装指令. Fedora系统:先以root登入,运行 yum install python Ubuntu系统:在root组的用户, 运行 sudo apt-get install python 2. 使用的Python的脚本 Linux是一个以文件为单位的系统,那么我们使用的Python是哪一个文件呢? 这个可以通过指令

OpenGL学习笔记:拾取与选择

转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当前鼠标的位置是哪一个物体呢? OpenGL有一套机制,叫做Picking, 里面涉及到几个核心概念: 1. selection mode. 选择模式 2. name stack. 名字栈 3. hit record. 命中记录 4. viewing volume. 视角范围 在OpenGL的pick

Jquery Easy UI初步学习(二)datagrid的使用

第一篇学的是做一个管理的外框,接着就是数据datagrid绑定了,这里我用asp.net mvc3来做的,主要就是熟悉属性.方法. 打开easyui的demo 就可以看到如下一段代码: 和上篇一样class="easyui-datagrid", data-options="...",这是一样的,其他我在网上查了查,并做了整理 DataGrid 属性 参数名 类型 描述 默认值 title string Datagrid面板的标题 null iconCls strin