2015-01-11 10 views
0

는 (일부 가장자리를 colapse). 메쉬 처리를위한 나는 그것이 (C++) 현대 이후 openmesh (openmesh.org)를 사용하지만, 그것은 와 종속의 엄청난 양의 드래그하지 않습니다 주로하기 때문에 (단 표준 C++에 의존하고 현대 compiller이 그것을 처리 할 수 ​​있습니다 (I가 필요 크로스 플랫폼 Linux/Windows/Mac OSX)).OpenMesh, 데시 메이션, 나는 삼각형 메쉬의 많은 일하고 있어요, 그리고 언젠가 내가 그들에 삼각형의 수를 줄일 필요가 내 응용 프로그램에서 린드 스트롬 - 투르크

이제 좀 메시를 감소 (openmesh 용어시키면서)해야하지만 나는 국경을 보존해야합니다. (문제의 메쉬는 원래의 그리드 (512x512) 이었지만 가운데 일부 요소는 밀어 내기/추가되었습니다. 그리드의 바깥 쪽 모서리는 여전히 직사각형을 형성합니다)

나는 어떤 방식 으로든 보지 않습니다. openmesh에서 데시 메이팅하고 볼륨/아웃 라인을 보존하기 위해 모든 OpenMesh :: Decimater :: Mod * 데시 메이션 모듈은 quadric을 기본으로 사용합니다.

GTS (GNU Triangulated Surface Library)에는 Lindstrom-Turk 감소가 구현되어 있습니다 (필자가 원하는 경우 더러운 래퍼를 테스트 한 결과 작동합니다). GTS /) (그리고 그것은 또한 드래그입니다 : -이 문제는 그것 (I 여러 스레드에 비해 많은 메쉬를 줄일 수있어) 저장 멀티 쓰레드가 아니에요하고 해제하는 라이브러리 내부에서 전역 변수를 사용하기 때문에 GTS로는 불가능/메쉬를 줄이면서 몇 가지 물건을 가능 이 종속성을의로 전체 입심)

이 또한 CGAL이며 또한 린드 스트롬 - 투르크 구현이 있지만, 그 자체로 전체 부스트 및 기타 종속성을 끌어입니다 :/

테두리/볼륨 보존으로 데시 메이션을 수행하는 openmesh 용 데시 메이터 모듈이 있습니까? (내가 검색했지만 찾지 못했습니다 : /)

+0

최신 버전의 CGAL (4.5)를 사용하면 OpenMesh HDS에서 CGAL HDS로 변환 할 필요없이 간소화 알고리즘을 직접 적용 할 수 있습니다. CGAL에 필요한 유일한 의존성은 boost와 GMP뿐입니다. – sloriot

+0

'만'부스트 :] - 그 이유는 내가 부탁하고 ... 부양 의존성을 피하려고 노력하고있어 ... – user2441788

+0

호기심에 의해, 왜 의존성으로 부스트가 그런 문제입니까? – sloriot

답변

1

"메쉬 테두리"는 하나의 메쉬면을 만나는 메쉬 가장자리를 의미합니다 (예 : 512x512 모눈의 가장자리와 같이) 각각의 메쉬 가장자리가 2 개 이상의 메쉬면간에 공유되는 일반적인 경우와는 반대입니다. OpenMesh에서

실제로 그대로 다음 가장자리를 유지하기 위해 OpenMesh::Decimater 모듈을 말하는 아주 쉬운 방법이있다. 더 나아가, 실제로 사용하는 데시 메이션 모듈의 유형에 의존하지 않습니다. 실제 메쉬 데이터 구조 (즉, OpenMesh::TriMesh_ArrayKernelT<>)에는 "정점 잠금"기능이 있습니다. 이것은 본질적으로 OpenMesh에게 데시 메이션 중에 어떤 특정 꼭지점을 건드리지 말라고 말하는 방식입니다. 여기

는 똑바로 잡아 official documentation에서 코드 변경, C++ 11 비트입니다 :

using Mesh = OpenMesh::TriMesh_ArrayKernelT<>; 

void protectMeshBoundariesFromDecimation(Mesh& mesh) { 
    mesh.request_vertex_status(); 

    for (const auto& halfEdgeHandle : mesh.halfedges()) { 
     if (mesh.is_boundary(halfEdgeHandle)) { 
     mesh.status(mesh.to_vertex_handle(halfEdgeHandle)).set_locked(true); 
     mesh.status(mesh.from_vertex_handle(halfEdgeHandle)).set_locked(true); 
     } 
    } 
} 

당신이 작동하지 않는 문제와 위의 링크에 전체 문서를 읽으려면 더 이상 문서 내용 트리에서 으로 이동하십시오. OpenMesh -> OpenMesh 문서 -> OpenMesh 도구 문서 -> 메쉬 데시 메이션 프레임 워크.

는 기본적으로이 모든 메시의 절반 가장자리 (안 가장자리!) 더 페어 (NO 하반기 가장자리)이없는 반 가장자리를 형성 "잠금"정점을 통해 루프. OpenMesh가 사용하는 하프 - 에지 데이터 구조의 특성 덕분에 n 가장자리의 메시에 대한 복잡도는 O(n)입니다.

하프 에지 데이터 구조의 특성에 익숙하지 않은 사용자라면 OpenMesh 문서의 소개 섹션 인 "Using and understanding OpenMesh"을 읽어 보시기 바랍니다.