zoukankan      html  css  js  c++  java
  • 使用IntelRealScene设备结合Cocos引擎实现体感游戏开发

    英特尔开发人员专区原文地址

    Cocos游戏开发引擎对于广大开发者来说都比较熟悉,Intel RealScene是什么呢,简单理解是一种特殊的摄像头,可以捕捉用户的手势,面部表情等,进而实现AR,VR的特殊应用,本案例通过摄像头结合Cocos引擎实现一款跑酷游戏,游戏截图如下:

    07游戏主界面.png 

    图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.1 Win7以上64位操作系统

             4.2 使用了Intel F200摄像头设备

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

             4.4 安装vs2013

    5.开发核心步骤

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

       1创建cocos项目.png

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

    02配置属性.png 

    然后找到添加属性按钮,如下图:

    03添加现有属性.png 

    选择C:Program Files (x86)IntelRSSDKprops

    选择任意VS2010-13.Integration.MD.props 或者 VS2010-13.Integration.MT.props,

    如下图:

    04选择属性配置文件.png 

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

    05检查属性是否配置成功.png 

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

    在库目录增加一行只想RSSDKsamplecommonlibx64v140

    06解决编译错误.png 

    然后编译项目,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::thread t([&](){

    printf("init realsence ");

    PXCSession* session = PXCSession_Create();

    if (session)

    {

    PXCSession::ImplVersion version = session->QueryVersion();

    CCLOG("SDK Version is %d.%d ", version.major, version.minor);

    session->Release();

    }

    //// ///////////初始化rs模块

    PXCSenseManager* senseManager = PXCSenseManager::CreateInstance();

    if (senseManager)

    {

    CCLOG("intel PXCSenseManager ok");

    senseManager->EnableFace();//开启脸部识别模块 

    CCLOG("intel realsence EnableFace");

    if (senseManager->Init() == PXC_STATUS_NO_ERROR)

    {

    CCLOG("intel senseManager->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();

    bool quit = false;

    while (!quit)

    {

    // //获取跟踪的坐标

    faceData->Update();

    int faceNum = faceData->QueryNumberOfDetectedFaces();

    if (faceNum > 0)

    {

    PXCFaceData::Face *trackedFace = 

    faceData->QueryFaceByIndex(0);

    PXCFaceData::DetectionData* detectionData = 

    trackedFace->QueryDetection();

    PXCRectI32 rectangle;

    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("intel realsence error2");

    }

    senseManager->Release();

    }

    else{

    CCLOG("intel realsence error1");

    }

    });

    t.detach();

    }

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

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

    void Game::update(float t)

    {

    //每帧保存一个点

    if (allPoint.size() < 60)

    {

    MyPoint * newp = new MyPoint(x, y, w, h);

    newp->autorelease();

    allPoint.pushBack(newp);

    }

    else

    {

    MyPoint * newp = new MyPoint(x, y, w, h);

    newp->autorelease();

    allPoint.eraseObject(allPoint.front());

    allPoint.pushBack(newp);

      int farx = (allPoint.back()->x - allPoint.front()->x);

    std::string str = 

    StringUtils::format("%d %d %d %d  %d", x, y, w, h, farx);

    CCLOG("%s", str.c_str());

    if (farx >30 && farx<200)

    {

    if (this->_dir == Stop)

    {

    this->_dir = Up;

     allPoint.clear();

    }

    }

    }

      。。。。。。

    }

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

    英特尔开发人员专区原文地址

  • 相关阅读:
    Pandas 基础(8)
    Pandas 基础(7)
    Pandas 基础(6)
    Pandas 基础(5)
    Pandas 基础(4)
    python matplotlib 图表局部放大
    python 带小数点时间格式化
    emacs elpy代码补全功能
    spacemacs 初始安装报错
    视频加载logo 2
  • 原文地址:https://www.cnblogs.com/IDZPRC/p/5026668.html
Copyright © 2011-2022 走看看