跳转到主要内容

使用英特尔RealSense设备结合Cocos引擎实现体感游戏开发

editor 提交于

<br>近日举办的主题为"发车咯!有一些技巧只有老司机知道!"CVP系列开发者的沙龙上,Intel大使沈大海为大家带来了"使用Intel RealSense技术和Cocos引擎开发AR游戏"的精彩分享。</br>

<center><img src="http://intel.eetrend.com/files/2016-07/wen_zhang_/100002192-6728-1.jpg&…; alt="" width="600"></center>

<br>在演讲开始前,开发者们在现场亲身体验了沈老师带来的AR游戏。</br>

<center><img src="http://intel.eetrend.com/files/2016-07/wen_zhang_/100002192-6729-2.jpg&…; alt="" width="600"></center>

<br>下面是整理的部分演讲实录。</br>

Cocos游戏开发引擎对于广大开发者来说都比较熟悉,Intel RealSense是什么呢,简单理解是一种特殊的摄像头,可以捕捉用户的手势,面部表情等,进而实现AR、VR的特殊应用。

<center><img src="http://intel.eetrend.com/files/2016-07/wen_zhang_/100002192-6739-146958…; alt="" width="600"></center>

<br>本案例介绍了如何通过摄像头结合Cocos引擎实现一款跑酷游戏:</br>

<center><img src="http://intel.eetrend.com/files/2016-07/wen_zhang_/100002192-6730-4.png&…; alt="" width="600"></center>

<center><i>图1- Intel RealSense设备F200</i></center>

<br><strong>1、游戏玩法:</strong></br>

1.1玩家面向摄像头坐好

1.2.当游戏主角前方有障碍物或陷阱时候迅速移动头部向左,游戏主角会跳起

1.3. 通过头像识别和玩家的移动来躲避陷阱

游戏截图如下:

<center><img src="http://intel.eetrend.com/files/2016-07/wen_zhang_/100002192-6731-5.png&…; alt="" width="600"></center>

<br><strong>2、项目运行工程网盘地址:</strong></br>

链接: http://pan.baidu.com/s/1ntB0kwL(密码: nzrd)

<strong>3、项目源码网盘地址:</strong>

链接: http://pan.baidu.com/s/1qWj9Iws(密码: buj6)

<strong>4、开发和运行环境要求:</strong>

4.1 Win7以上64位操作系统

4.2 使用了Intel F200摄像头设备

4.3 正确安装F200驱动程序(下载在)

4.4 安装vs2013

<strong>5、开发核心步骤</strong>

5.1 登录www.cocos.com下载最新版的cocos引擎源码,然后安装,并创建一个新的Cocos工程(此处略过10000字,详细方法可以登录cvp.cocos.com),并使用vs打开。

<center><img src="http://intel.eetrend.com/files/2016-07/wen_zhang_/100002192-6732-6.png&…; alt="" width="600"></center>

<br>5.2. 重要,若要cocos支持RealSense设备需要加载库,可以通过属性表一次性完成该操作,在VS中找到【视图】【其他窗口】【属性管理器】,如下图:</br>

<center><img src="http://intel.eetrend.com/files/2016-07/wen_zhang_/100002192-6733-7.png&…; alt="" width="600"></center>

<br>然后找到添加属性按钮,如下图:</br>

<center><img src="http://intel.eetrend.com/files/2016-07/wen_zhang_/100002192-6734-8.png&…; alt="" width="600"></center>

<br>选择C:\Program Files (x86)\Intel\RSSDK\props</br>

选择任意VS2010-13.Integration.MD.props 或者 VS2010-13.Integration.MT.props,如下图:

<center><img src="http://intel.eetrend.com/files/2016-07/wen_zhang_/100002192-6735-9.png&…; alt="" width="600"></center>

<br>在项目名上面右键,查看项目属性,检查是否加载成功,如下图:</br>

<center><img src="http://intel.eetrend.com/files/2016-07/wen_zhang_/100002192-6736-10.png…; alt="" width="600"></center>

<br>我们看到包含目录和库目录中已经有了关于RSSDK的内容,说明属性文件生效,但是这时候编译工程会出现找不到lib库的错误,解决方法如下:</br>

在库目录增加一行只想RSSDK\sample\common\lib\x64\v140

<center><img src="http://intel.eetrend.com/files/2016-07/wen_zhang_/100002192-6737-11.png…; alt="" width="600"></center>

