반응형
Mesh Decimation은
3D 데이터의 점이나 면의 갯수를 줄여주는 기능입니다.
아래 그림은 Decimation을 통해 왼쪽 sphere가 오른쪽 sphere 형태로 변형된 이미지이다. 삼각형 갯수가 많이 줄어든 것을 볼 수 있습니다.
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 |