使用IntelRealScene设备结合Cocos引擎实现体感游戏开发
标题:使用IntelRealScene设备结合Cocos引擎实现体感游戏开发 内容: Cocos游戏开发引擎对于广大开发者来说都比较熟悉,IntelRealScene是什么呢,简单理解是一种特殊的摄像头,可以捕捉用户的手势,面部表情等,进而实现AR,VR的特殊应用,本案例通过摄像头结合Cocos引擎实现一款跑酷游戏,游戏截图如下:
图1-cocos+IntelRealScene实现的跑酷游戏 1.游戏玩法: 1.在摄像头前坐好 2.当游戏主角前方有障碍物或陷阱时候迅速移动头部向左,游戏主角会跳起 3.恢复坐好状态 (目前我的最好成绩是24秒!!!) 2.项目运行工程网盘地址: 链接:http://pan.baidu.com/s/1ntB0kwL密码:nzrd 3.项目源码网盘地址: 链接:http://pan.baidu.com/s/1qWj9Iws密码:buj6 4.开发和运行环境要求: 4.1Win7以上64位操作系统 4.2使用了IntelF200摄像头设备 4.3正确安装F200驱动程序(下载在) 4.4安装vs2013 5.开发核心步骤 5.1登录www.cocos.com下载最新版的cocos引擎源码,然后安装,并创建一个新的Cocos工程(此处略过10000字,详细方法可以登录cvp.cocos.com),并使用vs打开。 5.2.重要,若要cocos支持RealScene设备需要加载库,可以通过属性表一次性完成该操作,在VS中找到【视图】【其他窗口】【属性管理器】,如下图: 然后找到添加属性按钮,如下图: 选择C:ProgramFiles(x86)IntelRSSDKprops 选择任意VS2010-13.Integration.MD.props或者VS2010-13.Integration.MT.props, 如下图: 在项目名上面右键,查看项目属性,检查是否加载成功,如下图: 我们看到包含目录和库目录中已经有了关于RSSDK的内容,说明属性文件生效,但是这时候编译工程会出现找不到lib库的错误,解决方法如下: 在库目录增加一行只想RSSDKsamplecommonlibx64v140 然后编译项目,ok。 6.核心编码 6.1在AppDelegate中启动摄像头并在独立线程中更新数据。 #include"CCStdC.h" #include<SDKDDKVer.h> #include<pxcsession.h> #include<stdio.h> #include<stdlib.h> #include<pxcsensemanager.h> #include<util_render.h> #include<pxcfaceconfiguration.h> 引入以上库文件,在构造函数启动线程 AppDelegate::AppDelegate(){ std::threadt([&](){ printf("initrealsencen"); PXCSession*session=PXCSession_Create(); if(session) { PXCSession::ImplVersionversion=session->QueryVersion(); CCLOG("SDKVersionis%d.%dn",version.major,version.minor); session->Release(); } ///////////////初始化rs模块 PXCSenseManager*senseManager=PXCSenseManager::CreateInstance(); if(senseManager) CCLOG("intelPXCSenseManagerok"); senseManager->EnableFace();//开启脸部识别模块 CCLOG("intelrealsenceEnableFace"); if(senseManager->Init()==PXC_STATUS_NO_ERROR) CCLOG("intelsenseManager->Init()ok"); //获取faceModule PXCFaceModule*faceModule=senseManager->QueryFace(); PXCFaceData*faceData=faceModule->CreateOutput(); PXCFaceConfiguration*faceConfiguration= faceModule->CreateActiveConfiguration(); ////设置3d跟踪模式 faceConfiguration->SetTrackingMode( PXCFaceConfiguration::TrackingModeType::FACE_MODE_COLOR_PLUS_DEPTH); faceConfiguration->detection.isEnabled=true; faceConfiguration->ApplyChanges(); boolquit=false; while(!quit) ////获取跟踪的坐标 faceData->Update(); intfaceNum=faceData->QueryNumberOfDetectedFaces(); if(faceNum>0) PXCFaceData::Face*trackedFace= faceData->QueryFaceByIndex(0); PXCFaceData::DetectionData*detectionData= trackedFace->QueryDetection(); PXCRectI32rectangle; detectionData->QueryBoundingRect(&rectangle); Game::x=rectangle.x; Game::y=rectangle.y; Game::w=rectangle.w; Game::h=rectangle.h; senseManager->ReleaseFrame(); faceData->Release(); faceConfiguration->Release(); senseManager->Close(); else{ CCLOG("intelrealsenceerror2"); senseManager->Release(); CCLOG("intelrealsenceerror1"); }); t.detach(); 以上代码,会时时更新数据,捕获人脸的x,y,w,h在屏幕的坐标,缺省是640X360的范围,可以通过Log查看数据的变化。 6.2在GameScene中启动计划任务scheduleUpdate,并在每一帧处理。 voidGame::update(floatt) { //每帧保存一个点 if(allPoint.size()<60) MyPoint*newp=newMyPoint(x,h); newp->autorelease(); allPoint.pushBack(newp); } else
allPoint.eraSEObject(allPoint.front()); intfarx=(allPoint.back()->x-allPoint.front()->x); std::stringstr= StringUtils::format("%d%d%d%d%d",x,h,farx); CCLOG("%s",str.c_str()); if(farx>30&&farx<200) if(this->_dir==Stop) this->_dir=Up; allPoint.clear(); 。。。。。。 } 这里用60个点来记录每一帧人脸坐标的变化,通过计算是否有超过40的移动来确定玩家是否跳起(这里很偷懒,可以使用的人脸的点可以达到78个点) 文章结束了,是不是还没看明白,下次再说。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |