基于OGRE与Kinect的体感游戏平台的研究

2014-07-18 18:45李广松
电脑知识与技术 2014年13期

摘要:提出将Kinect体感技术嵌入到游戏引擎OGRE中,首先在OGRE基础上搭建游戏场景,将Kinect体感外设与游戏角色绑定, 引入MyGUI界面模块,使用Lua作为交互脚本,搭建一个面向前沿的具有可拓展性的体感游戏平台。

关键词:Kinect;OGRE;MyGUI;Lua;体感游戏

中图分类号:TP311.1 文献标识码:A 文章编号:1009-3044(2014)13-2979-05

Study of Somatosensory Game Platform Based on Kinect and OGRE

LI Guang-song

(Department of Information Engineering,Guangdong Polytechnic, Foshan 528041,China)

Abstract:The paper puts forward the idea that using the Kinect somatosensory technology to embed into the game engine in OGRE. Firstly, it establishes the game scene based on OGRE, and binds the Kinect somatosensory peripheral and game role, introduces the MyGUI interface module, uses Lua as the interactive scripts. So it builds sense game platform which is a facing front with extended body.

Key words:Kinect;OGRE;MyGUI;Lua;somatosensory game

图形引擎将底层的DirectX和OpenGL进行封装,对外提供API函数接口,通过API函数可以嵌入第三方库,从而形成游戏开发平台。OGRE[1-3]是一个三维图形渲染引擎,支持插件体系结构,具有可扩展的程序框架,可以在引擎外不编译的状态下扩展功能。Kinect是一种3D体感外设,可以用来进行体感游戏人物的动作捕捉与绑定。MyGUI[4-5]是一款第三方的开源GUI库,相比原来的CEGUI,更高效,轻便,灵活,支持换肤功能,有完整的界面编辑器,现移植支持OGRE引擎。Lua[6-7]是一个面向过程的脚本语言,它的核心代码很少,通常是由用户来实现附加的特征(比如:类)。Lua是一个简洁的、高度可扩展的可编译语言,也能很好的和C/C++进行交互,因此,它也是编写游戏脚本的一个很普遍选择。

本文提出以OGRE图形引擎为底层进行体感游戏平台的设计,在人物角色控制中结合使用Kinect体感技术、在界面设计模块中结合使用MyGUI、在逻辑的交互通信阶段结合使用Lua脚本,设计出了一种OGRE+Kinect+MyGUI+Lua系统架构,并进行了实验测试,游戏平台运行流畅,得到预期效果。

1 平台的架构设计

在网络游戏平台开发中,平台的架构设计决定了平台的可拓展性。体感游戏平台以OGRE图形引擎作为设计的底层,设计通信系统、人工智能、音响音效系统、输入子系统、渲染系统、资源管理系统、界面系统和物理系统。通信系统提供客户端网络通信接口并进行交互,客户端网络通信接口通过Raknet网络库与服务器网络通信接口进行连接,进行与服务器端的数据库模块和游戏逻辑模块交互。Kinect骨架追踪技术可以让Kinect感知人体15个关节点来生成一幅骨架系统,通过把这15个关节点和角色人物进行绑定,在和输入子系统、渲染系统和资源管理系统进行交互中能够做到流畅控制。在界面系统中嵌入MyGUI,避开了CEGUI的复杂性,对界面的设计简洁,而且可维护扩充性好,而且MyGUI可以和Lua脚本进行交互。Lua脚本以简明的语句完成与客户端网络通信接口、服务器网络通信接口、游戏逻辑模块、MyGUI界面模块和OGRE的通信系统的通信。

本文把Kinect、Lua和MyGUI集成到OGRE引擎架构中,形成体感游戏平台,如图1所示,其中虚线框内为OGRE图形引擎,与OGRE引擎交互的都是第三方类库。

2 OGRE设计底层

2.1 OGRE简介

OGRE是一个开源图形渲染引擎,即:面向对象图形渲染引擎(Object-oriented Graphics Rendering Engine)。OGRE是由一个核心团队编写和维护,并依赖社区提供的支。将OGRE作为游戏引擎时需要和其他引擎或第三方类库结合使用,如:网络、脚本、界面等。

2.2 OGRE核心对象

1)根(Root)对象

