转换obj到cgal里的polyhedron

//转换obj_to_polyhedron;
Polyhedron save_obj_to_polyhedron(GLMmodel* m){

	GLMtriangle* triangles = m->triangles;
	GLfloat* vertices = m->vertices;

	for_delegate del;

	for(int i = 1;i<=m->numvertices;i++){
		Point_3 temp(vertices[3*i],vertices[3*i+1],vertices[3*i+2]);

		Point_3 newp = new_view_point(temp);//note:obj各点坐标也变化了;
		Point p(newp.hx(),newp.hy(),newp.hz());

		del.pointlist.push_back(p);
	}

	for(int i = 0;i<m->numtriangles;i++){
		std::vector<int> face;

		face.push_back(triangles[i].vindices[0]-1);
		face.push_back(triangles[i].vindices[1]-1);
		face.push_back(triangles[i].vindices[2]-1);

		//printf("%d,%d,%d\n",triangles[i].vindices[0],triangles[i].vindices[1],triangles[i].vindices[2]);

		del.facelist.push_back(face);
	}
	BuildPolyhedron<HalfedgeDS> builder(del);
	Polyhedron p;
	p.delegate(builder);

	return p;
}

//定义要用于动态新增polyhedron点和面的结构;
struct for_delegate{
	std::vector<Point> pointlist;//点;
	std::vector<std::vector<int>> facelist;//面,保存面的点的索引;
};

struct poly_and_segnum{
	Polyhedron p;
	int segnum;//该polyhedron对应的分解后的标记值;
};

// A modifier creating a triangle with the incremental builder.
template <class HDS>
class BuildPolyhedron : public CGAL::Modifier_base<HDS> {

public:
	typedef typename HDS::Vertex::Point Point;

	for_delegate del;

	BuildPolyhedron(for_delegate dele) {
		del = dele;
	}
	void operator()(HDS& hds) {
		// Postcondition: `hds' is a valid polyhedral surface.
		CGAL::Polyhedron_incremental_builder_3<HDS> B(hds, true);
		B.begin_surface(del.pointlist.size(), del.facelist.size());

		/*printf("pointlist.size():");
		printf("%d\n",del.pointlist.size());
		printf("facelist.size():");
		printf("%d\n",del.facelist.size());*/

		for(unsigned i = 0 ; i < del.pointlist.size() ; i++ ) {
			HDS::Vertex_handle vh = B.add_vertex(del.pointlist[i]);

			//fout <<"point: ";
			//fout <<del.pointlist[i]<<"\n";
		}

		// triangles
		for ( unsigned i = 0 ; i < del.facelist.size() ; i++ ) {

			HDS::Face_handle fh = B.begin_facet();
			for(int j = 0;j<del.facelist[i].size();j++){
				B.add_vertex_to_facet(del.facelist[i][j]);

				//fout <<del.facelist[i][j]<<" ";
			}
			B.end_facet();
			//fout <<"\n";
		}
		B.end_surface();
	}
};

此处obj的是用的glm来处理保存的



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值