void ParseTopoDSShapeToOff(const TopoDS_Shape& aShape)
{
//0计算顶点和顶点索引//
std::vector<osg::Vec3d> vertexArray;
BRepMesh_IncrementalMesh(aShape, 0.001);//BRepMesh::Mesh(aShape, 3);//6.8.0后删除了
gp_Pnt vertex1;
gp_Pnt vertex2;
gp_Pnt vertex3;
Standard_Integer nVertexIndex1 = 0;
Standard_Integer nVertexIndex2 = 0;
Standard_Integer nVertexIndex3 = 0;
TopExp_Explorer faceExplorer;
for (faceExplorer.Init(aShape, TopAbs_FACE); faceExplorer.More(); faceExplorer.Next())
{
TopLoc_Location loc;
TopoDS_Face aFace = TopoDS::Face(faceExplorer.Current());
Handle_Poly_Triangulation triFace = BRep_Tool::Triangulation(aFace, loc);
if (triFace.IsNull())
{
continue;
}
Standard_Boolean hasNormal = triFace->HasNormals();
Standard_Boolean hasuvNormal = triFace->HasUVNodes();
Standard_Integer l = triFace->Nodes().Length();
Standard_Integer nTriangles = triFace->NbTriangles();
TColgp_Array1OfPnt nodes(1, triFace->NbNodes());
Poly_Array1OfTriangle triangles(1, triFace->NbTriangles());
nodes = triFace->Nodes();
triangles = triFace->Triangles();
for (Standard_Integer i = 1; i <= nTriangles; i++)
{
Poly_Triangle aTriangle = triangles.Value(i);
aTriangle.Get(nVertexIndex1, nVertexIndex2, nVertexIndex3);
vertex1 = nodes.Value(nVertexIndex1);
vertex2 = nodes.Value(nVertexIndex2);
vertex3 = nodes.Value(nVertexIndex3);
vertexArray.push_back(osg::Vec3(vertex1.X(), vertex1.Y(), vertex1.Z()));
vertexArray.push_back(osg::Vec3(vertex2.X(), vertex2.Y(), vertex2.Z()));
vertexArray.push_back(osg::Vec3(vertex3.X(), vertex3.Y(), vertex3.Z()));
}
}
//顶点去重
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array();
{
int nums = vertexArray.size();
for (unsigned int i = 0; i < nums; i++)
{
osg::Vec3d vt = vertexArray.at(i);
bool bFind = false;//是否存在
osg::Vec3Array::iterator iter = vertices->begin();
for (; iter != vertices->end(); ++iter)
{
osg::Vec3d _vt = *iter;
if (_vt == vt)
{
bFind = true;
break;
}
}
if (!bFind)
{
vertices->push_back(vt);
}
}
}
int nums = vertices->size();
//获取索引
osg::ref_ptr<osg::DrawElementsUInt> arrayIndexs = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES);
{
int nums = vertexArray.size();
for (unsigned int i = 0; i < nums; i += 3)
{
bool bFind0 = false;
bool bFind1 = false;
bool bFind2 = false;
int index0 = 0;
int index1 = 0;
int index2 = 0;
osg::Vec3d vt0 = vertexArray.at(i);
osg::Vec3d vt1 = vertexArray.at(i + 1);
osg::Vec3d vt2 = vertexArray.at(i + 2);
//从去重后的顶点中获取索引
osg::Vec3Array::iterator iter = vertices->begin();
for (int index = 0; iter != vertices->end(); ++iter, ++index)
{
osg::Vec3d _vt = *iter;
if (_vt == vt0)
{
bFind0 = true;
index0 = index;//第1个顶点索引
}
else if (_vt == vt1) {
bFind1 = true;
index1 = index;//第2个顶点索引
}
else if (_vt == vt2) {
bFind2 = true;
index2 = index;//第3个顶点索引
}
if (bFind0 && bFind1 && bFind2)
{
arrayIndexs->push_back(index0);
arrayIndexs->push_back(index1);
arrayIndexs->push_back(index2);
break;
}
}
}
}
{
//写OFF
WirteOffFile("D:/工作/案例(点云+倾斜摄影)/data/cuda/off/my.off", vertices, arrayIndexs);
}
}