Root对象是OGRE引擎的入口,具有唯一性,是用来创建OGRE引擎中所有的基础元素。Root对象在引擎启动时创建,在引擎结束时销毁,Root对象的生命周期是整个应用程序的生命周期。通过创建Root对象可以获取场景管理器(SceneManager)对象指针、渲染系统(RenderSystem)对象指针和资源管理器(Resource Managers)对象指针。

2)渲染系统(RenderSystem)对象

渲染系统(RenderSystem)对象是一个抽象(abstract)类,这个抽象类提供了引擎的API接口(OpenGL和Direct3D)。

mRoot→initialise(true, "PlatformRenderWindow");

RenderSystem *rs = mRoot→getRenderSystemByName("Direct3D9endprint

Rendering Subsystem");

mRoot→setRenderSystem(rs);

3)场景管理器(SceneManager)对象

场景管理器(SceneManager)是OGRE场景内容的组织者、创建者和管理者。场景中挂人的每一个实体都是一个节点,每一个实体节点都必须挂靠在根节点上面,然后每一个节点再不断扩充,形成场景中节点的树状结构。利用SceneManager设置场景,获取场景状态,监听场景中的对象,动态修改场景内容。

为处理Terrain场景,选择创建“ST_EXTERIOR_CLOSE”类型的SceneManager,通过执行Root::createSceneManager();完成的,执行完成后返回TerrainSceneManager指针,同时创建了一个HeightmapTerrainPageSource对象。

2.3 游戏平台执行流程

在游戏平台中,首先创建Root对象,利用setupResources()函数加载资源路径,配置渲染系统,选择场景管理器类型,创建并初始化摄像机,创建平台窗口中的视口,创建平台中的资源,嵌入第三方类库,该文的体感游戏平台使用了Kinect、Lua和MyGUI,如图2所示,最后创建帧监听器,启动平台的渲染循环。

3 Kinect体感外设绑定

3.1 Kinect简介

图3 Kinect

Kinect是微软在2010年6月14日对XBOX360体感周边外设正式发布的名字。它是一种3D体感摄影机(开发代号“Project Natal”)。Kinect内置有彩色摄像头、红外深度感应头、阵列式麦克风、感应倾斜驱动马达,如图3所示,可获取彩色影像、3D深度影像、骨骼信息和声音讯号。

3.2 Kinect骨骼追踪

自然用户界面(NUI)骨骼API提供人物距离Kinect传感器的位置信息,包括详细的人物位置和方向信息。这些信息在应用程序中表现为一组点,成为骨骼位置,如图4。骨骼位置说明了人物的当前位置,应用程序可以使用骨骼信息来初始化自然用户界面(NUI)和从而跟踪骨骼。

图4 人体骨骼关键点

如果应用程序在初始化时使用骨骼跟踪,骨骼跟踪引擎就会启用,获取和处理深度数据,判断是否有骨骼出现在帧数据中。应用程序通过重力和水平面来检索骨骼帧。返回的骨骼帧,包括深度数据和骨骼图像数据。在平台应用程序中,对图4中的15个关键骨骼节点进行了编号,头部为0, 颈部为1, 躯干为2, 左肩膀为3, 左手肘为4, 左手为5,右肩膀为6,右手肘为7,右手腕为8,左臀为9,左膝盖为10,左脚跟为11,右臀为12,右膝盖为13,右脚跟为14。

3.3 Kinect的嵌入与绑定

在使用Kinect时,首先要安装KinectSDK和驱动,然后配置OpenNI[8],包括项目中的VC++目录的包含目录和链接器中的附加库目录,以及输入条目下的附加依赖项(OpenNI2.lib和Glut32.lib)。

Kinect嵌入OGRE的步骤:

1)包含头文件include OpenNI.h,使用openni命名空间,using namespace openni;;

2)初始化OpenNI环境,OpenNI::initialize();;

3)创建与打开设备,Device device; device.open();;

4)创建数据流对象,VideoStream depth;, 通过depth.start()和depth.stop()函数来控制数据流的读取;

5)绑定与运行;

6)运行完毕后关闭与销毁,depth.destroy();device.close();OpenNI::shutdown();。

