OpenMesh Class List 에서 기능 찾기
OpenMesh Class List
open mesh에서 필요한 기능을 찾아보려고 한다.
필요한 기능을 간단히 말하면, 떨어져있는 두 mesh 객체에서 거리가 가까운 부분을 연결해주는 것이다.
대충 이렇게 왼쪽에서 오른쪽으로 바꾸는 느낌인 건데
단순히 edge나 face를 추가로 만드는게 아니라 기존 구조에서 수정해야한다는 점이 문제이다.
어떤 face들이 가까운 것이고, 연산량을 고려해서 어떻게 두 오브젝트를 찾고 가까운 특정 영역을 만들 것이냐.
이런 기능이 OpenMesh에 있는 함수를 이용해서 구현할 수 있을지
docs에서 모듈들을 뒤져보도록 한다.
Gnuplot class
메쉬 데이터를 시각적으로 분석하거나 디버깅할 때 활용한다고 한다.
특정한 mesh의 속성이나 변화 등을 시각적으로 표현하는 일이 어떤 것일까?
여기서는 메쉬에서 추출하게 되는 vertex 좌표, normal vector의 size 등을 시각화한다는 것으로 보아.
이런 시각화를 말하는게 아닐까 싶다.
OpenMesh class
3d mesh 작업을 하기위해 open mesh 라이브러리를 사용한다면 가장 많이 사용하게 되는 기능의 class이다.
1. OpenMesh::TriMesh_ArrayKernelT
- 기본 삼각형 메쉬 클래스: 삼각형 메쉬를 저장하고 처리하는 클래스입니다. 정점, 면, 에지의 기본적인 조작 기능을 제공합니다.
2. OpenMesh::PolyMesh_ArrayKernelT
- 다각형 메쉬 클래스: 삼각형뿐만 아니라 일반적인 다각형 메쉬를 처리하는 클래스입니다.
3. OpenMesh::BaseKernel
- 핵심 데이터 구조: 정점, 에지, 반에지, 면 등의 기본적인 자료구조와 관련된 기능을 제공합니다.
4. OpenMesh::ArrayKernel
- 배열 기반 데이터 저장: 메쉬의 정점과 면 데이터를 배열로 관리하여 빠른 접근이 가능하도록 합니다.
5. OpenMesh::Attributes
- 속성 관리: 정점, 에지, 면 등 각 요소에 추가적인 속성(예: 색상, 정규화 벡터)을 부여하고 관리할 수 있는 기능을 제공합니다.
6. OpenMesh::Handles
- 핸들(Handle) 클래스: 메쉬 요소(정점, 에지, 면)에 대한 참조를 효율적으로 관리하기 위해 핸들을 사용합니다. 정점 핸들, 에지 핸들 등이 있습니다.
7. OpenMesh::Iterators
- 반복자(Iterator): 메쉬의 정점, 에지, 면 등을 순회하는 데 사용됩니다. 각 요소에 대해 빠르게 접근할 수 있도록 도와줍니다.
8. OpenMesh::Circulators
- 순환자(Circulator): 특정 정점에 연결된 모든 반에지, 면 등을 순환하며 접근하는 데 사용됩니다.
9. OpenMesh::PropertyManager
- 속성 관리자: 메쉬 요소에 추가적인 속성을 쉽게 부여하고 사용할 수 있도록 돕는 클래스입니다. 정점, 에지, 면의 속성을 유연하게 관리할 수 있습니다.
10. OpenMesh::Decimater
- 메쉬 간소화: 메쉬의 정점을 줄여 간소화하는 데 사용됩니다. 예를 들어, 필요하지 않은 세부 사항을 제거하여 연산 속도를 높일 수 있습니다.
11. OpenMesh::Smoother
- 메쉬 스무딩: 메쉬의 표면을 부드럽게 만드는 알고리즘을 제공합니다. 정점의 위치를 변경해 거친 표면을 부드럽게 만듭니다.
12. OpenMesh::Subdivider
- 메쉬 세분화: 메쉬를 세분화하여 더 많은 정점과 면을 추가해 더 정밀하게 만드는 기능을 제공합니다.
13. OpenMesh::IO::Reader / OpenMesh::IO::Writer
- 파일 입출력: 다양한 파일 형식(예: OBJ, OFF, STL)으로부터 메쉬 데이터를 읽어오거나, 메쉬 데이터를 파일로 저장하는 기능을 제공합니다.
14. OpenMesh::Utils::MeshChecker
- 메쉬 검증: 메쉬 데이터의 정합성, 오류 등을 검증하는 데 사용됩니다. 잘못된 정점 연결이나 비정상적인 구조를 확인할 수 있습니다.
15. OpenMesh::VDPM
- 뷰 종속적인 메쉬 간소화( view dependent progressive meshes ): 뷰포트에 따라 메쉬의 복잡도를 조절하는 LOD(Level of Detail) 관련 기능을 제공합니다.
Circulator
특정 정점이나 면을 기주능로 연결된 메쉬 요소들을 순회하는 도구이다.
iterator와 비슷하게 구성되어있지만, 메쉬의 구조를 따라서 순환하기 유용하다.
CustomTraits
OpenMesh에서 Traits는 메쉬의 요소들 (vertex, edge, face)에 대해서 사용자가 정의하는 속성이나 기능을 추가하는데 사용되는 구조체라고 한다. 즉 기본적 구조에서 추가할 데이터를 넣기 위함이라고 보면 된다.
또는 메쉬에 필요한 color, normal, texture coord 등을 추가하는데 사용하기도 하는 것 같다.
DecimaterViewerWidget
Decimation이라는 것은 메쉬의 복잡도를 조절하는 것을 말한다.
현재 진행하는 DX11 엔진 관련 연구 과제에서도 이 기능을 사용해서 메쉬를 다듬고 있다.
이걸 편하게 지원하는 예제 위젯의 개념인 듯 하다.
ModBalancerT
RuleMap
OpenMesh의 한계
OpenMesh의 docs를 보니 생각보다 한계가 명확했다.
OpenMesh는 메쉬의 정점 추가, 삭제, 속성 수정 등 기본적인 데이터 구조와 조작을 지원하는 라이브러리이기 때문에, 블렌더에서 메쉬를 자유자재로 다루거나 하는 것 같은 고급 편집 기능은 기본적으로 제공되지 않는다.
너무 openmesh에 큰 기대를 걸지 않고 웬만한 것은 github에서
누군가 구현해놓은 코드를 참고한다고 생각하는게 맞는 것 같다.