将OGRE渲染到MFC框架中的实现思路及问题

4 篇文章 0 订阅
3 篇文章 0 订阅

        最近我们团队参加一个软件大赛,命题为基于语音识别技术的3D智能导游员。在识别用户语音做出应答的同时驱动模型的口型,动作的匹配。在技术的选用方面优先选择了开源的OGRE作为3D渲染引擎,但经过权衡放弃了CEGUI、flash做的UI,最终决定将OGRE渲染到MFC框架中来实现本系统的功能。


        总体实现并不是非常困难,实现如下:

        

        1、利用OGRE将3D模型及场景渲染在view类中,初始化时手动加载OGRE需要的配置文件及资源。并在OnDraw中持续调用mWindow->update();在刷新画面时采用OnTimer来控制持续刷新,防止出现频闪。如果需要在view中加入控件则需要双缓冲技术来实现。


        2、UI层对话框采用整体透明,仅留下控件UI,首先生成位置正好覆盖单文档窗口,重写OnEraseBkgnd(CDC* pDC)函数,将背景色设为一种不常用颜色,再利用SetLayeredWindowAttributes实现透明。


        3、在MainFrame的OnMove中控制UI层随MainFrame移动。


        之后添加OGRE的监听函数,可以采用全局变量来实现相应控制。由此产生的效果就是采用MFC的UI来控制OGRE的3D渲染。


        在将OGRE渲染到MFC框架当中时容易出现的几个问题:

        1、MFC和OGRE结合时内存泄露问题。在生成DEBUG时,所有的new关键字将被替换为DEBUG_NEW,但在OGRE中会引起内存泄露,应该在所有引用ogre代码的地方删掉如下代码就正常了。

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


        2、使用SetLayeredWindowAttributes在XP下出现被OGRE画面覆盖的现象。在win7下一切正常,在XP环境下由于OnTimer持续控制渲染,UI层就会被view的3D图像覆盖,但是控件UI依然在顶层可以接受响应。只需要放弃使用通透色就可以解决。不过UI层对话框需要进一步改进。


       3、AfxPostQuitMessage(0)失效的问题。在持续渲染中首先要中断OGRE的持续监听,否则函数停止的只是OGRE。可以设全局同步信号来解决这个问题,待渲染停止后关闭。


       4、尽量在全部初始化完毕后再StartRendering。否则很容易因为持续的渲染打断其他初始化工作,例如我们的语音引擎如果在OGRE渲染后初始化就会失败。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值