Kinect与人物绑定,需要使用OGRE里面Bone(骨骼)与Kinect里面的Bone(骨骼)进行绑定。Kinect获取到的位置信息(position)与方向信息(orientation)是世界坐标,是相对于kinect设备的坐标,与ogre的坐标系统相符。

WoCoo =mSceneMgr→getRootSceneNode()→createChildSceneNode();

Ogre::SceneNode* SN;

Ogre::Bone* pBone;

SN→_setDerivedPosition(WoCoo→getPosition()+WoCoo→_getDerivedScale()* pBone→convertLocalToWorldPosition(Ogre::Vector3());

SN→setOrientation(pBone→convertLocalToWorldOrientation(Ogre::Quaternion());

对于kinect的方向信息(orientation),kinect对其进行了坐标轴的旋转,规定骨骼的方向为Y轴正方向,人体面向为Z轴正方向,X轴随之旋转,Kinect中获取的orientation可以分为两种:absoluteOrientation和hierarchyOrientation,absoluteOrientation是世界坐标系下的相当于Ogre中_setDerivedOrientation, hierarchyOrientation是相对父节点的坐标系,相当于Ogre中setOrientation。

4 MyGUI设计界面

4.1 MyGUI简介

MyGUI是一款基于OGRE引擎的3D界面开发引擎,能够让用户更加简单、快捷地开发3D游戏和应用。

4.2 OGRE中使用MyGUI

把MyGUI嵌入到OGRE中需要一下8个步骤:

1)把MyGUISdk中的MyGUIEngine_d.dll文件拷贝到OgreSDK安装目录下;

2) 在OgreSDK中的resources_d.cfg里添加MyGUI里面的MyGUI_Media访问路径;

3) 在平台工程的“包含目录”里添加“MyGUIEngine\include”;

4)在平台工程的“附加库目录”里添加“lib\Debug”;

5) 在平台工程的“附加依赖项”里添加“MyGUIEngine_d.lib; MyGUI.OgrePlatform_d.lib”;

7)添加头文件#include "MyGUI.h";#include "MyGUI_OgrePlatform.h";;

8) 在在平台工程的createScene()函数中添加代码:

MyGUI::Gui* mGUI;

MyGUI::OgrePlatform* mPlatform=new MyGUI::OgrePlatform();

mPlatform→initialise(mWindow, mSceneManager);

mGUI=new MyGUI::Gui();mGUI→initialise();

5 Lua脚本

5.1 Lua简介

Lua是一种嵌入式的游戏脚本语言,Lua的功能可以通过外部库进行补充,具有良好的可拓展性。

5.2 Lua的嵌入

把Lua嵌入到OGRE中,首先安装tolua++软件包,通过配置tolua++,用Lua脚本来编写使用C++语言库的脚本文件.

Lua嵌入过程:

1)运行tolua++.exe文件;

2)包含tolua头文件,#include

3)嵌入tolua++.lib静态库;

4)利用tolua++生成.pkg文件platformlib.pkg;

5)将 4)中的cpp文件生成对应的C/C++源文件。

>tolua++ -n platformlib -o platformlib.cpp platformlib.pkg

6)将platformlib.cpp加入到OGRE工程中;

7)使用Lua,

lua_State* S=lua_open();

luaL_openlibs();

tolua_platformlib_open(S);

luaL_dofile(S, “platformlib.lua”);

lua_close(S);

6 OGRE+Kinect+MyGUI+Lua设计案例

针对OGRE+Kinect+MyGUI+Lua的框架,设计了体感游戏案例“镭射守备”,并进行了测试,图5是“镭射守备”实现案例截图。实验证明,该框架能够实现OGRE与Kinect的人物绑定,MyGUI模块嵌入以及Lua、MyGUI、OGRE之间的相互通信,在测试过程中,运行流畅,得到了预期效果。

(a) (b)

图5 “镭射守备”实现案例

7 结束语

使用本文设计的框架搭建的体感游戏平台能够有效地将前沿体感技术和开源引擎相结合。该文在OGRE图形引擎设计和运行原理的基础上,提出了一种OGRE+Kinect+MyGUI+lua的游戏平台设计框架,该平台充分利用OGRE可拓展性特点,进行了第三方库的嵌入与应用,平台的运行流程,得到了设计的效果。

参考文献:

[1] OGRE官网[EB/OL].www.ogre3d.org.

