参考: 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 转载请标明来源)