본문 바로가기
OpenMesh

Cube Creation

by DarkRock 2023. 9. 18.
반응형

OpenMesh를 이용해서 Cube를 생성하는 코드예제를 보여드리겠습니다.

<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