查看: 1804|回复: 9

读入一个模型 想获取模型顶点的索引 但是获取出来的索引不是从0开始

[复制链接]

该用户从未签到

发表于 2016-6-6 10:55:21 | 显示全部楼层 |阅读模式
模型的格式是.stl格式的,想获取模型的顶点数组以及模型顶点的索引,用的geometry->getVertexArray()获取到模型的顶点数组没有什么问题,用TriangleIndexFunctor 重载operator函数获取模型基本图元(三角形)的索引,索引不是从0开始,而且索引号是(105 106 107)(108 109 110)(111 112 113)......这种 不知道为啥 希望做过顶点索引的大神指点一下

该用户从未签到

 楼主| 发表于 2016-6-6 11:01:09 | 显示全部楼层
如果有其他方法,也请看到的大神给点方法 小女子谢谢各位了

该用户从未签到

发表于 2016-6-10 12:15:18 | 显示全部楼层
加个noTriStripPolygons参数试试,stl模型格式的读入你直接看源码呗,都有呢,

ReaderWriterSTL rw;

        osgDB::Options* opts = new osgDB::Options("noTriStripPolygons");

        osgDB::ReaderWriter::ReadResult result = rw.readNode(evt->filePath, opts);

该用户从未签到

发表于 2016-6-12 09:49:31 | 显示全部楼层
因为数据做了优化,同样一个点 在顶点数组中只存了一次,所以除了个别几个三角面(或一个),其他的抖不可能从索引0开始。(存一个索引,比存三个数字节省太多)

该用户从未签到

 楼主| 发表于 2016-6-15 15:45:22 | 显示全部楼层
不痛o就一下 发表于 2016-6-12 09:49
因为数据做了优化,同样一个点 在顶点数组中只存了一次,所以除了个别几个三角面(或一个),其他的抖不可能 ...

不太明白你的意思,我是觉得一个完整模型的话,假如顶点个数为N,顶点索引的话不应该包括0,1,2...这些么,可是我获取到的似乎不符合实际情况啊,而且三角形也是有交叉的,共用顶点的情况很多,我获取出来的索引只出现一次

该用户从未签到

 楼主| 发表于 2016-6-15 19:55:25 | 显示全部楼层
guapibai 发表于 2016-6-10 12:15
加个noTriStripPolygons参数试试,stl模型格式的读入你直接看源码呗,都有呢,

ReaderWriterSTL rw;

不好意思啊 没在OpenSceneGraph里面找到源码啊 读其他格式的文件不是用的插件么

该用户从未签到

 楼主| 发表于 2016-6-23 20:46:39 | 显示全部楼层
guapibai 发表于 2016-6-10 12:15
加个noTriStripPolygons参数试试,stl模型格式的读入你直接看源码呗,都有呢,

ReaderWriterSTL rw;

我找到ReadWriteSTL的源码了 在插件里面,亲,你有可以直接使用的库文件吗,编译好的,不然我好像不能直接使用ReadWriteSTL

该用户从未签到

 楼主| 发表于 2016-6-24 16:46:06 | 显示全部楼层
guapibai 发表于 2016-6-10 12:15
加个noTriStripPolygons参数试试,stl模型格式的读入你直接看源码呗,都有呢,

ReaderWriterSTL rw;

不好意思 问题解决了 索引是从0开始 只是我把索引号输出在控制台了 不准确 我把结果输出到文件 得到了从0开始的索引 但是索引还是连续的数  很郁闷 谢谢了

该用户从未签到

发表于 2017-1-5 21:02:44 | 显示全部楼层
你好,请问一下,利用TriangleIndexFunctor重载operator()方法获取所有三角面片顶点索引是怎样实现的呢?

该用户从未签到

 楼主| 发表于 2017-2-17 14:35:03 | 显示全部楼层
1392587076 发表于 2017-1-5 21:02
你好,请问一下,利用TriangleIndexFunctor重载operator()方法获取所有三角面片顶点索引是怎样实现的呢?

顶点访问器的程序设计如下:
struct TriangleIndexCollector
{
        TriangleIndexCollector()
        {
                indexArray = new osg::UIntArray;
        }
        void operator()(const unsigned int& v1,const unsigned int& v2,const unsigned int& v3)
        {
                if(v1==v2||v1==v3||v2==v3)
                        return;
                indexArray->push_back(v1);
                indexArray->push_back(v2);
                indexArray->push_back(v3);
        }
        osg::ref_ptr<osg::UIntArray> indexArray;
};
struct TriangleCollector
{
    TriangleCollector()
        {
                Triangle = new osg::Vec3Array;
        }
        void operator()(const osg::Vec3 v1, const osg::Vec3 v2, const osg::Vec3 v3, bool temp )
        {
                if(v1==v2 || v1==v3 || v2==v3)    return;
                Triangle->push_back(v1);
                Triangle->push_back(v2);
                Triangle->push_back(v3);
        }
        osg::ref_ptr<osg::Vec3Array> Triangle;
};
VertexVisitor::VertexVisitor()sg::NodeVisitor(TRAVERSE_ALL_CHILDREN)
{
        extracted_verts = new osg::Vec3Array;
        index_array = new osg::UIntArray;
        triangle = new osg::Vec3Array;
        VertexCount = 0;
        IndexCount = 0;
}
void VertexVisitor:: apply(osg::Geode& geode)
{
        //得到每一个drawable
        for(unsigned int i=0;i<geode.getNumDrawables();i++)
        {
                osg::Geometry* geom = dynamic_cast<osg::Geometry*>(geode.getDrawable(i));     //得到几何体
                if(!geom)
                {
                        std::cout<<"几何体错误"<<std::endl;
                        continue;
                }
                osg::Vec3Array* verts = dynamic_cast<osg::Vec3Array*>(geom->getVertexArray());                //得到顶点数组
                if(!verts)
                {
                        std::cout<<"顶点数组错误"<<std::endl;
                        continue;
                }
        extracted_verts->insert(extracted_verts->end(),verts->begin(),verts->end());
                //得到三角形顶点信息
                osg::TriangleFunctor<TriangleCollector> tf;
                geom->accept(tf);
                triangle->insert(triangle->end(),tf.Triangle->begin(),tf.Triangle->end());
                //得到三角形顶点索引信息
                osg::TriangleIndexFunctor<TriangleIndexCollector> tif;
                geom->accept(tif);
        index_array->insert(index_array->end(),tif.indexArray->begin(),tif.indexArray->end());
        }
}
int VertexVisitor::getVertexCount()
{
         VertexCount = extracted_verts->size();
         return VertexCount;
}
没时间回答你 提供一些源代码 希望对你有帮助
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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