读入一个模型 想获取模型顶点的索引 但是获取出来的索引不是从0开始
模型的格式是.stl格式的,想获取模型的顶点数组以及模型顶点的索引,用的geometry->getVertexArray()获取到模型的顶点数组没有什么问题,用TriangleIndexFunctor 重载operator函数获取模型基本图元(三角形)的索引,索引不是从0开始,而且索引号是(105 106 107)(108 109 110)(111 112 113)......这种 不知道为啥 希望做过顶点索引的大神指点一下 如果有其他方法,也请看到的大神给点方法 小女子谢谢各位了 加个noTriStripPolygons参数试试,stl模型格式的读入你直接看源码呗,都有呢,ReaderWriterSTL rw;
osgDB::Options* opts = new osgDB::Options("noTriStripPolygons");
osgDB::ReaderWriter::ReadResult result = rw.readNode(evt->filePath, opts); 因为数据做了优化,同样一个点 在顶点数组中只存了一次,所以除了个别几个三角面(或一个),其他的抖不可能从索引0开始。(存一个索引,比存三个数字节省太多) 不痛o就一下 发表于 2016-6-12 09:49
因为数据做了优化,同样一个点 在顶点数组中只存了一次,所以除了个别几个三角面(或一个),其他的抖不可能 ...
不太明白你的意思,我是觉得一个完整模型的话,假如顶点个数为N,顶点索引的话不应该包括0,1,2...这些么,可是我获取到的似乎不符合实际情况啊,而且三角形也是有交叉的,共用顶点的情况很多,我获取出来的索引只出现一次 guapibai 发表于 2016-6-10 12:15
加个noTriStripPolygons参数试试,stl模型格式的读入你直接看源码呗,都有呢,
ReaderWriterSTL rw;
不好意思啊 没在OpenSceneGraph里面找到源码啊 读其他格式的文件不是用的插件么 guapibai 发表于 2016-6-10 12:15
加个noTriStripPolygons参数试试,stl模型格式的读入你直接看源码呗,都有呢,
ReaderWriterSTL rw;
我找到ReadWriteSTL的源码了 在插件里面,亲,你有可以直接使用的库文件吗,编译好的,不然我好像不能直接使用ReadWriteSTL guapibai 发表于 2016-6-10 12:15
加个noTriStripPolygons参数试试,stl模型格式的读入你直接看源码呗,都有呢,
ReaderWriterSTL rw;
不好意思 问题解决了 索引是从0开始 只是我把索引号输出在控制台了 不准确 我把结果输出到文件 得到了从0开始的索引 但是索引还是连续的数很郁闷 谢谢了 你好,请问一下,利用TriangleIndexFunctor重载operator()方法获取所有三角面片顶点索引是怎样实现的呢? 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]