2012-04-10 4 views
0

저는 Half-Edge 데이터 구조를 기반으로하는 자체 Mesh 구조를 가진 3D OpenGl (C++) 응용 프로그램을 만들고 있습니다. 내 메시 구조에 Wavefront obj 파일을로드하는 간단한 방법을 만들고 싶습니다. 당연히, 나는 너무 순진하게 할 수 있지만, 좀 더 효율적인 방법이 있어야한다. (나는 전문적인 어플리케이션이 순차적으로 파일을 로딩하지 않는다는 것을 알고있다. 수백만 개의 정점에서 너무 느릴 것이다.)HalfEdge Mesh 용 .obj 파일 로더를 가속화하는 방법은 무엇입니까?

누군가 나를 튜토리얼이나 정말 빠른 OBJ 로더의 예를 가르쳐 줄 수 있습니까? Half Edge 데이터 구조와 관련이 있다면 바람직합니다.

편집 :

이 두 내가 어떻게 지능적으로 결정합니까 주위

1) 파일

2) 부동 소수점 숫자를 읽기의 일반적인 속도 저하를 피 얻을 찾고 기본 문제 날아 다니는 각 가장자리의 "인접한"하프 엣지. 나는 생성되는 엣지의 대칭 또는 다음 엣지가 이미 존재 하는지를 결정하기 위해 일종의 해싱 함수를 상상하고있다. 그렇다면 그 포인터를 사용하라.

답변

1

이전에 OBJ 파일을로드하는 비슷한 문제가 있었지만 에지와 반대되는 공유 꼭지점을 검색하고있었습니다. 파일 형식 자체에는 연결 정보가 없기 때문에 가장 좋은 방법은 std::set을 사용하는 것입니다. 데이터 구조에 모서리를 추가 할 때마다 세트를 검색하여 이미 존재하는지 확인할 수 있습니다. 집합 검색은 로그 구조가 복잡하므로 데이터 구조의 크기에 맞게 확장됩니다. 이를 피할 수있는 유일한 방법은 필요한 연결 정보가 포함 된 파일 형식을 선택하는 것입니다. 또는 Michael Slade가 자신 만의 형식 및 변환 도구를 만들 것을 제안했습니다.

+0

'std :: unordered_set'은 O (1) 조회를 제공합니다. –

+0

사실,하지만 자주 요소를 삽입하거나 지울 필요가있을 때 해시 맵을 피하는 경향이 있습니다.많은 양의 데이터를 읽을 때'std :: unordered_set' (해시 맵)을 빈번히 재실행해야하는데, 이것은 꽤 비싼 작업입니다. 얼마나 많은 프리미티브가 공유되었는지 알았다면 공간을 예약 할 수 있지만 OBJ 파일은 그것을 제공하지 않습니다. 어떤 컨테이너가 다른 파일 크기에 대해 가장 잘 수행되는지 확인하는 것은 흥미로울 것입니다. – PeddleSpam

1

ascii 파일을 읽고 디코딩하는 속도가 느립니다. 특히 파일에 변환 할 부동 소수점 숫자가있는 경우에는 속도가 느립니다.

제 아이디어 : 원하는 언어로 프로그램을 작성하여 .obj 파일을 메모리로 직접 읽을 수있는 바이너리 형식으로 변환하십시오. 그런 다음로드하려는 .obj 파일에서 해당 프로그램을 실행하고 프로그램이 변환 된 파일을로드하게하십시오.

추가 포인트를 얻으려면 OpenGL 프로그램에서이 변환을 즉시 수행하고 결과를 캐시하고 파일 수정 시간을 확인하고 필요에 따라 캐시를 업데이트 할 수 있습니다.

+0

이 뜻은 무엇입니까? 그 프로그램이 피하려고하는 것과 똑같은 일을하지 않을까요? –

+0

네, 그렇지만 프로그램을 실행시킬 때마다 미리 프로그램을 실행하지 말고 미리 할 수 ​​있습니다. –

+0

프로그램을 실행하는 동안 OBJ 파일을로드해야합니다. 문제는 숫자를 읽는 비용이 아니라 얼굴을 지능적으로 연결하는 방법입니다. –

관련 문제