参考: http://www.cppblog.com/hitmaen/archive/2007/05/22/24589.html
参考: http://www.360doc.com/content/13/0906/11/593831_312575920.shtml
参考: http://blog.csdn.net/windows_nt/article/details/7495387
参考: http://blog.csdn.net/debugconsole/article/details/9022059
参考: http://www.ogre3d.org/tikiwiki/Displaying+2D+Backgrounds
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)
要实现在Ogre-三维窗口上添加导航小窗口
有几种方法,
一种是使用Ogre多视口实现,
一种是使用Windows的透明窗口实现
一种是使用Ogre的Overlay实现
一种是使用Ogre的Rectangle2D实现
下面使用Ogre的多视口来实现
//-------------------------------------------------------------------------------------------------------------
首先创建第二个Camera
// 画中画相机 m_pCameraInner =m_pSceneManager->createCamera("InnerCam");//创建名为PlayerCam的摄像机 m_pCameraInner->setPosition(Vector3(0,0,500));//设置摄像机的位置 m_pCameraInner->lookAt(Vector3(0,0,0));//摄像机的方向 m_pCameraInner->setNearClipDistance(5);//位置单位的近距离剪裁 |
然后创建第二个ViewPort,该ViewPort点据窗口的一角
// 画中画视口 Viewport *vpInner =m_pWindow->addViewport(m_pCameraInner, 1, 0.75, 0, 0.25, 0.25);// 放置在左上角 vpInner->setBackgroundColour(ColourValue(0, 0, 1));//设置底色 vpInner->setOverlaysEnabled(false);//不启用overlay m_pCameraInner->setAspectRatio(Real(vp->getActualWidth())/Real(vp->getActualHeight()));//视口纵横比 |
下面使用windows的透明窗口实现
//-------------------------------------------------------------------------------------------------------------
a. 首先,建立一个无边框的对话框,
b. 然后在对话框的OnInitDialog中设置透明窗体属性,设置透明度
// 设置窗体为半透明 SetWindowLong(m_hWnd,GWL_EXSTYLE,GetWindowLong(m_hWnd,GWL_EXSTYLE)|WS_EX_LAYERED); SetLayeredWindowAttributes(0, 128,LWA_ALPHA); |
c. 再把窗体的位置调整到左上角
d. 可以使用OpenGL在窗体中绘制元素
这样就形成了画中画的效果,并且这个画中画的效果是半透明效果
下面使用Ogre的Overlay
//-------------------------------------------------------------------------------------------------------------
Ogre的Overlay本身就是用于实现绘制场景上的屏幕贴图或文字,实现画中画效果是非常高效的。
如果是静态的导航窗口的话,是非常建议的一种方式
例如:使用配置文件生成一些屏幕场景 *.overlay
MyOverlay { zorder 499 container BorderPanel(Core/MyContainer3) { metrics_mode pixels left 0 top 10 width 300 height 200 material Core/StatsBlockCenter element TextArea(MyTextArea3) { metrics_mode pixels top 10 left 50 width 200 height 50 font_name MyFont1 char_height 19 caption who am i colour_top 1 1 0.7 colour_bottom 1 1 0.7 } } } <span style="font-family:Arial;BACKGROUND-COLOR: #ffffff"></span>
代码中实现:
// 加载字体 Ogre::FontManager::getSingleton().getByName("MyFont1")->load(); // 加载中文字体 // Ogre::FontManager::getSingleton().getByName("MyChsFont1")->load(); // 显示二维层 Ogre::OverlayManager* p = Ogre::OverlayManager::getSingletonPtr(); Ogre::Overlay* pOverlay = p->getByName("MyOverlay"); pOverlay->show();
注意如果显示中文文字的话,需要配置字体和code_points
下面使用Ogre的Rectangle2D来实现
//-------------------------------------------------------------------------------------------------------------
Rectangle2D根据设置render队列的不同,可以作为background,在模型之前render,也可以放在模型之后render
例子一: 使用静态材质
// 参考: http://blog.csdn.net/debugconsole/article/details/9022059 Ogre::Rectangle2D* m_pRect2d = new Ogre::Rectangle2D(true); // 设置大小 m_pRect2d->setCorners(-0.3, 0.3, 0.3, -0.3); // 设置材质 m_pRect2d->setMaterial("Examples/SphereMappedRustySteel"); // 设置render队列: 放在物体渲染之后 // Ogre::RENDER_QUEUE_BACKGROUND: Render the background before everything else试 // Ogre::RENDER_QUEUE_OVERLAY: Render the background after the models (before overlay) m_pRect2d->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); // 设置包围盒: 使用infinit确保一直可见, 否则结点可能会被认为不在视口内 AxisAlignedBox *aabb = new AxisAlignedBox(); aabb->setInfinite(); m_pRect2d->setBoundingBox(*aabb); // 添加到结点 SceneNode* m_pBackNode = m_pSceneManager->getRootSceneNode()->createChildSceneNode("BackgroundNode"); m_pBackNode->attachObject(m_pRect2d); // 注意: 结点变换不会影晌到二维平面的显示,如果要变换图形的话,只能通过纹理变换的方式 // m_pBackNode->translate(300, 100, 500);
例子二: 使用自定义动画效果材质的样例
// 参考: http://www.ogre3d.org/tikiwiki/Displaying+2D+Backgrounds // Create background material MaterialPtr material = MaterialManager::getSingleton().create("Background", "General"); material->getTechnique(0)->getPass(0)->createTextureUnitState("rockwall.tga"); material->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false); material->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); material->getTechnique(0)->getPass(0)->setLightingEnabled(false); // Create background rectangle covering the whole screen Rectangle2D* rect = new Rectangle2D(true); rect->setCorners(-0.3, 0.3, 0.3, -0.3); rect->setMaterial("Background"); // Ogre::RENDER_QUEUE_BACKGROUND: Render the background before everything else试 // Ogre::RENDER_QUEUE_OVERLAY: Render the background after the models (before overlay) rect->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); // Use infinite AAB to always stay visible AxisAlignedBox aabInf; aabInf.setInfinite(); rect->setBoundingBox(aabInf); // Attach background to the scene SceneNode* node = m_pSceneManager->getRootSceneNode()->createChildSceneNode("Background"); node->attachObject(rect); // Example of background scrolling material->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setScrollAnimation(-0.25, 0.0);
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)