查看: 1698|回复: 13

一个关于HUD更新的问题

[复制链接]

该用户从未签到

发表于 2014-4-1 16:22:00 | 显示全部楼层 |阅读模式
本帖最后由 nie 于 2014-4-1 16:23 编辑

我想用更新回调或事件处理的方式将飞机飞行高度信息显示出来,
我用一个每帧加一的数来表示高度;代码如下:

#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Geode>
#include <osg/Depth>
#include <osg/CameraNode>
#include <osgText/Text>
#include <osgGA/TrackballManipulator>
#include <sstream>

#pragma comment( lib, "osgd.lib");
#pragma comment( lib, "osgDBd.lib")
#pragma comment( lib, "osgViewerd.lib");
#pragma comment( lib, "osgTextd.lib");
#pragma comment( lib, "osgGAd.lib");

using namespace std;


//将string转换成float型
float StringtoFloat(std::string str)
{
        std::istringstream iss(str);
        float num;
        iss>>num;
        return num;
}

//将float型转成string型
std::string FloattoString(float x)
{
        float y = x;
        std::string gdlist = "";
        std:stringstream os;
        os<<y;
        gdlist = os.str();
        return gdlist;
}
//事件类

class CHUD_viewPoint: public osgGA::GUIEventHandler  
{
public:  
        /**构造函数*/
        CHUD_viewPoint(float* updatepp):
          m_pp(updatepp) ,xx(3454.22){
          }
          ~CHUD_viewPoint(){}
          virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa);
          void UpdateText(osgViewer::Viewer* viewer,const osgGA::GUIEventAdapter&);
protected:
        float* m_pp;//高度信息
        float xx;//当前高度
};

bool CHUD_viewPoint::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
{
        switch(ea.getEventType())
        {
        case(osgGA::GUIEventAdapter::FRAME):
                {
                        osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
                        UpdateText( viewer, ea);//更新文字信息      
                        //}
                        xx++;
                        return true;
                }        
        default:     
                return false;
        }
}

void CHUD_viewPoint::UpdateText(osgViewer::Viewer* viewer,const osgGA::GUIEventAdapter&)

{
        *m_pp = xx;
}



osg::Node* createHUD_viewPoint( float* pp)//想从这里将更新的高度值传进来进行绘图

{       
        std::string gdlist;
        gdlist= FloattoString(*pp);

        //文字
        osgText::Text* text = new osgText::Text;   
        std::string timesFont("fonts/times.ttf");
        text->setFont(timesFont);
        osg::Vec3 position(400.0f,100.0f,0.0f);
        text->setPosition(position);   
        text->setColor( osg::Vec4( 1, 1, 0, 1));
        text->setText(gdlist);
        text->setCharacterSize(15);
        text->setDataVariance(osg::Object:YNAMIC);

        //几何体节点
        osg::Geode* geode = new osg::Geode();
        geode->addDrawable( text );
        osg::StateSet* stateset = geode->getOrCreateStateSet();
        stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
        stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
        stateset->setMode(GL_BLEND,osg::StateAttribute::ON);

        //相机
        osg::Camera* camera = new osg::Camera;
        camera->setProjectionMatrix(osg::Matrix::ortho2D(0,600,0,600));  
        camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
        camera->setViewMatrix(osg::Matrix::identity());
        camera->setClearMask(GL_DEPTH_BUFFER_BIT);
        camera->setAllowEventFocus( false);
        camera->setRenderOrder(osg::CameraNode:OST_RENDER);
        camera->addChild(geode);
        return camera;
};

int main( int argc, char **argv )

{
        osgViewer::Viewer viewer;
        osg::ref_ptr<osg::Group> root= new osg::Group;

        float* pp = new float;
        osg::ref_ptr< CHUD_viewPoint> pHUD= new CHUD_viewPoint(pp);
        root->addChild( createHUD_viewPoint(pp));

        viewer.addEventHandler( pHUD.get());
        viewer.setSceneData( root.get());
        viewer.realize();
        viewer.run() ;  
        return 0;

}


但是,显示出来的数是一个随机数, 捕获.PNG
应该是createHUD_viewPoint()并没有获得实时更新的数据,不知道为什么
求大神帮忙看下我这个程序

该用户从未签到

发表于 2014-4-1 20:18:57 | 显示全部楼层
createHUD_viewPoint(pp)
gdlist= FloattoString(*pp)
text->setText(gdlist)
这些代码只会执行一遍 也就是创建的过程
float* pp = new float;没有初始化所以是随机数,如果你先赋个值,估计就显示那个值。
虽然有个事件处理器一直更新pp的值,但是它的值并没有更新到text。

该用户从未签到

 楼主| 发表于 2014-4-2 08:26:38 | 显示全部楼层
本帖最后由 nie 于 2014-4-2 08:27 编辑
cenfer 发表于 2014-4-1 20:18
createHUD_viewPoint(pp)
gdlist= FloattoString(*pp)
text->setText(gdlist)


问题应该就是你说的那样,但是有没有办法让createHUD_viewPoint(pp),根据更新的值重绘呢,
为什么直接传osgText的指针就可以实现功能?

该用户从未签到

