2012년 8월 31일 금요일

Experimental Sample : 3D to 2D Vectorize


2012. 4 ~
Visual C++ 2008 Express Edition
OpenVG, Asset Importer(http://assimp.sourceforge.net)

Description
3D모델 데이터를 2D벡터화 후에 결과물을 보정하기 위한 중간과정의 샘플
현재 2D벡터화 시키는 작업까지 진행하였으나 아직 여러 문제가 남아있는 상태입니다.
모델 로더는 Asset Importer을 사용하였고, 벡터 데이터의 표시는 OpenVG를 이용하고 있습니다.
OpenVG Implementation은 ShivaVG(http://sourceforge.jp/projects/sfnet_shivavg/)를 이용하고 있습니다.
일부분만 OpenGL을 통하여 가속화 되어 있는 상태로, 그렇게 고속이진 못합니다

소스 파일은 아래 URL에서 다운로드 가능합니다.
https://sites.google.com/site/kcbacks1/files/3dto2d.zip

현재 이 코드는 다음과 같은 동작을 거쳐서 동작합니다.

1. 3D모델 데이터의 로드(Asset Importer 사용)
2. 최적화 되지 않은 모델에 대한 정점 공유화 작업 (::unifyPoints)
3. 모든 정점에 대한 행렬변환 적용 (테스트 샘플에서는 이 과정은 생략하고 있습니다)
4. 시계방향으로 회전하는 삼각형을 추출후, 각 삼각형의 사용횟수를 Index값을 기준으로 작성
5. 중복 사용된 선(Line)의 제거(2회 이상 사용된 횟수의 선을 제거)
6. 별도 작성한 클래스 CircleIndexFactory를 사용하여 정점Index를 폴리곤 별로 정렬, 하나의 폴리곤 또는 남는 선의 그룹을 만듦
 -> CircleIndexFactory를 별도 작성한 이유는, static동작이긴 하지만 회귀함수 호출을 알기쉽게 정리하기 위해서입니다.
 -> CircleIndexFactory는 최초의 선을 기준으로
1->2
2->3
3->4,   3->10,   3->20(추가 탐색 하지 않음)
4->5,   10->11,
5->x(x),11->1(o),
 -> 와 같은 작업을 수행합니다.
 -> (x)와 같은 결과가 나오는 경우 3->4 단계로 돌아가 3->10으로 재탐색을 실시합니다. 이후 11->1과 같이 복귀하는 값이 나왔을 경우 탐색을 중지합니다.
 -> 3->4 4->5 와 같이 폴리곤이 성립되지 않는 선은 별도의 배열에 기록되어 선으로 취급됩니다.
 -> 각 라인은 사용수가 기록되며, CircleIndexFactory는 모든 선이 사용될때까지 탐색을 실시합니다.

7. 폴리곤/라인 분류가 완료된 선들을 OpenVG의 메모리로 전송하여, 이를 표시합니다.

댓글 없음:

댓글 쓰기