层(Overlays)

From OGRE 3D 中文

Jump to: navigation, search

层(Overlays)允许你在一般的场景内容上绘制2D或3D元素,例如:提示信息(heads-up displays(HUDs))、菜单系统、状态栏等。OGRE系统中的帧状态栏(Frame Rate Statistics Panel)就是层(Overlays)的一个例子。层(Overlays)可以是2D元素或者3D元素。2D元素通常在提示信息(HUDs)中使用,3D元素则用在类似于驾驶员座舱,作为场景顶部元素(On Top Of The Rest Of The Scene)的3D对象上。

你可以通过调用SceneManager::createOverlay方法创建层(Overlays),或者你也可以通过创建一段“.overlay”脚本来定义层(Overlays)。事实上,后面一种方式比较常用(因为修改脚本后无需重新编译代码)。注意:你可以按你的需要定义尽可能多的层(Overlays),它们一开始都是不显示的,除非你调用了“show()”方法。你还可以同时显示多个层(Overlays),它们之间的遮挡关系可以通过调用Overlay::setZOrder()方法调整它们的Z的大小来实现。

创建2D元素

OverlayElement类是添加到层(Overlays)的2D元素的抽象。所以通过该类继承得到的类的对象都可以添加到层(Overlays)中去。OGRE系统鼓励用户通过定义OverlayElement类的子类来提供他们自己的界面控件。层元素(OverlayElements)的关键属性包括尺寸、位置、材质(Material)名称等属性。OverlayElement类的子类则扩展了更多复杂的属性和行为。

OverlayElement类的一个非常重要的子类是OverlayContainer类。OverlayContainer类除了能够包含其它的层元素(OverlayElements)之外,其它的特性都和OverlayElement类一样。OverlayContainer类还为它所包含的层元素(OverlayElements)提供了本地坐标(Local Coordinate),以方便它们能很容易地摆放在一起。

还有一个很重要的类是OverlayManager类,不管应用程序什么时候想创建一个加在层上(或者容器内)的2D元素,都可以通过调用OverlayManager::createOverlayElement方法来实现。你想创建的元素的类型是由一个字符串来进行标识的,原因是你可以在OverlayManager中注册你自定义的层元素(OverlayElement)类型。举例来说,如果你想要创建一个面板(一个可以容纳其它层元素(OverlayElements)的四边形),你可以调用OverlayManager::getSingleton().createOverlayElement(“Panel”, “myNewPanel”)。

在层(Overlays)中加入2D元素

在层(Overlays)中可以直接添加的元素只有层容器(OverlayContainers)。原因是每个级别的容器都为自己容器中的元素建立了Zorder,所以,如果你将几个容器放在同一个层中时,容器中元素可以先根据其Zorder,再根据容器的摆放关系正常显示。想在一个层(Overlays)中添加一个容器(比如面板),调用Overlay::add2D方法即可。

如果你想在容器中添加子元素,调用OverlayContainer::addChild方法即可。子元素可以是层元素(OverlayElements),也可以是层容器(OverlayContainer)。记住,子元素的坐标位置是根据他们的父容器的左上角来进行定位的。

关于2D坐标

OGRE系统允许你通过绝对坐标(pixel)或者相对坐标(relative)的方式来对元素进行定位。

绝对坐标方式(Pixel Mode)

当你想给你的层元素指定精确的尺寸大小时,这种方式非常有用。不管屏幕上的其它元素大小如何变化,通过这种方式指定尺寸的层元素的大小永远不发生改变。在这种方式下,你想把某个元素放在屏幕的右边或者底部都要通过像素计算得出,而如果采用相对坐标方式(Relative Mode)则简单得多。不过,这种方式相对比较简单,屏幕左上角的坐标为(0,0),右下角的坐标则由你的屏幕设置(640*480,800*600,1024*768等等)所决定。再提醒一次,如果你要将一个元素定位到屏幕的中间或者底部时,最好采用相对坐标方式(Relative Mode)。

相对坐标方式(Relative Mode)

如果你想要你所创建的元素与你的屏幕设置尺寸保持固定比例的话,你应该使用这种方式。在相对坐标方式(Relative Mode)中,屏幕左上角的坐标为(0,0),右下角坐标为(1,1)。所以,如果你将一个元素放在(0.5,0.5),则它正好放在屏幕的正中央。这个规则对设置尺寸也同样有效。如果你将一个元素的宽度设为0.5,则它的宽度正好是屏幕的一半。请注意,由于屏幕的长宽比一般为1.3333:1,所以一个元素如果被设为(0.25,0.25),则该元素不可能是正方形的。但它的大小正好是整个屏幕大小的1/16。如果你想将一个元素的形状设为正方形,你可以将其尺寸设为(0.1875,0.25)。

层(Overlays)的转换

层(Overlays)的另一个特性是可以旋转,滚动(Scroll),按比例缩放。你可以将这些特性用于菜单系统,可以实现菜单系统的缩放、拖拽或是其它效果。请参见Overlay::scroll,Overlay::rotate和Overlay::scale方法。

层(Overlays)的脚本编写

层(Overlays)也可以由脚本来定义,请参见3.4层脚本(Overlay Scripts)。

GUI系统

层(Overlays)只用于不发生交互的屏幕用户,如果你需要更加复杂的GUI解决方案,我们推荐CEGui(http://www.cegui.org.hk )。你可以在Demo_Gui例子中看到关于它的演示。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值