我是王PP 发表于 2016-6-6 10:55:21

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

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

我是王PP 发表于 2016-6-6 11:01:09

如果有其他方法,也请看到的大神给点方法 小女子谢谢各位了

guapibai 发表于 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);

不痛o就一下 发表于 2016-6-12 09:49:31

因为数据做了优化,同样一个点 在顶点数组中只存了一次,所以除了个别几个三角面(或一个),其他的抖不可能从索引0开始。(存一个索引,比存三个数字节省太多)

我是王PP 发表于 2016-6-15 15:45:22

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

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

我是王PP 发表于 2016-6-15 19:55:25

guapibai 发表于 2016-6-10 12:15
加个noTriStripPolygons参数试试,stl模型格式的读入你直接看源码呗,都有呢,

ReaderWriterSTL rw;


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

我是王PP 发表于 2016-6-23 20:46:39

guapibai 发表于 2016-6-10 12:15
加个noTriStripPolygons参数试试,stl模型格式的读入你直接看源码呗,都有呢,

ReaderWriterSTL rw;


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

我是王PP 发表于 2016-6-24 16:46:06

guapibai 发表于 2016-6-10 12:15
加个noTriStripPolygons参数试试,stl模型格式的读入你直接看源码呗,都有呢,

ReaderWriterSTL rw;


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

1392587076 发表于 2017-1-5 21:02:44

你好,请问一下,利用TriangleIndexFunctor重载operator()方法获取所有三角面片顶点索引是怎样实现的呢?

我是王PP 发表于 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():osg::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;
}
没时间回答你 提供一些源代码 希望对你有帮助
页: [1]
查看完整版本: 读入一个模型 想获取模型顶点的索引 但是获取出来的索引不是从0开始