在 VCG 中创建超过 400k 顶点的 VertexPointer 时程序崩溃
Program crashes while creating VertexPointer of more then 400k Vertex in VCG
我是 VCG 的新手,在创建大小为 400K+ 顶点的 VertexPointer 时遇到了一些问题。在解决方案的评论中 here 提出了实际问题。
我尝试创建一个 VertexPointer 数组
MyMesh::VertexPointer vi[400000];
程序崩溃,上面一行代码没有错误。
这是 MyMesh 声明
class MyFace;
class MyVertex;
struct MyUsedTypes : public vcg::UsedTypes< vcg::Use<MyVertex>::AsVertexType,
vcg::Use<MyFace>::AsFaceType>{};
class MyVertex : public vcg::Vertex< MyUsedTypes, vcg::vertex::Coord3f, vcg::vertex::Normal3f, vcg::vertex::VFAdj, vcg::vertex::BitFlags, vcg::vertex::Mark>{};
class MyFace : public vcg::Face < MyUsedTypes, vcg::face::VertexRef, vcg::face::Normal3f, vcg::face::FFAdj, vcg::face::Mark, vcg::face::VFAdj, vcg::face::BitFlags > {};
class MyMesh : public vcg::tri::TriMesh< std::vector<MyVertex>, std::vector<MyFace> > {};
我想问问有什么方法可以在MyMesh类型的网格中插入顶点和法线。
请帮忙。
谢谢。
这应该可以帮助您入门。您基本上需要使用分配器。了解 VCG 工作原理的一个好方法是查看示例和 vcg 针对不同文件格式的 load/save 函数。
void MeshConversion::convertPclToVcg (const PclMesh& meshIn, VcgMesh& meshOut)
{
// VCG mesh clearing
meshOut.Clear();
// Create temporary cloud in to have handy struct object
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud1 (new pcl::PointCloud<pcl::PointXYZRGBA> ());
pcl::fromPCLPointCloud2(meshIn.cloud,*cloud1);
// Now convert the vertices to VCG VcgMesh
int vertCount = cloud1->width*cloud1->height;
vcg::tri::Allocator<VcgMesh>::AddVertices(meshOut, vertCount);
for(int i=0;i<vertCount;++i)
{
meshOut.vert[i].P()=vcg::Point3f(cloud1->points[i].x,cloud1->points[i].y,cloud1->points[i].z);
meshOut.vert[i].C()=vcg::Color4b(cloud1->points[i].r,cloud1->points[i].g,cloud1->points[i].b,cloud1->points[i].a);
}
// Now convert the polygon indices to VCG VcgMesh => make VCG faces..
int triCount = meshIn.polygons.size();
if(triCount==1)
{
if(meshIn.polygons[0].vertices[0]==0 && meshIn.polygons[0].vertices[1]==0 && meshIn.polygons[0].vertices[2]==0)
triCount=0;
}
vcg::tri::Allocator<VcgMesh>::AddFaces(meshOut, triCount);
for(int i=0;i<triCount;++i)
{
meshOut.face[i].V(0)=&meshOut.vert[meshIn.polygons[i].vertices[0]];
meshOut.face[i].V(1)=&meshOut.vert[meshIn.polygons[i].vertices[1]];
meshOut.face[i].V(2)=&meshOut.vert[meshIn.polygons[i].vertices[2]];
}
vcg::tri::UpdateBounding<VcgMesh>::Box(meshOut);
vcg::tri::UpdateNormal<VcgMesh>::PerFace(meshOut);
vcg::tri::UpdateNormal<VcgMesh>::PerVertexNormalizedPerFace(meshOut);
}
我是 VCG 的新手,在创建大小为 400K+ 顶点的 VertexPointer 时遇到了一些问题。在解决方案的评论中 here 提出了实际问题。
我尝试创建一个 VertexPointer 数组
MyMesh::VertexPointer vi[400000];
程序崩溃,上面一行代码没有错误。
这是 MyMesh 声明
class MyFace;
class MyVertex;
struct MyUsedTypes : public vcg::UsedTypes< vcg::Use<MyVertex>::AsVertexType,
vcg::Use<MyFace>::AsFaceType>{};
class MyVertex : public vcg::Vertex< MyUsedTypes, vcg::vertex::Coord3f, vcg::vertex::Normal3f, vcg::vertex::VFAdj, vcg::vertex::BitFlags, vcg::vertex::Mark>{};
class MyFace : public vcg::Face < MyUsedTypes, vcg::face::VertexRef, vcg::face::Normal3f, vcg::face::FFAdj, vcg::face::Mark, vcg::face::VFAdj, vcg::face::BitFlags > {};
class MyMesh : public vcg::tri::TriMesh< std::vector<MyVertex>, std::vector<MyFace> > {};
我想问问有什么方法可以在MyMesh类型的网格中插入顶点和法线。 请帮忙。 谢谢。
这应该可以帮助您入门。您基本上需要使用分配器。了解 VCG 工作原理的一个好方法是查看示例和 vcg 针对不同文件格式的 load/save 函数。
void MeshConversion::convertPclToVcg (const PclMesh& meshIn, VcgMesh& meshOut)
{
// VCG mesh clearing
meshOut.Clear();
// Create temporary cloud in to have handy struct object
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud1 (new pcl::PointCloud<pcl::PointXYZRGBA> ());
pcl::fromPCLPointCloud2(meshIn.cloud,*cloud1);
// Now convert the vertices to VCG VcgMesh
int vertCount = cloud1->width*cloud1->height;
vcg::tri::Allocator<VcgMesh>::AddVertices(meshOut, vertCount);
for(int i=0;i<vertCount;++i)
{
meshOut.vert[i].P()=vcg::Point3f(cloud1->points[i].x,cloud1->points[i].y,cloud1->points[i].z);
meshOut.vert[i].C()=vcg::Color4b(cloud1->points[i].r,cloud1->points[i].g,cloud1->points[i].b,cloud1->points[i].a);
}
// Now convert the polygon indices to VCG VcgMesh => make VCG faces..
int triCount = meshIn.polygons.size();
if(triCount==1)
{
if(meshIn.polygons[0].vertices[0]==0 && meshIn.polygons[0].vertices[1]==0 && meshIn.polygons[0].vertices[2]==0)
triCount=0;
}
vcg::tri::Allocator<VcgMesh>::AddFaces(meshOut, triCount);
for(int i=0;i<triCount;++i)
{
meshOut.face[i].V(0)=&meshOut.vert[meshIn.polygons[i].vertices[0]];
meshOut.face[i].V(1)=&meshOut.vert[meshIn.polygons[i].vertices[1]];
meshOut.face[i].V(2)=&meshOut.vert[meshIn.polygons[i].vertices[2]];
}
vcg::tri::UpdateBounding<VcgMesh>::Box(meshOut);
vcg::tri::UpdateNormal<VcgMesh>::PerFace(meshOut);
vcg::tri::UpdateNormal<VcgMesh>::PerVertexNormalizedPerFace(meshOut);
}