[2] OGRE WIKI[EB/OL].http://www.ogre3d.org/tikiwiki/tiki-index.php.

[3] 李广松,陈荣征.基于OGRE的网络游戏界面模块的设计与实现[J].电脑知识与技术,2009,5(33): 9297-9299.

[4] MyGUI官网[EB/OL].http://mygui.info.

[5] MyGUI WIKI[EB/OL].http://www.ogre3d.org/tikiwiki/MyGUI.

[6] Lua官网[EB/OL].http://www.lua.org.

[7] Lua WIKI[EB/OL].http://wikilua.wikia.com/wiki/Lua_Wiki.

[8] OpenNI官网[EB/OL].http://www.openni.org/.

4 MyGUI设计界面

4.1 MyGUI简介

MyGUI是一款基于OGRE引擎的3D界面开发引擎,能够让用户更加简单、快捷地开发3D游戏和应用。

4.2 OGRE中使用MyGUI

把MyGUI嵌入到OGRE中需要一下8个步骤:

1)把MyGUISdk中的MyGUIEngine_d.dll文件拷贝到OgreSDK安装目录下;

2) 在OgreSDK中的resources_d.cfg里添加MyGUI里面的MyGUI_Media访问路径;

3) 在平台工程的“包含目录”里添加“MyGUIEngine\include”;

4)在平台工程的“附加库目录”里添加“lib\Debug”;

5) 在平台工程的“附加依赖项”里添加“MyGUIEngine_d.lib; MyGUI.OgrePlatform_d.lib”;

7)添加头文件#include "MyGUI.h";#include "MyGUI_OgrePlatform.h";;

8) 在在平台工程的createScene()函数中添加代码:

MyGUI::Gui* mGUI;

MyGUI::OgrePlatform* mPlatform=new MyGUI::OgrePlatform();

mPlatform→initialise(mWindow, mSceneManager);

mGUI=new MyGUI::Gui();mGUI→initialise();

5 Lua脚本

5.1 Lua简介

Lua是一种嵌入式的游戏脚本语言,Lua的功能可以通过外部库进行补充,具有良好的可拓展性。

5.2 Lua的嵌入

把Lua嵌入到OGRE中,首先安装tolua++软件包,通过配置tolua++,用Lua脚本来编写使用C++语言库的脚本文件.

Lua嵌入过程:

1)运行tolua++.exe文件;

2)包含tolua头文件,#include

3)嵌入tolua++.lib静态库;

4)利用tolua++生成.pkg文件platformlib.pkg;

5)将 4)中的cpp文件生成对应的C/C++源文件。

>tolua++ -n platformlib -o platformlib.cpp platformlib.pkg

6)将platformlib.cpp加入到OGRE工程中;

7)使用Lua,

lua_State* S=lua_open();

luaL_openlibs();

tolua_platformlib_open(S);

luaL_dofile(S, “platformlib.lua”);

lua_close(S);

6 OGRE+Kinect+MyGUI+Lua设计案例

针对OGRE+Kinect+MyGUI+Lua的框架,设计了体感游戏案例“镭射守备”,并进行了测试,图5是“镭射守备”实现案例截图。实验证明,该框架能够实现OGRE与Kinect的人物绑定,MyGUI模块嵌入以及Lua、MyGUI、OGRE之间的相互通信,在测试过程中,运行流畅,得到了预期效果。

(a) (b)

图5 “镭射守备”实现案例

7 结束语

使用本文设计的框架搭建的体感游戏平台能够有效地将前沿体感技术和开源引擎相结合。该文在OGRE图形引擎设计和运行原理的基础上,提出了一种OGRE+Kinect+MyGUI+lua的游戏平台设计框架,该平台充分利用OGRE可拓展性特点,进行了第三方库的嵌入与应用,平台的运行流程,得到了设计的效果。

参考文献:

[1] OGRE官网[EB/OL].www.ogre3d.org.

[2] OGRE WIKI[EB/OL].http://www.ogre3d.org/tikiwiki/tiki-index.php.

[3] 李广松,陈荣征.基于OGRE的网络游戏界面模块的设计与实现[J].电脑知识与技术,2009,5(33): 9297-9299.

[4] MyGUI官网[EB/OL].http://mygui.info.

