码迷,mamicode.com
首页 > 其他好文 > 详细

Ogre的Overlay旋转

时间:2015-04-03 13:29:24      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:overlay旋转   overlay位移   

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),并且Overlayrotate是基于

(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 转载请标明来源 

 

 

 

Ogre的Overlay旋转

标签:overlay旋转   overlay位移   

原文地址:http://blog.csdn.net/chunyexiyu/article/details/44854087

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!