查看: 2642|回复: 7

osgText文本的动态更新问题

[复制链接]

该用户从未签到

发表于 2010-5-11 12:52:44 | 显示全部楼层 |阅读模式
我想让osgText::Text文本根据一个数组里的数据进行更新,可是文本不显示。估计是回调函数不起作用。请帮忙看看回调函数的写法及调用是否正确,谢谢。主要代码如下:
class Updatetext:public osg::NodeCallback
{
public:
Updatetext(int* _height,osgText::Text* _updateText):index(0)                  //_height为数组首地址,index为下标
{
  height = _height;
                updateText = _updateText;
  
}
virtual void operator()(osg::Node* node,osg::NodeVisitor* nv)
{
  osg::MatrixTransform* geode = dynamic_cast<osg::MatrixTransform*>(node);
  std::string gdlist = "";
  std:stringstream os;
  os<<height[index];
  gdlist += os.str();
  updateText->setText(gdlist);
  index += 1;
  traverse(node,nv);
}
protected:
int index;
int* height;
osgText::Text* updateText;
};
osg::Camera* createPointHUD(int* data)
{
    ......
    osg::ref_ptr<osg::Group> model = new osg::Group;
    std::string timesFont("fonts/arial.ttf");
    osg::Vec3 position(450.0,740.0,0.0);
    osg::Geode* geode = new osg::Geode;
    osg::StateSet* stateset = geode->getOrCreateStateSet();
    stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
    stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
    osgText::Text* updateText = new osgText::Text;
    geode->addDrawable(updateText);
    updateText->setCharacterSize(10.0f);
    updateText->setFont(timesFont);
    updateText->setColor(osg::Vec4(0.0f,255.0f,0.0f,1.0f));
    updateText->setText("");
    updateText->setPosition(position);
    updateText->setDataVariance(osg::Object:YNAMIC);

osg::MatrixTransform* mat = new osg::MatrixTransform;
mat->addChild(geode);
mat->setDataVariance(osg::Object::DYNAMIC);
mat->setUpdateCallback(new Updatetext(data,updateText));
    model->addChild(mat);
    camera->addChild(model);
    return camera;
}

该用户从未签到

发表于 2010-5-11 16:35:42 | 显示全部楼层
您可以尝试在operator()中打印出gdlist的值,以判断回调是否被执行以及文本内容是否正确

该用户从未签到

 楼主| 发表于 2010-5-11 16:52:02 | 显示全部楼层
好的,谢谢。还有我想问一下您,camera里能实现更新回调吗?怎么我在camara里做的更新回调都不起作用啊?

该用户从未签到

 楼主| 发表于 2010-5-11 17:20:52 | 显示全部楼层
回调进不去,不知道哪出问题了,没执行。

该用户从未签到

发表于 2010-5-12 08:13:06 | 显示全部楼层
Camera节点可以使用更新回调

该用户从未签到

 楼主| 发表于 2010-5-14 19:39:50 | 显示全部楼层
我调试了一下,回调的构造函数实现了,但operator()进不去。这是为什么啊?请指教一下。谢谢。

该用户从未签到

发表于 2010-5-16 23:14:07 | 显示全部楼层
但operator()进不去
您需要给出更多的信息,有可能您只是写错了函数的参数和类型而已

该用户从未签到

发表于 2010-7-29 13:35:00 | 显示全部楼层
其实你创建一个camera后,将其加入root节点。为这个camera添加回调。这个回调得自己定义,继承自NodeCallback  然后你需要做的工作是:在回调里面显示文字,将文字加入camera,  要注意:添加文字之前,请删除camera中的所有结点,不然,使用addChild后会出现文字重叠,因为camera中的节点数量已经不是一个了,不信你可以cout<<camera->getNumChildren()<<endl;试试。

我就是这样实现的。实现了在屏幕上实时显示当前位置。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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