2016-07-20 1 views
1

OpenMesh를 사용하여 메쉬를 데시 메이트하려고합니다. 나는이 문서에 언급되는 바로 그 예를 다음 :OpenMesh Decimater가 정점 번호를 줄이지 않습니다.

cout << "Vertices: " << mesh->n_vertices() << endl; 

    DecimaterT<Mesh> decimater(*mesh); // a decimater object, connected to a mesh 
    ModQuadricT<Mesh>::Handle hModQuadric;  // use a quadric module 

    decimater.add(hModQuadric); // register module at the decimater 
    decimater.initialize();  // let the decimater initialize the mesh and the 
            // modules 
    decimater.decimate_to(15000);   // do decimation 

    cout << "Vertices: " << decimater.mesh().n_vertices() << endl; 

decimate_to 방법이 올바르게 종료하거나 축소해야 꼭지점의 수는 56,000을 반환합니다.

그러나 메쉬의 정점 번호가 변경되지 않았다는 것을 로그를 통해 알 수 있습니다. 어떻게 가능합니까?

답변

2

데시 메이션은 요소 (정점,면 등)를 제거하여 메시의 연결성을 변경합니다. OpenMesh에서 메쉬 요소 제거는 각 요소를 잠정적으로 마킹하여 구현됩니다 (mesh.status(handle).deleted() 속성 사용). 삭제 된 요소의 실제 제거는 명시 적으로 요청한 경우에만 mesh.garbage_collection()으로 전화하여 발생합니다. 가비지 콜렉션을 수행하기 전에 mesh.n_vertices()에는 계속해서 삭제 표시된 정점이 포함됩니다.

데시 메이터는 가비지 수집을 자동으로 요청하지 않습니다. 그것은 사용자가 그렇게하도록 남아 있습니다. decimater.decimate_to(...) 이후에 mesh.garbage_collection()에 전화를 걸면 문제가 해결됩니다.

+0

내 하루를 보냈습니다. 감사. 공식 문서에서이 동작을 언급 한 부분에 대한 포인터가 있습니까? ^^ – Lake

+1

@Lake [형상 요소 삭제]에 대한 일반적인 설명이 있습니다 (http://www.openmesh.org/media/Documentations/OpenMesh-6.2- 문서/a00060.html). 불행히도,'decimate_to'가 가비지 콜렉션을 트리거하지 않는다는 사실은'DecimaterT.cpp' 구현시 소스 코드 주석에 의해서만 문서화 된 것 같습니다. – jsb

+1

@Lake OpenMesh 6.3부터 문서가 그에 따라 업데이트되었습니다. – jsb

관련 문제