OpenGL学习(二)用户与交互

菜单

    GLUT提供了重要的组件--菜单。通常这些菜单都被实现为弹出式菜单。往往在鼠标的某一键被按下时才会出现。定义菜单的三个步骤:

1、确定菜单中有哪些选项,即菜单的每行将显示哪些字符串。

2、菜单的每一行关联一种特定操作。

3、每个菜单与鼠标按键建立关联。

菜单通常在主函数或主函数调用的初始化函数中被创建。GLUT允许创建级联菜单,方法是一个菜单项指向一个子菜单。顶级菜单由如下函数创建:

int glutCreateMenu(void (*f)(int value))

创建一个使用回调函数f的顶级菜单,f由菜单项传入一个整数值value。该函数将为所创建菜单返回一个唯一标示符。

所创建的菜单将称为当前菜单。

void glutSetMenu(int id)    //将当前菜单设为标示符为id的菜单

void glutAddMenuEntry(char* name,int value)  //为当前项增加一个名称为那么的菜单项,                                                        value将被返回给菜单回调函数

void glutAttachMenu(int button)   //为当前菜单依附到一个指定的鼠标按钮上                                              (GLUT_RIGHT_BOTTON、GLUT_MIDDLE_BOTTON、GLUT_LEFT_BOTTON)

void glutAddSubMenu(char* name,int menu)

假如我们想用鼠标右键弹出一个有两个菜单项的菜单:一个可清屏,一个结束程序。则可以在main或者init假如如下代码:

	int id=glutCreateMenu(mymenu);
	glutAddMenuEntry("Clear Screen",1);
	glutAddMenuEntry("Exit",2);
	glutAttachMenu(GLUT_LEFT_BUTTON);

mymenu函数定义如下:

        void mymenu(int value)
    {
	if (value==1)
	{
		glClear(GL_COLOR_BUFFER_BIT);
		glFlush();
	}
	if (value==2)
	{
		exit(0);
	}
    }

NULL回调函数

    将NULL作为回调函数,则可注销原来的回调函数。

子窗口与多窗口

    int glutCreateWindow(char* name)  //创建一个顶级窗口name,并为其返回一个标示符

int glutDestoryWindow(int id)    //销毁标示符为id的顶级窗口

当一个窗口被创建后,它就成了当前窗口。图元都将绘制在当前窗口中。

void glutSetWindow(int id)   //将当前窗口设置为标示符为id的窗口。

int glutCreateSubWindow(int parent,int x,int y,int width,int height)  //为parent创                                                                              建一个子窗口

当子窗口被创建时,它就成为当前窗口。

void glutPostWindowRedisplay(int winid) //通知标示符为winid的窗口重新显示

显示列表

    OpenGL中的标准绘图模式称为立即模式。只要各种图元被定义,就立即传入到OpenGL流水线。当屏幕需要重绘时,我们必须重新生成这些图元,然后再次将这些图元传入流水线。因此重新显示的过程可能相当耗时。

保留模式下,图元集合及其他信息可作为对象保存在服务器中,这样避免了代价较高的传输和重新生成的问题。OpenGL通过显示列表来实现这些对象的定义。使用显示列表的4个步骤:

1、打开显示列表

2、为其命名

3、添加命令

4、关闭显示列表

void glNewList(GLuint name,GLenum mode) //创建一个新的显示列表,mode的值(GL_COMPILE、                                                 GL_COMPILE_AND_EXECUTE)

void glEndList()  //结束显示列表的定义

GL_COMPILE:将显示列表放在服务器中,但其内容不被显示

GL_COMPILE_AND_EXECUTE:显示列表创建时就被显示。

void glCallList(GLuint name)   //执行显示列表name

void glDeleteLists(GLuint first,GLsizei number)  //删除由first开始的number个显示列表。

多个显示列表

    void glCallLists(GLSizes num,GLenum type,GLvoid * lists)

//依据存储类型为type的数组lists中的整数值执行num个显示列表。当前偏移量被叠加到lists中的每个证书上,这样就得到了所要执行的显示列表的ID

void glListBase(GLuint offset)  //设置glCallLists()使用的偏移量,默认为0

GLuint glGenLists(GLsizei n)  //返回可用于新显示列表的n个连续整数标示符中的第一个。

显示列表与文本

    若能为每一个字符使用一个显示列表,则文本就能高效的得到绘制。若决定用GLUT的10磅大小的罗马位图字体。我们需要256个显示列表。

首先获取256个连续可用的ID:

base=glGenLists(256);

接着为每个字体使用一个显示列表:

for(i=0;i<256;i++)

{

glNewList(base+i,GL_COMPILE);

glutBitMapCharacter(GLUT_BITMAP_TIMES_ROMAN_10,i);

glEndList();

}

然后设置基数列表

glListBase(base);

如想绘制一个字符串

char* text;

glCallLists((GLint)strlen(text),GL_UNSIGNED_BYTE,text);

显示列表和对象

    显示列表为用户提供了一种比立即模式更符合面向对象的思想的程序构建方式。显示列表使得新颜色可以与几何实体绑定在一起。显示类表还可以在显示列表中执行其他的显示列表。例如,如要创建一个人物,我们可以把,脸,眼睛,鼻子,嘴巴分开绘制。

glNewList(FACE,GL_COMPILE);

glCallList(EYE);

glCallList(EAR);

glCallList(MOUTH);

glCallList(NOSE);

glEndList();

    

时间: 2024-07-31 15:33:50

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

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