2016-09-22 3 views
2

메시를 수정하고 일부 가장자리가 추가되었습니다.수정 된 메시를 다시 연 후 OpenMesh 에지 인덱스

그런 다음 수정 된 메시를 .obj 파일에 저장했습니다. OpenMesh 읽기 함수를 사용하여이 .obj 파일을 열면 .obj 파일에 정점과면에 대한 정보 만 있기 때문에 모서리의 인덱스는 메쉬를 저장할 때 모서리의 인덱스와 다릅니다.

수정 된 메쉬를 저장할 때 가장자리 색인 순서로 추가 정보 파일을 저장해야합니다. 그러나 위에서 언급 한 내용에 따르면 순서가 다르므로 수정 된 메쉬를 다시 연 다음 가장자리 정보가 잘못되었습니다.

나는 해결책이있다. 수정 된 메쉬 (이전 메쉬)를 저장 한 다음 저장된 파일을 새 메쉬로 읽습니다. 새 메시의 모든 가장자리를 인덱스 순서로 확인하고 이전 메시에서 동일한 가장자리를 찾습니다. 그런 다음 새 메쉬의 가장자리 인덱스 순서로 가장자리 정보를 출력 할 수 있습니다.

다시 열지 않고도 간단한 해결책이 있습니까? 예를 들어, 에지 인덱스를 다시 계산하는 OpenMesh 함수는?

감사 당신은 내가 당신이 당신의 추가 정보를 저장할 사용자 지정 에지 속성을 아마 사용하는 (또는 적어도 사용한다)이 수치 말에서

답변

1

. 이상적과 같이 :

auto edge_pm = OpenMesh::makePropertyManagerFromExistingOrNew< 
     OpenMesh::EPropHandleT<std::string> >(mesh, "edge_info"); 
// Set some random edge info. 
edge_pm[mesh.edge_handle(23)] = "foo"; 

당신은 당신이 사용자 정의 속성을 저장할 수 있습니다 OpenMesh의 기본 .om 형식을 사용할 수 있습니다. 단위 테스트를 /src/Unittests/unittests_read_write_OM.cc, 특히 WriteTriangleVertexBoolProperty에서 살펴보고 사용자 정의 속성이있는 메시가 .om 파일에 저장된 다음 해당 파일에서 다시 읽는 예제를 구현하십시오. 위의 예는 다음과 같이 보일 것입니다 경우 :

Mesh new_mesh; 
auto new_edge_pm = OpenMesh::makePropertyManagerFromExistingOrNew< 
     OpenMesh::EPropHandleT<std::string> >(new_mesh, "edge_info"); 
bool ok = OpenMesh::IO::read_mesh(new_mesh, "bar.om"); 

는 이후 재산을 복원해야합니다 : 당신이 파일에서 메시를로드 할 때

// Flag property so it gets serialized. 
mesh.property(edge_pm.getRawProperty()).set_persistent(true); 
bool ok = OpenMesh::IO::write_mesh(mesh, "bar.om"); 

은 먼저 속성을 만들어야합니다

std::cout << new_edge_pm[new_mesh.edge_handle(23)] << std::endl; 
// Should print "foo"