查看: 2245|回复: 8

osg文字的显示

[复制链接]

该用户从未签到

发表于 2014-6-1 10:47:54 | 显示全部楼层 |阅读模式
在写osg文字这一节中显示汉字和osg文件(或ive文件)时,都不能显示
代码如下:
osg::ref_ptr<osg::Geode> createText()
{
        osg::ref_ptr<osgText::Text> text = new osgText::Text();
        osg::ref_ptr<osg::Geode> geode = new osg::Geode();

        text->setFont("font/simhei.ttf");
        text->setText(L"显示ive模型");
        text->setPosition(osg::Vec3(100, 500, 0));
        text->setColor(osg::Vec4(1.0, 0.0, 0.0, 0.0));
        text->setCharacterSize(30.0);
        text->setLayout(osgText::Text::VERTICAL);
        //设置边框对其绘制
        text->setDrawMode(osgText::Text::BOUNDINGBOX | osgText::Text::TEXT);

        geode->addDrawable(text);
        return geode;
}

osg::ref_ptr<osg::Camera> createCamera()
{
        osg::ref_ptr<osg::Camera> ca = new osg::Camera();
        osg::ref_ptr<osg::Geode> text = createText();
        osg::ref_ptr<osg::StateSet> ss = text->getOrCreateStateSet();
        ss->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
        ss->setMode(GL_LIGHTING, osg::StateAttribute::OFF);

        ca->setProjectionMatrix(osg::Matrixd:rtho2D(0, 1024, 0, 800));

        //设置视图矩阵,同是保证不被场景中的其他位置变换影响,使用绝对帧引用
        ca->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
        ca->setViewMatrix(osg::Matrixd::identity());
        ca->setClearMask(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
        //渲染顺序
        ca->setRenderOrder(osg::Camera:OST_RENDER);

        ca->addChild(text.get());
        return ca;
}


int main()
{
        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
        osg::ref_ptr<osg::Group> root = new osg::Group();
        osg::ref_ptr<osg::Node> ceep = osgDB::readNodeFile("ceep.ive");
       
        root->addChild(ceep);
        root->addChild(createCamera());

        osgUtil::Optimizer op;
        op.optimize(root.get());

        viewer->setSceneData(root.get());
        viewer->realize();
        return viewer->run();
}

该用户从未签到

发表于 2014-6-3 10:22:41 | 显示全部楼层
请确保文件和字体路径是有效的,如果没有在当前路径下,是否设置了OSG_FILE_PATH

该用户从未签到

 楼主| 发表于 2014-6-3 10:45:03 | 显示全部楼层
gis_wudi 发表于 2014-6-3 10:22
请确保文件和字体路径是有效的,如果没有在当前路径下,是否设置了OSG_FILE_PATH

设置了,而把两个函数内容写在一个函数里可以显示

该用户从未签到

发表于 2014-6-4 10:42:22 | 显示全部楼层
  return ca;
   return geode;
修改为 return ca.release();
return geode.release()

该用户从未签到

 楼主| 发表于 2014-6-5 17:12:50 | 显示全部楼层
gis_wudi 发表于 2014-6-4 10:42
return ca;
   return geode;
修改为 return ca.release();

这个好像不可以,没有显示,不知是我的配置问题还是什么

该用户从未签到

发表于 2014-6-7 15:53:15 | 显示全部楼层
osg::ref_ptr<osg::Geode> createText()
{
        osg::ref_ptr<osgText::Text> text = new osgText::Text();
        osg::ref_ptr<osg::Geode> geode = new osg::Geode();

        text->setFont("Fonts/simhei.ttf");
        text->setText(L"显示ive模型");
        text->setPosition(osg::Vec3(100, 500, 0));
        text->setColor(osg::Vec4(1.0, 0.0, 0.0, 1.0));
        text->setCharacterSize(30.0);
        text->setLayout(osgText::Text::VERTICAL);
        //设置边框对其绘制
        text->setDrawMode(osgText::Text::BOUNDINGBOX | osgText::Text::TEXT);

        geode->addDrawable(text);
        return geode;
}

osg::ref_ptr<osg::Camera> createCamera()
{
        osg::ref_ptr<osg::Camera> ca = new osg::Camera();
        osg::ref_ptr<osg::Geode> text = createText();
        osg::ref_ptr<osg::StateSet> ss = text->getOrCreateStateSet();
        ss->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
        ss->setMode(GL_LIGHTING, osg::StateAttribute::OFF);

                ca->setProjectionMatrix(osg::Matrix:rtho2D(0, 1366, 0, 768));

        //设置视图矩阵,同是保证不被场景中的其他位置变换影响,使用绝对帧引用
        ca->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
        ca->setViewMatrix(osg::Matrixd::identity());
        ca->setClearMask(GL_DEPTH_BUFFER_BIT );
        //渲染顺序
        ca->setRenderOrder(osg::Camera:OST_RENDER);

        ca->addChild(text.get());
        return ca;
}


int main()
{
        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
        osg::ref_ptr<osg::Group> root = new osg::Group();
        osg::ref_ptr<osg::Node> ceep = osgDB::readNodeFile("ceep.ive");
        
        root->addChild(ceep);
        root->addChild(createCamera());

        osgUtil::Optimizer op;
        op.optimize(root.get());

        viewer->setSceneData(root.get());
        viewer->realize();
        return viewer->run();
}

在你的基础上稍微修改了一点

该用户从未签到

 楼主| 发表于 2014-6-8 11:15:06 | 显示全部楼层
鹰灵 发表于 2014-6-7 15:53
osg::ref_ptr createText()
{
        osg::ref_ptr text = new osgText::Text();

多谢,解决了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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