본문 바로가기
OpenMesh

Mesh Decimation(Simplification)

by DarkRock 2023. 8. 18.
반응형

Mesh Decimation은

3D 데이터의 점이나 면의 갯수를 줄여주는 기능입니다.

아래 그림은 Decimation을 통해 왼쪽 sphere가 오른쪽 sphere 형태로 변형된 이미지이다. 삼각형 갯수가 많이 줄어든 것을 볼 수 있습니다. 

 

<Mesh Decimation>

Decimation 기능을 하나하나 구현하는 것은 쉽지 않지만, OpenMesh를 이용하면 쉽게 Decimation기능을 이용할 수 있습니다.

Decimation과 관련된 header 3개를 써주고,

#include <OpenMesh/Tools/Decimater/DecimaterT.hh>
#include <OpenMesh/Tools/Decimater/ModQuadricT.hh>
#include <OpenMesh/Tools/Decimater/ModEdgeLengthT.hh>

 

아래와 같이 코드를 입력해주면 된다. 아래 코드는 sphere.stl 파일을 읽어 들여 OpenMesh를 이용해 Decimation 진행한 후 mesh_out.stl 파일로 저장하는 코드입니다.

 

#include <OpenMesh/Tools/Decimater/DecimaterT.hh>
#include <OpenMesh/Tools/Decimater/ModQuadricT.hh>
#include <OpenMesh/Tools/Decimater/ModEdgeLengthT.hh>
typedef OpenMesh::PolyMesh_ArrayKernelT<>  MyMesh;
using namespace std;

int main()
{
	MyMesh mesh;

	if (!OpenMesh::IO::read_mesh(mesh, "sphere.stl"))
	{
		cout << "read error" << endl;
		exit(0);
	}

	mesh.request_face_normals();
	mesh.request_vertex_normals();
	mesh.update_normals();

	typedef OpenMesh::Decimater::DecimaterT< MyMesh > decimate;

	decimate Decimater(mesh);

	OpenMesh::Decimater::ModQuadricT< MyMesh >::Handle modQ;
	Decimater.add(modQ);
	Decimater.module(modQ).unset_max_err();

	OpenMesh::Decimater::ModEdgeLengthT< MyMesh >::Handle modE;
	Decimater.add(modE);
	Decimater.module(modE).set_edge_length(1.0);
	Decimater.module(modE).set_binary(true);

	Decimater.initialize();
	Decimater.decimate();
	mesh.garbage_collection();

	OpenMesh::IO::write_mesh(mesh, "mesh_out.stl", OpenMesh::IO::Options::Binary);

	exit(0);
}
반응형

'OpenMesh' 카테고리의 다른 글

Halfedge Data Structure(반모서리 자료구조)  (0) 2023.11.29
Cube Creation  (0) 2023.09.18
Mesh Subdivision  (0) 2023.09.18
Mesh Smooth  (0) 2023.09.14
OpenMesh 설치 및 Tutorial Example(Visual Studio 2017)  (0) 2023.08.11