标题:使用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)\Intel\RSSDK\props
选择任意VS2010-13.Integration.MD.props或者VS2010-13.Integration.MT.props,
如下图:
在项目名上面右键,查看项目属性,检查是否加载成功,如下图:
我们看到包含目录和库目录中已经有了关于RSSDK的内容,说明属性文件生效,但是这时候编译工程会出现找不到lib库的错误,解决方法如下:
在库目录增加一行只想RSSDK\sample\common\lib\x64\v140
然后编译项目,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("initrealsence\n");
PXCSession*session=PXCSession_Create();
if(session)
{
PXCSession::ImplVersionversion=session->QueryVersion();
CCLOG("SDKVersionis%d.%d\n",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个点)
文章结束了,是不是还没看明白,下次再说。
原文链接:https://www.f2er.com/cocos2dx/340986.html