Ogre-三维窗口上添加导航小窗口

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

你可能感兴趣的:(透明窗口,导航小窗口,画中画)