查看: 1010|回复: 5

【求助】osgText3D获取网格【已解决】

[复制链接]

该用户从未签到

发表于 2015-5-13 22:18:14 | 显示全部楼层 |阅读模式
本帖最后由 江湖贫侠 于 2015-5-13 23:33 编辑

我能用osgText3D显示中文,如图, Image 1.png
现在想获取其中的三角形,由于osgText3D不是osg::geometry,没法直接获取顶点和元素,同时我发现顶点和面片信息都存在osgText::Text3D::GlyphRenderInfo中,所以我自己创建了osgText3D的派生类来获取其中的数据。
  1.     class JTF_TEXT3D : public osgText::Text3D
  2.     {
  3.     public:
  4.         typedef osgText::Text3D::GlyphRenderInfo GRINFO;
  5.         typedef osgText::Text3D::LineRenderInfo LRINFO;
  6.         typedef osgText::Text3D::TextRenderInfo TRINFO;

  7.         JTF_TEXT3D(){}
  8.         JTF_TEXT3D(const Text3D& text,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY):
  9.             Text3D(text,copyop){}

  10.         const TRINFO& get_render_info()const{
  11.             return Text3D::_textRenderInfo;
  12.         }
  13.     };
复制代码


并试图通过以下的方式来获取其中的顶点和三角面片信息:
  1.     const JTF_TEXT3D::TRINFO &trinfo = text3d_->get_render_info();
  2.     std::vector<double> nodes;
  3.     std::vector<size_t> faces;
  4.     for(size_t li = 0; li < trinfo.size(); ++li){
  5.         const JTF_TEXT3D::LRINFO &lrinfo = trinfo[li];
  6.         for(size_t gi = 0; gi < lrinfo.size(); ++gi){
  7.             const JTF_TEXT3D::GRINFO & grinfo = lrinfo[gi];
  8.             osg::Geometry * og = grinfo._glyphGeometry->getGeometry();
  9.             osg::Vec3Array * vr = dynamic_cast<osg::Vec3Array*>(og->getVertexArray());
  10.             for(size_t pi = 0; pi < vr->getElementSize(); ++pi){
  11.                 NOTIFY
  12.                 const osg::Vec3 & one_node = (*vr)[pi];
  13.                 nodes.push_back(one_node.x());
  14.                 nodes.push_back(one_node.y());
  15.                 nodes.push_back(one_node.z());
  16.             }

  17.             const osg::Geometry::PrimitiveSetList &psl = og->getPrimitiveSetList();
  18.             for(auto & one_p: psl){
  19.                 assert(one_p->getMode() == osg::PrimitiveSet::TRIANGLES);
  20.                 for(size_t i = 0; i < one_p->getNumIndices(); ++i){
  21.                     faces.push_back(one_p->index(i)-1);
  22.                 }
  23.             }
  24.         }
  25.     }
复制代码


但奇怪的是,我能获取正确的面片数量,但是顶点个数却怎么都不匹配,明显少了许多,有人知道这是为什么?

该用户从未签到

 楼主| 发表于 2015-5-13 23:32:35 | 显示全部楼层
终于找到办法了,原来使用osg的TriangleFunctor就可以,代码如下:
  1. class My_visitor
  2.   {
  3.   public:
  4.     My_visitor():tri_point_num_(0){}

  5.     void operator()(const osg::Vec3 & a, const osg::Vec3 & b, const osg::Vec3 & c, bool ){
  6.       tri_.push_back(tri_point_num_++);
  7.       tri_.push_back(tri_point_num_++);
  8.       tri_.push_back(tri_point_num_++);

  9.       push_node(nodes_, a);
  10.       push_node(nodes_, b);
  11.       push_node(nodes_, c);
  12.     }
  13.     const std::vector<unsigned int> & get_tris()const{return tri_;}
  14.     const std::vector<double> & get_nodes()const{return nodes_;}
  15.   protected:
  16.     void push_node(std::vector<double> & node,
  17.                    const osg::Vec3 &a)
  18.     {
  19.       node.push_back(a.x());
  20.       node.push_back(a.y());
  21.       node.push_back(a.z());
  22.     }
  23.     std::vector<unsigned int> tri_;
  24.     std::vector<double> nodes_;
  25.     size_t tri_point_num_;
  26.   };

  27.   typedef osg::TriangleFunctor<My_visitor> my_functor;

  28. my_functor mf;
  29.     text3d_->accept(mf);
  30.     const std::vector<unsigned int> &triangles = mf.get_tris();
  31.     const std::vector<double> & nodes = mf.get_nodes();
复制代码

现在唯一的问题是,该方法是按照绘制图元的顺序来获取顶点,因而存在大量冗余顶点。
相应的解决方法,要么直接进行顶点合并,或者看看有没有其他的functor。

该用户从未签到

发表于 2015-5-15 17:46:59 | 显示全部楼层
怎么有这个奇怪的应用呢

该用户从未签到

 楼主| 发表于 2015-5-16 23:54:52 | 显示全部楼层
osger 发表于 2015-5-15 17:46
怎么有这个奇怪的应用呢

初始目的是想做个文字转网格的应用,刚巧看到osgText3D能做这个,所以就朝这个入手了

该用户从未签到

发表于 2015-5-19 13:05:11 | 显示全部楼层
江湖贫侠 发表于 2015-5-16 23:54
初始目的是想做个文字转网格的应用,刚巧看到osgText3D能做这个,所以就朝这个入手了

我也想过啊,不过没思路 - -

该用户从未签到

 楼主| 发表于 2015-6-3 11:42:54 | 显示全部楼层
不痛o就一下 发表于 2015-5-19 13:05
我也想过啊,不过没思路 - -

如果是自己实现的话,得去研究freetype库了,看看字体读进来是怎么表示,然后用triangle工具做CVT,然后再extrude成一个体。
但这个过程太麻烦了……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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