[5] MyGUI WIKI[EB/OL].http://www.ogre3d.org/tikiwiki/MyGUI.

[6] Lua官网[EB/OL].http://www.lua.org.

[7] Lua WIKI[EB/OL].http://wikilua.wikia.com/wiki/Lua_Wiki.

[8] OpenNI官网[EB/OL].http://www.openni.org/.

4 MyGUI设计界面

4.1 MyGUI简介

MyGUI是一款基于OGRE引擎的3D界面开发引擎,能够让用户更加简单、快捷地开发3D游戏和应用。

4.2 OGRE中使用MyGUI

把MyGUI嵌入到OGRE中需要一下8个步骤:

1)把MyGUISdk中的MyGUIEngine_d.dll文件拷贝到OgreSDK安装目录下;

2) 在OgreSDK中的resources_d.cfg里添加MyGUI里面的MyGUI_Media访问路径;

3) 在平台工程的“包含目录”里添加“MyGUIEngine\include”;

4)在平台工程的“附加库目录”里添加“lib\Debug”;

5) 在平台工程的“附加依赖项”里添加“MyGUIEngine_d.lib; MyGUI.OgrePlatform_d.lib”;

7)添加头文件#include "MyGUI.h";#include "MyGUI_OgrePlatform.h";;

8) 在在平台工程的createScene()函数中添加代码:

MyGUI::Gui* mGUI;

MyGUI::OgrePlatform* mPlatform=new MyGUI::OgrePlatform();

mPlatform→initialise(mWindow, mSceneManager);

mGUI=new MyGUI::Gui();mGUI→initialise();

5 Lua脚本

5.1 Lua简介

Lua是一种嵌入式的游戏脚本语言,Lua的功能可以通过外部库进行补充,具有良好的可拓展性。

5.2 Lua的嵌入

把Lua嵌入到OGRE中,首先安装tolua++软件包,通过配置tolua++,用Lua脚本来编写使用C++语言库的脚本文件.

Lua嵌入过程:

1)运行tolua++.exe文件;

2)包含tolua头文件,#include

3)嵌入tolua++.lib静态库;

4)利用tolua++生成.pkg文件platformlib.pkg;

5)将 4)中的cpp文件生成对应的C/C++源文件。

>tolua++ -n platformlib -o platformlib.cpp platformlib.pkg

6)将platformlib.cpp加入到OGRE工程中;

7)使用Lua,

lua_State* S=lua_open();

luaL_openlibs();

tolua_platformlib_open(S);

luaL_dofile(S, “platformlib.lua”);

lua_close(S);

6 OGRE+Kinect+MyGUI+Lua设计案例

针对OGRE+Kinect+MyGUI+Lua的框架,设计了体感游戏案例“镭射守备”,并进行了测试,图5是“镭射守备”实现案例截图。实验证明,该框架能够实现OGRE与Kinect的人物绑定,MyGUI模块嵌入以及Lua、MyGUI、OGRE之间的相互通信,在测试过程中,运行流畅,得到了预期效果。

(a) (b)

图5 “镭射守备”实现案例

7 结束语

使用本文设计的框架搭建的体感游戏平台能够有效地将前沿体感技术和开源引擎相结合。该文在OGRE图形引擎设计和运行原理的基础上,提出了一种OGRE+Kinect+MyGUI+lua的游戏平台设计框架,该平台充分利用OGRE可拓展性特点,进行了第三方库的嵌入与应用,平台的运行流程,得到了设计的效果。

参考文献:

[1] OGRE官网[EB/OL].www.ogre3d.org.

[2] OGRE WIKI[EB/OL].http://www.ogre3d.org/tikiwiki/tiki-index.php.

[3] 李广松,陈荣征.基于OGRE的网络游戏界面模块的设计与实现[J].电脑知识与技术,2009,5(33): 9297-9299.

[4] MyGUI官网[EB/OL].http://mygui.info.

[5] MyGUI WIKI[EB/OL].http://www.ogre3d.org/tikiwiki/MyGUI.

[6] Lua官网[EB/OL].http://www.lua.org.

[7] Lua WIKI[EB/OL].http://wikilua.wikia.com/wiki/Lua_Wiki.

[8] OpenNI官网[EB/OL].http://www.openni.org/.