发表于 2014-4-2 13:47:13 | 显示全部楼层
你把 文字节点开放出来,把其 指针 传到事件处理器,更新就行了

该用户从未签到

 楼主| 发表于 2014-4-2 14:29:50 | 显示全部楼层
cenfer 发表于 2014-4-2 13:47
你把 文字节点开放出来,把其 指针 传到事件处理器,更新就行了

你说的那样,我能做出来,但我就是想通过上面这种办法,把更新后的数值传过来,要通过它画些线什么的,
估计是不行了,我看看还有其他方法没

该用户从未签到

发表于 2014-4-2 17:00:36 | 显示全部楼层
有方法解决。
自己设计一个回调类。

该用户从未签到

 楼主| 发表于 2014-4-2 17:05:36 | 显示全部楼层
cenfer 发表于 2014-4-2 17:00
有方法解决。
自己设计一个回调类。

恩,已经搞定了,多谢老兄

该用户从未签到

发表于 2014-5-5 20:52:06 | 显示全部楼层
nie 发表于 2014-4-2 17:05
恩,已经搞定了,多谢老兄

兄弟,你是怎么搞定的啊,能发程序发上来借鉴一下吗,谢谢啊

该用户从未签到

 楼主| 发表于 2014-5-7 13:15:23 | 显示全部楼层

就是上面几楼给出的思路啊,等下我贴代码

该用户从未签到

 楼主| 发表于 2014-5-7 14:04:01 | 显示全部楼层
本帖最后由 nie 于 2014-5-7 20:01 编辑


#include <osg/Geode>
#include <osgDB/ReadFile>
#include <osg/PositionAttitudeTransform>
#include <osgViewer/Viewer>
#include <osgText/Text>
#include <iostream>

//将float型转成string型
std::string FloattoString(float x)
{
        float y = x;
        std::string gdlist = "";
        std:stringstream os;
        os<<y;
        gdlist = os.str();
        return gdlist;
}

osg::Geode* createSpeed()
{
        osg::Geode* geode = new osg::Geode();
        {
                std::string timesFont("fonts/times.ttf");
                osgText::Text* text= new  osgText::Text;
                text->setDataVariance(osg::Object:YNAMIC);
                text->setFont(timesFont);
                text->setCharacterSize(20.0);
                text->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::OFF|osg::StateAttribute::OVERRIDE);
                geode->addDrawable(text);
        }
        return geode;
}

//创建HUD相机
osg::Camera* creatHUDCamera()
{
        osg::Camera* hudCamera = new osg::Camera;
        hudCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);       
        hudCamera->setProjectionMatrixAsOrtho2D(605,805,525,675);
        hudCamera->setViewport(300,300,250,400);
        hudCamera->setViewMatrix(osg::Matrix::identity());
        hudCamera->setRenderOrder(osg::Camera:OST_RENDER);
        hudCamera->setClearMask(GL_DEPTH_BUFFER_BIT);
        return hudCamera;
}

//实现显示更新
class TxtUpdateCallback:public osg::NodeCallback
{
public:
        TxtUpdateCallback():xx(3641.220)
        {

        }
        virtual void operator()(osg::Node* node,osg::NodeVisitor* nv)
        {
                std::string gdlist;
                osg::ref_ptr<osgText::Text>mtxt1 = dynamic_cast<osgText::Text*>(node->asGeode()->getDrawable(0));
                if (mtxt1.valid())
                {       
                        gdlist= FloattoString(xx);
                        mtxt1->setText(gdlist);
                        mtxt1->setPosition(osg::Vec3(740,600,0));
                }
                xx += 0.1;
                traverse(node,nv);
        }
public:
        double xx;
};

int main(int, char **)
{
        osg::Camera* hudCamera = creatHUDCamera();
        osg::PositionAttitudeTransform* transform = new osg::PositionAttitudeTransform;
        transform->setPosition(osg::Vec3(20.0,20.0,0.0));
        hudCamera->addChild(transform);
        osg::Geode* node = createSpeed();
        node->setUpdateCallback(new TxtUpdateCallback());
        hudCamera->addChild(node);

        osg::Group* root = new osg::Group;
        root->addChild( hudCamera );
        osgViewer::Viewer viewer;
        viewer.setSceneData( root );
        return viewer.run();
}

该用户从未签到

发表于 2014-5-7 15:44:47 | 显示全部楼层
兄弟,报错了
error C2512: 'osg:ositionAttitudeTransform' : no appropriate default constructor available
error C2027: use of undefined type 'osg::PositionAttitudeTransform'
error C2227: left of '->setPosition' must point to class/struct/union/generic type
error C2664: 'osg::Group::addChild' : cannot convert parameter 1 from 'osg::PositionAttitudeTransform *' to 'osg::Node *'

该用户从未签到

发表于 2014-5-7 16:28:10 | 显示全部楼层
你好,我找到了一个编译成功的,但是在多视图情况下不能显示文字,你能帮我看看吗
http://www.osgchina.org/forum.ph ... id=13729&extra=

该用户从未签到

发表于 2014-5-7 16:28:31 | 显示全部楼层
你好,我找到了一个编译成功的,但是在多视图情况下不能显示文字,你能帮我看看吗
http://www.osgchina.org/forum.ph ... id=13729&extra=
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表