First Steps - Building a cube

xx.xx·2023년 8월 28일
3

오픈매쉬

목록 보기
1/5

Open Mesh

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에 영향을 미치지 않으면서도 기능을 추가하거나 개선할 수 있습니다.

0개의 댓글