[MFC :: OpenGL] Mesh :: Part 2 (옮김)

심플디 2014.04.25 13:00 조회 수 : 1533

ProjectOpenGL.exe


Test_Vertex ex 1.dxf


Test_Vertex ex 2.dxf


Test_Vertex ex 3.dxf


Test_Vertex ex 4.dxf


Test_Vertex ex 5.dxf




Mesh. Part2 는 




Part1에서 작성한 메쉬 알고리즘 확인중에




면이 튀는 오류를 잡기 위한 기술이 기재될 것이다.



































<그림 1 :: Test_Vertex2 모습>






<그림 2 :: Test_Vertex2>


 


<그림 1>는 소팅이 적용되지 않은 것. <그림 2>는 소팅이 적용 된 것이다.


즉, 소팅이 잘 적용되지 않아서 면이 튄 것일 수도 있다.






<그림 3 :: 돼지는 하앍>


 



파일을 긁어오는 과정에는 x, y, z 각축의 최소/최대값을 저장하는 기능이 있다.


이 최소/최대 값을 통해 물체의 도심을 (0, 0, 0)에 위치시키게 한 것이다.


<그림 3>을 보면 물체가 아직 중앙에 위치해있지 않은 모습을 볼 수 있다.


혹시 물체를 중앙으로 옮기는 과정에서 면들이 튄것이 아닌가, 우려해서 해봤다.


그러나 여전히 뒷면에서 면이 튀는 모습을 볼 수 있었다.






 <그림 4 :: 메쉬 알고리즘의 보정>




MFC 수업 듣는 내내 이것만 생각했다.


논문은 이미 아웃오브 안중...




아무튼, <그림 4>는 수업시간 때 생각해둔 방법을 그려놓은 것이다. 


요컨데, 너무 가로방향성으로만 생각을 해서 나온 문제인 것 같다.








<그림 5 :: mesh의 기본 알고리즘>




사실 mesh알고리즘의 기본은,"점 3개 (혹은 4개)를 연결해서, 생기는 내부 공간에 점이 없을 경우, 하나의 메시로 인정한다." 이다.


필자는 이에 대해 엄청난 비교 연산이 필요할것을 우려하여, 좌표 단위가 아닌 배열 단위의 mesh를 지향했다.


요컨데, x, y 별로 소팅하고 좌표를 나누어, 가까운 배열간에 연결만 해주면 되는 방식을 사용했다.


여기에 3차원 mesh를 짜야 한다면 z축까지 한번(?) 더 소팅하면 된다. (해본적은 없지만...)




갑자기 원론적인 이야기를 한 이유는, 바로 <그림 4>와 같은 문제점을 해결하는 방법이 되기 때문이다.




아.무.튼. 


<그림 4>를 증명해야 한다.


이제부터 그것을 증명할 것이다. 


아주 간단한 예제를 통해서 말이다.








<그림 6 :: ex 1>






<그림 7 :: ex 2>


 



v 방향의 불규칙성은 혀용되는 것 같다.


즉, u방향의 점들이 불규칙할 때, u방향을 기준으로 면이 접힌대도, 아무런 문제가 없다는 것이다.






<그림 8 :: ex 3>






<그림 9 :: ex 4>


 




<그림 10 :: ex 4 (shademode)>


 




하지만 필자의 예상대로 u의 불규칙성은 면이 튀는 현상으로 직결된다.


즉, v방향으로 면이 접히면 말썽이 생긴다.






<그림 11 : ex 4 예상 mesh 그림>





<그림 12 :: ex 4 정면 mesh 그림>




<그림 11>은 필자가 mesh 패턴을 따라 mesh를 예상해 본 그림이고, <그림 12>는 프로그램 구동 결과이다.


<그림 11>과 <그림 12>의 모습이 같은 것을 볼 수 있다.



즉, <그림 10>의 오류는 프로그램상의 오류가 아니라, 알고리즘의 오류라는 것이다.








<그림 13 :: Another>




그렇다면 <그림 13>과 같이, 면을 튀지 않게 하는 방법을 쓸 수 있겠다. (단, L2가 L1보다 짧아야 한다.)


그리고 문제가 있는데, Mesh의 개수가 적어진다.






 <그림 14 :: 해결책>




<그림 14>는 2011.11.16 MFC 수업시간에 짬나는데로 만든 알고리즘을 보여주고 있다.


크게 볼 수 있으니, 이론이 잘 이해가 안되면 유심히 보기를 권장한다.




* 프로그래밍시에는 Method 01과 Method 02의 명칭을 바꿔서 썼다. 기존에 사용하던 방법이 Method 02면 어색할 것 같아서 그랬다.




새로운 개념이 도입되어 있는데, 바로 배열 인덱스다.


필자가 mesh를 짜는 방식은 근접좌표 vs 근접좌표 mesh 알고리즘이 아니라, sorting 되어 있는 배열간의 근접배열 vs 근접배열  mesh 알고리즘이다.


(기준점과 근접한 좌표끼리의 연산, 기존의 메시와 겹치지 않는 메시를 생성하기 위한 비교연산 등을 하지 않아도 되기 때문에, mesh짜는 시간이 대폭 줄어든다.) 




이 새롭게 도입된 개념은 기준점을 기준으로 Mesh 1, Mesh 2가 초기화 되면, 같은 위치의 인덱스 배열도 초기화 되는 것이다.




<그림 14>의 (a)와 같은 알고리즘을 예로 들면,


Mesh는 배열의 2배곱만큼 생성되고 인덱스 배열도 전부 true값이 되는 구조다.


그리고 <그림 14>의 (b)와 같은 경우가 설명이 조금 복잡하다.


