Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源
大多数情况,如果我们需要对Overlay上的内容旋转,我们通过内容本身旋转实现,例如图片材质的旋转等其它变换。
但也可能存在少数情况,我们需要对Overlay本身进行旋转。
材质的旋转、位移、动画等效果用的比较普遍,这里就不细说了,主要来说明了一下Overlay的旋转处理。
Overlay支持scroll, scale,rotate几种变换。
注意: Overlay用的坐标系不是普通的屏幕坐标系,而是用的是笛卡尔坐标系。
原点在窗口的中心,
X轴的正半轴在右边(最右边大小为1,最左边就为-1),
Y轴的正半轴在上边(最上边为1,最下边就为-1)
下面是一个变换的例子程序
创建一个Overlay,占用屏幕比例 (0,0) -> (0.2, 0.2)
// 名称 Ogre::String overlayName = "Overlay1"; Ogre::String containName = "Cont1"; Ogre::String textName = "Text1";
// create overlay Ogre::OverlayManager *pOverlayManager = Ogre::OverlayManager::getSingletonPtr(); m_pOverlay = pOverlayManager->create(overlayName); m_pOverlay->setZOrder(254); m_pOverlay->show();
// create border panel container Ogre::OverlayContainer* m_pContainer = static_cast<Ogre::OverlayContainer*>(pOverlayManager->createOverlayElement("BorderPanel", containName)); m_pContainer->setMetricsMode(GMM_RELATIVE); m_pContainer->setPosition(0, 0); m_pContainer->setWidth(0.2); m_pContainer->setHeight(0.2); m_pContainer->setMaterialName("Core/StatsBlockCenter"); // add container to overlay m_pOverlay->add2D(m_pContainer);
// create textArea OverlayElement* m_pTextArea = pOverlayManager->createOverlayElement("TextArea", textName); m_pTextArea->setMetricsMode(GMM_RELATIVE); m_pTextArea->setPosition(0, 0); m_pTextArea->setWidth(0.2); m_pTextArea->setHeight(0.1); m_pTextArea->setParameter("font_name", "BlueHighway"); m_pTextArea->setParameter("char_height", StringConverter::toString(Ogre::Real(0.05))); m_pTextArea->setParameter("horz_align", "left"); m_pTextArea->setColour(Ogre::ColourValue(0.0, 1.0, 0.0)); m_pTextArea->setCaption(Ogre::DisplayString(L"Test三角形\nTestTest")); m_pContainer->addChild(m_pTextArea); |
在帧render前调用: 延指定点旋转
a. 按照笛卡尔坐标系,overlay所在位置是(-1,1)->(-0.8,0.8),并且Overlay的rotate是基于
(0,0)旋转,并且参考了Overlay大小进行了调整。
b. 对我们来说,我们只用作延(-0,8, 0.8)点的旋转处理就可以。
根据矩阵求解方法: 延某点旋转的结果矩阵
旋转 + 偏移(x-x*cos@+ysin@, y –x*sin@-y*cos@)
static UINT s_nCount = 0; { Ogre::Radian radAngle = Ogre::Degree(s_nCount++); m_pOverlay->setRotate(radAngle); double x = -0.8; double y = 0.8; m_pOverlay->setScroll( x - x*cos(radAngle.valueRadians()) + y*sin(radAngle.valueRadians()), y - x* sin(radAngle.valueRadians()) - y*cos(radAngle.valueRadians())); } |
Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源
原文地址:http://blog.csdn.net/chunyexiyu/article/details/44854087