ARToolkit手札之显示菜单(一)

        本文利用标识卡的旋转角度来控制菜单的输出状态(我是在例子simpleTest.c的基础框架上改写的)。OpenGL并没有直接提供显示文字的功能,并且OpenGL也没有自带专门的字库。因此,要显示文字,就必须依赖Windows操作系统所提供的功能了。

         最常见的方法就是,我们给出一个字符,给出一个显示列表编号,然后Windows操作系统把绘制这个字符的OpenGL命令装到指定的显示列表中,当需要绘制字符的时候,我们只需要调用这个显示列表即可。 

         假如我们要显示的文字是扩展的ASCII字符,则总共只有0~255这256种可能,因此可以预先把所有的字符分别装到对应的显示列表中,然后在需要时调用这些显示列表。

         Windows系统中,可以使用wglUseFontBitmaps()函数来批量的产生显示字符用的显示列表。

函数原型:

BOOL WINAPI wglUseFontBitmaps(HDC hdc,DWORD first,   DWORD count, DWORDlistBase );

函数有四个参数:

第一个参数是hdc,只要知道调用wglGetCurrentDC函数,就可以得到一个HDC(DC的句柄,API中的一个类似指针的数据类型)了。

第二个参数表示第一个要产生的字符,因为我们要产生0到255的字符的显示列表,所以这里填0。

第三个参数表示要产生字符的总个数,因为我们要产生0到255的字符的显示列表,总共有256个字符,所以这里填256。

第四个参数表示第一个字符所对应显示列表的编号。假如这里填1000,则第一个字符的绘制命令将被装到第1000号显示列表,第二个字符的绘制命令将被装到第1001号显示列表,依次类推。我们可以先用glGenLists申请256个连续的显示列表编号,然后把第一个显示列表编号填在这里。

【说明】因为wglUseFontBitmaps()是Windows系统特有的函数,所以在使用前需要加入头文件:#include <windows.h>。

        接下来我们来看一下具体代码:

void Print(const char *str)//输出文字
{
	static int isFirstCall=1;    
	static GLuint lists; 
	if(isFirstCall)// 如果是第一次调用,执行初始化
	{
		isFirstCall=0; //为每一个ASCII字符产生一个显示列表       
		lists=glGenLists(256);//申请256个连续的显示列表编号
		wglUseFontBitmaps(wglGetCurrentDC(),0,256,lists);//把每个字符的绘制命令都装到对应的显示列表中   
	}  

	//调用每个字符对应的显示列表,绘制每个字符
	for(;*str!='\0';++str)
		//glCallList(lists+(*str));
		glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,*str );//如果用上面的语句,则输出文字太小,所以用该语句来控制字体大小
}

根据标识卡的旋转角度,显示文字,代码如下:

int ShowMenu(char notices[][128],int n,double angle)//显示菜单
{
	int i,nSel=0;
	glTranslatef( 60.0, 0.0, 0.0 );
	nSel=(int)(angle/(90/(n-1)))%(n-1);//【当n=4的情况下】angle=[0,29]或90时,nSel=0;angle=[30,59]时,nSel=1;angle=[60,89]时,nSel=2;
	for(i=0;i<n;i++)
	{
		glColor3f((float)(i==0||nSel==i-1),(float)(i!=0),0.0f);//设置画刷颜色
		glRasterPos3f(50.0f,100.0f-i*30.0f,0.0f);//用于显示[字体]时设置字符的起始位置
		Print(notices[i]);
	}
	return nSel;
}

还要在声明部分加上下面的代码。

#include<string.h>
#include<math.h>

int ShowMenu(char notices[][128],int n,double angle);//显示菜单
void Print(const char *str);//输出文字

然后在static void mainLoop(void)函数里面加上如下代码:

/* main loop */
static void mainLoop(void)
{
    ARUint8         *dataPtr;
    ARMarkerInfo    *marker_info;
    int             marker_num;
    int             j, k;

    double angle=0;//添加
    int MenuIndex=0;//添加
    char notices[4][128]={{"Shape:"},{"Teapot"},{"Cube"},{"Sphere"}};//添加
    ……
    ……
    ……
   //显示菜单
   angle=atan(-marker_info->line[0][0]/marker_info->line[0][1])/3.1415926*180; //添加
   printf("%3.1f\n",angle); //添加
   glPushMatrix();//添加
   MenuIndex=ShowMenu(notices,4,angle); //添加
   glPopMatrix();//添加
   draw();

   argSwapBuffers();
}

最后,将static void draw(void)函数里面行代码注释掉。

//glTranslatef( 0.0, 0.0, 25.0 );
//glutSolidCube(50.0);

运行结果如下。

图1【当n=4的情况下】angle在[0,29]之间,nSel=0,菜单切换到”Teapot”


图2【当n=4的情况下】angle在[30,59]之间,nSel=1,菜单切换到”Cube”


图3【当n=4的情况下】angle在[60,89]之间,nSel=2,菜单切换到”Sphere”


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值