ARToolkit手札之用手遮住标识以切换模型

本文介绍了如何在ARToolkit中实现用手遮住标识卡后切换模型的功能。通过利用C语言的时间函数,如time_t time()和clock_t clock(),在手遮挡和撤回的时间差中实现模型切换。代码示例展示了在simpleTest.c基础上,如何通过标志量的变化,利用OpenGL绘制不同模型,从而实现切换2个或4个模型的效果。

       如果想实现用手遮住标识卡,将手撤回后,就可以切换另外一个模型的功能,那么应该怎么做呢?可以利用手遮住标识再撤回的这段时间来实现该功能。查阅资料得到#include<time.h>是C/C++中的日期和时间头文件,用于需要时间方面的函数,其中从系统时钟获取时间方式有2种方式。

①time_t time(time_t *timer);

函数功能:得到机器的日历时间或者设置日历时间 
函数返回:机器日历时间 
参数说明:timer=NULL时得到机器日历时间,timer=时间数值时,用于设置日历时间,time_t是一个long int类型 

②clock_t clock(void);

返回从“开启这个程序进程”到“程序中调用clock()函数时之间的CPU时钟计时单元(clock tick)数(挂钟时间),返回单位是毫秒,clock_t是一个long int类型


图1  遮盖标识再撤回

下面就来看一下代码怎么实现。(我是在在simpleTest.c的基础上修改的)

(1)切换2个模型

思路:可以定义一个函数,使标志量在0、1这2种状态之间变换,根据标志量的值用opengl绘制图形。

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

#include<time.h>//时间函数
#define State(n) ((n)=!(n))//用来改变n的值,使n在0和1之间变换(只有2中状态的时候可以这样用)

然后在static void   draw( void )函数部分加上以下代码。

static void draw( void )
{
	…………
	…………
	…………
	static int flag=0;//初始状态为0(注意:一定要加上static,否则只显示1个模型或显示0个模型)
	static time_t dwLast=0;//时间值time_t为长整型(long int)的别名,要给dwLast赋初值,否则会报错
	…………
	…………
	…………
	…………
	…………
	…………
	//glTranslatef( 0.0, 0.0, 25.0 );
        //glutSolidCube(50.0);

	//clock()表示从程序启动到当前时刻所经历的CPU时钟周期数。
	if(clock()-dwLast>100)
		State(flag);
	if(flag==0)
		glutSolidSphere(50,150,150);//flag=0,绘制球体
	else 
		glutSolidCube(50.0);//flag=1,绘制正方体
	
        glDisable( GL_LIGHTING );

        glDisable( GL_DEPTH_TEST );
	
        dwLast=clock();
}
运行结果如图2所示。


图2  切换2个模型

(2)切换4个模型
思路:用求余函数,使标志量在0、1、2、3这4种状态之间变换,根据标志量的值用opengl绘制图形。
先在声明部分加上下面的代码。

#include<time.h>//时间函数
然后在static void   draw( void )函数部分加上以下代码。
static void draw( void )
{
	…………
	…………
	…………
	static int flag=-1;//初始状态为-1(注意:一定要加上static,否则只显示1个模型或显示0个模型)
	static time_t dwLast=0;//时间值time_t为长整型(long int)的别名,要给dwLast赋初值,否则会报错

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

	//clock()表示从程序启动到当前时刻所经历的CPU时钟周期数。
	if(clock()-dwLast>100)		
	{	++flag;
		flag=flag%4;
	}
	if(flag==0)
	{glutSolidSphere(50,150,150);}//flag=0,绘制球体
	else if(flag==1)
	{glutSolidCube(50.0);}//flag=1,绘制正方体
	else if(flag==2)
	{glutSolidCone(25,100,20,24);}//flag=2,绘制圆锥
	else if(flag==3)
	{glutSolidTorus(10,40,24,24);}//flag=3,绘制圆环
	
	glDisable( GL_LIGHTING );

        glDisable( GL_DEPTH_TEST );
	
	dwLast=clock();
}
运行结果如图3所示。


图3 切换4个模型
【补充】如果想切换多个模型,可以通过改变flag的值来实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值