Ogre多窗口显示在MFC下实现

Ogre多窗口显示在MFC下实现

项目中需要小地图效果自然想到了Ogre教程中的画中画显示,但是小地图把主窗口遮盖的比较严重。索性就再开个窗口单独作为小地图的显示吧
主要的思路就是在高度200处架设一个位置不变的Camera,用这个Camera显示出的效果作为小地图的输出
有图有真相,看图再继续
Ogre多窗口显示在MFC下实现_第1张图片

在说明实现方法之前,需要理清楚Ogre中的一些关系:Root,RenderWindow,SceneManager,Camera,ViewPort
第一,Root在程序中是唯一的,是万物之源
第二,RenderWindow和Root是一对多的关系,而RenderWindow和MFC中的View(或者是Win32中的窗口)是一对一的关系,这也是Ogre能多窗口显示的基础
第三,SceneManager和Root是一对多关系,但本例中关系不大,我只用了一个SM
第四,RenderWindow和ViewPort是一对多关系,但一个RenderWindow必须有一个主ViewPort。
第五,Viewport和Camera是一对一关系,
第六,SceneManager和Camera是一对多关系,但通常一个程序中只显示一个Camera的内容,除非你在一个RenderWindow中设置了多个ViewPort,每个ViewPort对应不同的Camera(教程中的画中画就是这么来的)
画个图把关系理清楚些吧
Ogre多窗口显示在MFC下实现_第2张图片
 
这个例子中我的设计思路是这样的:
创建两个RenderWindow,分别对应主窗口和小地图窗口,他们对应不同的ViewPort,而不同的ViewPort对应不同的Camera(主窗口就是原来的Camera,小地图窗口用的是新创建高度200的Camera)。
步骤大致如下:
1。用之前生成Curve窗口一样的方法创建一个可用的View类窗口
2。用与生成主窗口相同的方法来显示Ogre中的内容(SetupOgre。。。若干等等)
关键的是产生RenderWindow(用MinimapView窗口的句柄),SM采用getSceneManager获得主窗口的SM,再对Camera,ViewPort一一设置就行,总之就是对MFCView类照葫芦画瓢。

大功告成!

最后温习下Invalidate的知识:
Invalidate(TRUE);//擦除背景
Invalidate(FALSE);//不擦除背景
程序View类里的OnEraseBkgnd直接返回TRUE,并且定时器中用Invalidate(TRUE);就能避免窗口闪烁啦

你可能感兴趣的:(Ogre多窗口显示在MFC下实现)