<br>然后编译项目,ok。</br>

<strong>6、核心编码</strong>

6.1 在AppDelegate中启动摄像头并在独立线程中更新数据。

01 #include "CCStdC.h"
02 #include #include #include #include #include #include #include

引入以上库文件,在构造函数启动线程

01 AppDelegate::AppDelegate() {
02 std::thread t([&](){
03 printf("init realsence\n");
04 PXCSession* session = PXCSession_Create();
05 if (session)
06 {
07 PXCSession::ImplVersion version = session->QueryVersion();
08 CCLOG("SDK Version is %d.%d\n", version.major, version.minor);
09 session->Release();
10 }
11 ///////////////初始化rs模块
12 PXCSenseManager* senseManager = PXCSenseManager::CreateInstance();
13 if (senseManager)
14 {
15 CCLOG("intel PXCSenseManager ok");
16 senseManager->EnableFace();//开启脸部识别模块
17 CCLOG("intel realsence EnableFace");
18 if (senseManager->Init() == PXC_STATUS_NO_ERROR)
19 {
20 CCLOG("intel senseManager->Init() ok");
21 // 获取faceModule
22 PXCFaceModule* faceModule = senseManager->QueryFace();
23 PXCFaceData* faceData = faceModule->CreateOutput();
24 PXCFaceConfiguration* faceConfiguration =
25 faceModule->CreateActiveConfiguration();
26 ////设置3d跟踪模式
27 faceConfiguration->SetTrackingMode(
28 PXCFaceConfiguration::TrackingModeType::FACE_MODE_COLOR_PLUS_DEPTH);
29 faceConfiguration->detection.isEnabled = true;
30 faceConfiguration->ApplyChanges();
31 bool quit = false;
32 while (!quit)
33 {
34 ////获取跟踪的坐标
35 faceData->Update();
36 int faceNum = faceData->QueryNumberOfDetectedFaces();
37 if (faceNum > 0)
38 {
39 PXCFaceData::Face *trackedFace =
40 faceData->QueryFaceByIndex(0);
41 PXCFaceData::DetectionData* detectionData =
42 trackedFace->QueryDetection();
43 PXCRectI32 rectangle;
44 detectionData->QueryBoundingRect(&rectangle);
45 Game::x = rectangle.x;
46 Game::y = rectangle.y;
47 Game::w = rectangle.w;
48 Game::h = rectangle.h;
49 }
50 senseManager->ReleaseFrame();
51 }
52 faceData->Release();
53 faceConfiguration->Release();
54 senseManager->Close();
55 }
56 else{
57 CCLOG("intel realsence error2");
58 }
59 senseManager->Release();
60 }
61 else{
62 CCLOG("intel realsence error1");
63 }
64 });
65 t.detach();
66 }

以上代码,会时时更新数据,捕获人脸的x,y,w,h在屏幕的坐标,缺省是640X360的范围,可以通过Log查看数据的变化。

<center><img src="http://intel.eetrend.com/files/2016-07/wen_zhang_/100002192-6738-12.png…; alt="" width="600"></center>

<br>6.2 在GameScene中启动计划任务scheduleUpdate,并在每一帧处理。</br>

01 void Game::update(float t)
02 {
03 //每帧保存一个点
04 if (allPoint.size() < 60)
05 {
06 MyPoint * newp = new MyPoint(x, y, w, h);
07 newp->autorelease();
08 allPoint.pushBack(newp);
09 }
10 else
11 {
12 MyPoint * newp = new MyPoint(x, y, w, h);
13 newp->autorelease();
14 allPoint.eraseObject(allPoint.front());
15 allPoint.pushBack(newp);
16 int farx = (allPoint.back()->x - allPoint.front()->x);
17 std::string str =
18 StringUtils::format("%d %d %d %d %d", x, y, w, h, farx);
19 CCLOG("%s", str.c_str());
20 if (farx >30 && farx_dir == Stop)
21 {
22 this->_dir = Up;
23 allPoint.clear();
24 }
25 }
26 }
27 ……
28 }

这里用60个点来记录每一帧人脸坐标的变化,通过计算是否有超过40像素的移动来确定玩家是否跳起(这里很偷懒,可以使用的人脸的点可以达到78个点)

希望今天关于英特尔RealSense的分享能帮助到大家,谢谢!

文章来源:<a href="http://www.cocoachina.com/industry/20160727/17205.html?utm_source=tuico…; CocoaChina