최근 메쉬를 수정해야하는 프로젝트에서 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;
}
}
실제 입력 및 출력을 표시합니다. 또한,'TriMesh' 객체는'mesh'에 대한 변경이'triangleIt'을 무효로하지 않는다고 보장합니까? – paddy
예. 'garbage_collection()'메소드를 사용하지 않으면, 모든 반복자는 어떤 연산을 수행 한 후에 유효해야한다. 입출력의 경우,'split' 메소드는 새로 생성 된 인덱스를 가진 유효한 VertexHandle을 반환하는 반면,'vf_begin'은 이러한 이상한 인덱스를 가진면을 가리키는 반복자를 반환합니다. (87, 87, -1)과 (12, 12, -1)은 반환 값의 실제 예입니다. 입력 및 출력의 의미인지 확인하지 마십시오. – murf
대부분의 경우 코드를 복사하고 예제 메쉬를 보냈지 만 버그를 재현하지 못했습니다 (즉, 모든 핸들이 흔들림). 새 얼굴의 정점 핸들 ID를 출력하는 데 사용 된 코드를 표시 할 수 있습니까? – jsb