首页 > 其他 > 详细

Ogre的Overlay旋转

时间:2015-04-03 13:28:20      阅读:280      评论:0      收藏:0      [点我收藏+]

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旋转

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!