OpenMesh를 이용해서 Cube를 생성하는 코드예제를 보여드리겠습니다.
Cube는 점이 8개, 면이 6개가 있습니다. 그래서 OpenMesh 구조체에 점과 면의 정보를 저장하면 Cube Mesh를 생성할 수 있습니다.
Cube의 점 8개를 저장하는 코드는 아래와 같습니다.
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));
MyMesh::VertexHandle인 vhandle[8]을 선언해서 vhandle[0] = mesh.add_vertex(MyMesh::Point(-1, -1, 1)); 이러한 형태로 점의 정보를 저장하였습니다. MyMesh::VertexHandle은 vertex 정보를 접근하기 위한 handler로 이해하시면 됩니다.
다음은 면의 정보를 저장하는 코드입니다.
Cube는 6개의 면이 있고 1개의 면에 4개의 점을 갖습니다. 우선 1개의 면을 저장하기 위한 코드를 보면,
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);
4개의 점을 저장하기위한 std::vector<MyMesh::VertexHandle> face_vhandles;를 선언하고, 이 변수에 4개의 점(vhandle[0~3])을 저장하였습니다. 그리고 이 4개의 점을 mesh의 면으로 저장하기위해mesh.add_face(face_vhandles);를 작성하였습니다.
아래는 6개의 면 전체를 저장하는 코드입니다.
// 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);
아래는 위에서 설명한 Cube 생성 전체 코드입니다.
Cube의 점과 면을 mesh에 저장한 후 cube.obj로 저장하는 코드입니다.
typedef OpenMesh::PolyMesh_ArrayKernelT<> MyMesh;
using namespace std;
void createCube()
{
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);
OpenMesh::IO::write_mesh(mesh, "cube.obj");
exit(0);
}
위 코드는 face가 사격형인 사각메쉬를 저장하는 코드입니다. 만약에 확장자가 stl인 삼각메쉬를 저장하고자 할 때는
면을 3개의 점을 이용해서 삼각형으로 mesh.add_face()한 후 stl로 저장하여야 합니다.
'OpenMesh' 카테고리의 다른 글
Openmesh Iterators(Mesh Navigation) (0) | 2023.12.11 |
---|---|
Halfedge Data Structure(반모서리 자료구조) (0) | 2023.11.29 |
Mesh Subdivision (0) | 2023.09.18 |
Mesh Smooth (0) | 2023.09.14 |
Mesh Decimation(Simplification) (0) | 2023.08.18 |