아무튼 procedure(절차)를 나열하면 아래와 같다. (<그림 14>의 오른쪽 종이에도 자세히 기재되어 있다.)




큰 흐름:


a1. 배열 생성


a2. 플래그 검사


a3. 검사영역 적합성 검사.


a4. L1, L2 검사 및 비교


a5. 메시 초기화.


a6. u값 이동 및 Jump 설정


a7. v값 이동 적합성 검사


a8. 2번으로.




상세 설명 :


0. 인덱스 배열을 동적할당한다. (안전한 동적 해제 시스템도 구축해 놓는다.)


1. 기준배열 점과 매치되는 인덱스배열값이 true면 메시 생성을 건너뛰고 기준점의 u를 한칸 옮긴다. -> a6


2. <그림 14 - (b)> 처럼 하려면 적어도 4칸의 공간을 강제 할당 해야 한다.


    하지만 <그림 14 - (A)>의 PL~PZ 나, PN~PZ에서 기준점이 놓이면 <그림 14 - (b)>의 방법은 메모리 침범으로 이어진다.


    따라서 검사 영역에 4칸이 다 들어오는지의 검사를 매번 해줘야 한다.


    만약 들어오지 않는다면 Method 01 (기존 알고리즘) 실행.


3. <그림 14 - (b)> 처럼 4칸을 한꺼번에 조지기 위한 목적은 단 하나, 배열로 인한 초기화 순서를 무시하기 위해서다. L1, L2를 비교하고 


    적합한 조건이 되면 Method 02 (꼼수 알고리즘)을 실행하고, 적합한 조건이 되지 않으면 Method 01 (기존 알고리즘)을 실행시킨다.


4. Method 1이 실행되면 u는 1칸 이동하고 Method 2가 실행되면 u는 2칸 이동한다.


5. u가 이동했다면 기준점으로서 pl~pz, pn~pz 이상의 범위로 벗어났는지 검사하고, 벗어났다면 v를 한칸 올린다.


6. v가 pl~pz, pn~pz 이상의 범위를 벗어났다면 메시 동적 할당 개수과는 상관없이 메시 초기화 작업을 끝냈다.








 <그림 15 ::Test_Vertex ex 4.dxf>




하지만 정상적으로 작동 하지않았다.


필자가 절망하는 모습이 보이지 않는가?


원인은 요컨데 위치가 조로코롬 있어도 L2 보다 L1이 더 짧은것에 있었다.


그래서 Test_Vertex ex 5.dxf 파일은 맨 오른쪽의 x축 좌표를 300에서 600으로 모조리 바꾸어 놓았다. 






 <그림 16 :: Test_Vertex ex 5.dxf>






  <그림 17 :: Test_Vertex ex 5.dxf>





<그림 17>을 통해 우리는 꼼수 알고리즘이 정확히 맞아 들었음을 확인 할 수 있다.


물론 <그림 15>와 같은 오류가 있기는 하지만... 이제 여기에 더 시간을 쓸 여력이 없다. (논문도 써야해 !!! 화남)






   <그림 18 :: 돼지저금통>




하지만 이런 각고의 노력에도 불구하고 돼지저금통의 버그는 잡히지 않았다.

그래도 예전에는 면이 4개나 튀었는데, 지금은 3개만 튀는걸 보니 나아지긴 한거 같다. -_-^

번호 제목 글쓴이 날짜 조회 수
공지 본 게시글의 첨부파일 권한 심플디 2014.08.22 2376
47 [MFC :: OpenGL] 컴공 수업 발표 자료 (옮김) [2] 심플디 2014.04.25 2878
46 [MFC :: OpenGL] Project 시즌 2 후기 (옮김) 심플디 2014.04.25 1568
45 [MFC :: OpenGL] File output (옮김) 심플디 2014.04.25 1500
44 [MFC :: OpenGL] Tool bar(툴바) 편집방법 (옮김) 심플디 2014.04.25 1822
43 [MFC :: OpenGL] IntroPage (옮김) file 심플디 2014.04.25 1500
42 [MFC :: OpenGL] IPC 적용 (옮김) file 심플디 2014.04.25 1560
41 MFC :: OpenGL] ProjectMFCReport 와꾸짜기 (옮김) 심플디 2014.04.25 1681
40 [MFC :: OpenGL] Data Dialog 와꾸짜기 (옮김) 심플디 2014.04.25 1710
39 [MFC :: OpenGL] 시즌 2 개요 (옮김) file 심플디 2014.04.25 1500
38 [MFC :: OpenGL] Project 시즌 2 시작 (옮김) [1] 심플디 2014.04.25 1504
37 [MFC :: OpenGL] Project 시즌 1 후기 (옮김) file 심플디 2014.04.25 1566
» [MFC :: OpenGL] Mesh :: Part 2 (옮김) [1] file 심플디 2014.04.25 1533
35 [MFC :: OpenGL] Mesh :: Part 1 (옮김) file 심플디 2014.04.25 1584
34 [MFC :: OpenGL] DXF :: Part 5 (옮김) file 심플디 2014.04.25 1574
33 [MFC :: OpenGL] DXF :: Part 4 (옮김) file 심플디 2014.04.25 1471
32 [MFC :: OpenGL] DXF :: Part 3 (옮김) file 심플디 2014.04.25 1454
31 [MFC :: OpenGL] DXF :: Part 2 (옮김) file 심플디 2014.04.25 1503
30 [MFC :: OpenGL] DXF :: Part 1 (옮김) file 심플디 2014.04.25 1545
29 [MFC :: OpenGL] Proposal 및 앞으로의 계획 (옮김) 심플디 2014.04.25 1542