First Steps - Building a cube
#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
typedef OpenMesh::PolyMesh_ArrayKernelT<> MyMesh;
유형을 선언 후 MyMesh큐브의 꼭지점 8개와 사각형 6개를 추가합니다.
정점 추가는 add_vertex메소드를 사용하여 수행됩니다.
vhandle[0] = mesh.add_vertex( MyMesh::Point (-1, -1, 1));
vhandle[1] = mesh.add_vertex( MyMesh::Point ( 1, -1, 1));
vhandle[2] = mesh.add_vertex( MyMesh::Point ( 1, 1, 1));
vhandle[3] = mesh.add_vertex( MyMesh::Point (-1, 1, 1));
메시에 면을 추가하려면 면의 정점에 핸들을 고정하는 벡터를 만들어야 합니다.
처음 4개의 꼭지점에서 면을 만듭니다.
std::벡터<MyMesh::VertexHandle> Face_vhandles;
Face_vhandles.clear();
Face_vhandles.push_back(vhandle[0]);
Face_vhandles.push_back(vhandle[1]);
Face_vhandles.push_back(vhandle[2]);
Face_vhandles.push_back(vhandle[3]);
mesh.add_face(face_vhandles);
full code
int main()
{
MyMesh mesh;
// generate vertices
MyMesh::VertexHandle vhandle[8];
vhandle[0] = mesh.add_vertex(MyMesh::Point(-1, -1, 1));
vhandle[1] = mesh.add_vertex(MyMesh::Point( 1, -1, 1));
vhandle[2] = mesh.add_vertex(MyMesh::Point( 1, 1, 1));
vhandle[3] = mesh.add_vertex(MyMesh::Point(-1, 1, 1));
vhandle[4] = mesh.add_vertex(MyMesh::Point(-1, -1, -1));
vhandle[5] = mesh.add_vertex(MyMesh::Point( 1, -1, -1));
vhandle[6] = mesh.add_vertex(MyMesh::Point( 1, 1, -1));
vhandle[7] = mesh.add_vertex(MyMesh::Point(-1, 1, -1));
// generate (quadrilateral) faces
std::vector<MyMesh::VertexHandle> face_vhandles;
face_vhandles.clear();
face_vhandles.push_back(vhandle[0]);
face_vhandles.push_back(vhandle[1]);
face_vhandles.push_back(vhandle[2]);
face_vhandles.push_back(vhandle[3]);
mesh.add_face(face_vhandles);
face_vhandles.clear();
face_vhandles.push_back(vhandle[7]);
face_vhandles.push_back(vhandle[6]);
face_vhandles.push_back(vhandle[5]);
face_vhandles.push_back(vhandle[4]);
mesh.add_face(face_vhandles);
face_vhandles.clear();
face_vhandles.push_back(vhandle[1]);
face_vhandles.push_back(vhandle[0]);
face_vhandles.push_back(vhandle[4]);
face_vhandles.push_back(vhandle[5]);
mesh.add_face(face_vhandles);
face_vhandles.clear();
face_vhandles.push_back(vhandle[2]);
face_vhandles.push_back(vhandle[1]);
face_vhandles.push_back(vhandle[5]);
face_vhandles.push_back(vhandle[6]);
mesh.add_face(face_vhandles);
face_vhandles.clear();
face_vhandles.push_back(vhandle[3]);
face_vhandles.push_back(vhandle[2]);
face_vhandles.push_back(vhandle[6]);
face_vhandles.push_back(vhandle[7]);
mesh.add_face(face_vhandles);
face_vhandles.clear();
face_vhandles.push_back(vhandle[0]);
face_vhandles.push_back(vhandle[3]);
face_vhandles.push_back(vhandle[7]);
face_vhandles.push_back(vhandle[4]);
mesh.add_face(face_vhandles);
// write mesh to output.obj
try
{
if ( !OpenMesh::IO::write_mesh(mesh, "output.off") )
{
std::cerr << "Cannot write mesh to file 'output.off'" << std::endl;
return 1;
}
}
catch( std::exception& x )
{
std::cerr << x.what() << std::endl;
return 1;
}
return 0;
}
Handle을 사용하는 이유 ?
메모리 관리와 안전성: Handle을 사용하면 메모리 주소를 직접 다루지 않아도 됩니다. 이로 인해 프로그래머가 메모리 관리에 신경 쓰지 않아도 되며, 메모리 주소를 조작하면서 발생할 수 있는 버그를 줄일 수 있습니다. 또한 Handle을 사용하면 예기치 않은 메모리 오버플로우와 같은 문제를 예방할 수 있습니다.
안정성과 유지 보수: Handle을 사용하면 메쉬의 내부 구조가 변경되더라도 메쉬 요소에 대한 참조를 안전하게 유지할 수 있습니다. 메쉬 데이터 구조가 업데이트되면 기존에 유지한 포인터나 참조가 무효화되는 상황을 방지할 수 있습니다. 이는 코드를 유지보수하거나 업데이트할 때 큰 도움이 됩니다.
추상화: Handle을 사용하면 프로그래머가 메쉬의 내부 구조에 직접 접근하지 않아도 됩니다. 이는 메쉬의 복잡한 내부 구조에 대한 추상화를 제공하며, 더 쉬운 메쉬 조작과 다양한 알고리즘 개발을 가능하게 합니다.
유연성과 호환성: Handle을 사용하면 OpenMesh 라이브러리의 내부 구현 변경에 대해 상대적으로 견고한 코드를 작성할 수 있습니다. 내부 구현의 변경이 외부 API에 영향을 미치지 않으면서도 기능을 추가하거나 개선할 수 있습니다.