2016-12-07 9 views
1

최근 메쉬를 수정해야하는 프로젝트에서 OpenMesh를 사용하기 시작했습니다. 삼각형의 중심에 정점을 삽입하려면면 split(FaceHandle _fh, Point _p)을 사용해야합니다. 그러나이 메서드를 사용하고 VertexFaceIterator를 사용하여 새로 만든 꼭지점의면을 잡으려고 할 때 항상 (87, 87, -1) 또는 (12, 12, -1)과 같은 꼭지점 인덱스가있는 잘못된면을 가져옵니다. OpenMesh가 분할 후 메쉬 토폴로지를 업데이트하지 않는 것처럼 보입니다.OpenMesh Face Split

내 코드는 다음과 유사합니다. faceStartIt이 이상한 색인을 제공합니다.

typedef OpenMesh::TriMesh_ArrayKernelT<> TriMesh; 

    TriMesh::FaceIter triangleIt = mesh.faces_begin(); 

    for(; triangleIt != mesh.faces_end();) 
    {    
     TriMesh::Point centroid = mesh.calc_face_centroid(*triangleIt); 

     if(hasToSplit(centroid)) 
     {    
      TriMesh::VertexHandle centroidHandle = mesh.split(*triangleIt, centroid); 
      TriMesh::VertexFaceIter faceStartIt = mesh.vf_begin(centroidHandle); 
      TriMesh::VertexFaceIter faceEndIt = mesh.vf_end(centroidHandle); 
      TriMesh::VertexFaceIter faceIt = faceStartIt; //faceIt++; 

      for(; faceIt != faceEndIt; ++faceIt) 
      {     
       // Do something for each face 
      } 
     } 
     else 
     { 
      ++triangleIt; 
     } 
    } 
+0

실제 입력 및 출력을 표시합니다. 또한,'TriMesh' 객체는'mesh'에 대한 변경이'triangleIt'을 무효로하지 않는다고 보장합니까? – paddy

+0

예. 'garbage_collection()'메소드를 사용하지 않으면, 모든 반복자는 어떤 연산을 수행 한 후에 유효해야한다. 입출력의 경우,'split' 메소드는 새로 생성 된 인덱스를 가진 유효한 VertexHandle을 반환하는 반면,'vf_begin'은 이러한 이상한 인덱스를 가진면을 가리키는 반복자를 반환합니다. (87, 87, -1)과 (12, 12, -1)은 반환 값의 실제 예입니다. 입력 및 출력의 의미인지 확인하지 마십시오. – murf

+0

대부분의 경우 코드를 복사하고 예제 메쉬를 보냈지 만 버그를 재현하지 못했습니다 (즉, 모든 핸들이 흔들림). 새 얼굴의 정점 핸들 ID를 출력하는 데 사용 된 코드를 표시 할 수 있습니까? – jsb

답변

1

내가 가진 문제를 파악했습니다. split 방법이 잘 작동하는데, 내가 잘못하고있는 것은 // Do something for each face 해설서에있었습니다. 각면에 대해 나는 가장자리 뒤집기 작업을하고 있었지만 플립이 나중에 얼굴을 평가할 때 변경되기 때문에 참조가 손실되었습니다. 해결책은 한 번의 반복에서 얼굴을 분할 한 다음 뒤집기를 원하는 각 가장자리를 std::set에 삽입하여 고유 한 것을 보장합니다. 그런 다음 다른 반복에서 표시된 가장자리에 실제 플립을 수행합니다.