[MFC :: OpenGL] 회전과 이동 (키보드)

심플디 2014.04.15 23:44 조회 수 : 2578


OpenGL의 회전은 그리 어려운 개념이 아니다.
그도 그럴것이 좌표에 대한 행렬을 함수화 했기 때문이다.
이 게시판의 [C :: OpenGL] 시리즈를 보면 필자가 직접 코딩한 회전함수가 있다.
만약 회전 방식이 찝찝하다면 필자가 코딩한 회전 함수를 써보는 것도 권장하는 바이다.

001.png

 <그림 01 :: 새로운 ID 추가>


002.png

 <그림 02 :: 툴바 아이콘 추가>


새로운 아이디를 생성할 것이다.

새롭게 추가된 아이디는 

ID_POSITION_ROTATE

ID_POSITION_MOVE

이며, 각각 툴바의 아이콘과 메뉴의 항목에 동시 적용 되어있다.

전혀 새로운 방식이 아니며, 바로 이전 게시물의 방법과 같다.


003.png

<그림 03 :: 메뉴에서 이벤트 함수를 추가>


004.png 

<그림 04 :: View 클래스에 이벤트 처리 함수 추가>


005.png

<그림 05 :: ID_POSITION_ROTATE 및 ID_POSITION_MOVE의 이벤트 처리 함수의 추가>


 

이전 게시글에서는 클래스 뷰를 통해서 이벤트 처리 함수를 추가하는 다소 불편한 방식을 기술 했었지만,

<그림 3>과 <그림 4>와 같이 편리하게 이벤트 처리 함수를 등록하는 방법도 존재한다.

참고로 <그림 3>과 <그림 4>는 ID_POSITION_ROTATE에 대한 것만 보여주고 있다. 

ID_POSITION_MOVE도 <그림 5>와 같이 똑같이 적용시켜 주어야 한다.


006.png

  <그림 06 :: 위치 조작 변수의 등록>


007.png

  <그림 07 :: 위치 조작 변수의 초기값 셋팅>


008.png

 <그림 08 :: 이벤트 처리기 수정>


<그림 6>과 <그림 7>을 통해 위치 조작 변수에 대한 선언 및 초기값을 설정 할 수 있으며, 

<그림 8>과 같이 위치 조작 변수에 대한 설정을 바꿀 수 있다.

009.png

<그림 09 :: 클래스 뷰를 통한 WM_KEYDOWN 메시지 처리 함수 추가>

 


010.png

 <그림 10 :: WM_KEYDOWN 메시지 처리 함수에 추가된 코드>


<그림 9> 및 <그림 10>과 같이 회전 이벤트 처리 메시지에 대한 적절한 코딩을 해준다.



011.png

<그림 11 :: ~View 클래스 내에서 멤버 함수 (메서드) 추가>

 


012.png

<그림 12 :: 메서드 내용 기입>



013.png

 <그림 13 :: GLRenderScene 메서드 수정>


<그림 11>과 <그림 12>까지만 해도 '아 쉽다.'라고 생각하다가, <그림 13>을 보고 '씨발' 이라고 외친 사람이 한 둘이 아닐 것 같다.


일단 RenderScene 메서드에서, 수정된 사항으로는, 깊이(Depth) 버퍼의 존재가 필요하게 되었다. 

3차원 회전을 해야 하기 때문이다.


그리고 좌표계를 통한 회전 메서드가 추가 되었다. 

이로써 회전 코드가 적용 될 것이다.


그리고 기존에 있던 2개의 사각형 그리기 코드를 날려버렸다.

있어도 되지만 코드가 쓸데없이 길어봤자 가독성만 떨어질 뿐이다.


마지막으로 6면체의 각 면에 대한 Polygon을 그렸다.




014.png

<그림 14 :: 회전된 6면체의 모습>


중간 확인차 디버깅을 하면 <그림 14>와 같은 모습을 볼 수도 있다.

현재 <그림 14>는 리소스를 통한 툴바 아이콘이 제대로 등록이 되지 않았을 뿐이지, 회전 아이콘이 엄연히 존재하고 있는 상태다... ㅠㅠ

또한 6면체의 형상도 상당히 일그러진 모습이다.

회전을 시키면 얼추 회전은 적용되는 것 같은데, 어쩔 때 보면 앞 뒤가 뒤집히는 듯한 착시현상까지 보일 정도다.


 

015.png

<그림 15 :: 깊이 테스트를 실시한다.>



016.png

<그림 16 :: 6면체 회전 모습>

 


이 문제를 해결하기 위해서 GLSetupRC를 통해, <그림 15>와 같이, 전체 행렬에 대한 깊이 테스트 코드를 적용시킨다.

이 코드는 출력되는 모든 Pixel에 대해서 앞 뒷면을 가린다.


즉, 같은 z축의 위치에 존재하는 모든 Pixel에 대해서, z축상에서 가장 위에 존재하는 Pixel만 출력하는 코드다.

이것을 z-buffer 알고리즘이라고 한다.


<그림 16>은 z-buffer 알고리즘이 적용된 OpenGL의 모습을 보여주고 있다.


그리고 믿기지 않겠지만, RenderScene 함수의 코드는 끝난것이 아니다.

<그림 17>을 보고 육면체 코드 아래로 코딩 하기 바란다.

 

017.png

 <그림 17 :: 점, 선, 면 의 그리기 코드가 수정된 모습>


사실 <그림 17>은 이전의 점,선,면 그리기 코드를 수정한 것이므로, 굳이 바꿀 필요는 없다.

하지만 재밌는 현상을 관찰하려면 이렇게 코딩하는것이 좋을 것 이다.


자, 마지막으로 이동에 대한 코딩을 해볼 것이다.

회전에 대한 형식과 크게 다르지는 않으므로 그림으로 대체하겠다.



018.png

<그림 18 :: WM_KEYDOWN 메시지 처리 메서드 수정>



019.png

 <그림 19 :: 위치 행렬 계산 메서드 수정>



혹시 이상하다고 느낀 점 없나?

맨 처음 화면에 보이는 사각형은 녹색인데 말이다.

우리는 분명히 z가 가장 높은 곳을 50, z가 가장 낮은 곳을 -50으로 잡고, 앞 뒷면을 생성했었는데,

그 중 앞면은 붉은 색이였으며, 뒷면은 녹색이였다.




020.png

 <그림 20 :: 클리핑 영역의 수정>


이 문제는 <그림 20>과 같이 클리핑 영역을 수정함으로써 해결 할 수 있다.

클리핑이란, 컴퓨터상의 좌표계를 내가 지정한 만큼의 좌표계로 잘라내어 내가 보고 있는 화면의 좌표에 붙여넣는 작업을 의미한다.

설명이 어렵다고 느껴지면, OpenGL 책을 참고하기 바란다.



021.png

<그림 21 :: 완성된 프로그램>


날 밤 새서 지금 오전 6시다.

인간적으로 기타 버그라든가, 툴바 아이콘이 제대로 안보이는것 등은 서로 눈감아 주자.




022.jpg EXIF Viewer사진 크기640x480

<그림 22 :: 내 마음>

 

 

라고 하고 싶지만, 그래도 고칠건 고쳐야지...ㅠㅠㅠㅠㅠㅠ





023.png

<그림 23 :: 코드 수정... 지친다 이제 ㅎㅅㅎ>


<그림 23>과 같이 코드를 수정해주자.

그럼 이제, 회전한 상태에서 이동 가능하고, 이동한 상태에서 회전이 가능한 모습을 볼 수 있다.


ps. 이동을 너무 많이 하면, 도형이 깨지는 현상을 볼 수 있는데, 이것은 클리핑 영역 밖으로 나갔기 때문이다.

번호 제목 글쓴이 날짜 조회 수
공지 본 게시글의 첨부파일 권한 심플디 2014.08.22 3956
47 [MFC :: OpenGL] Zoom in / Zoom out (+ Wheel 버튼 활용) (옮김) [2] file 심플디 2014.04.25 4665
46 [MFC :: OpenGL] 컴공 수업 발표 자료 (옮김) [2] 심플디 2014.04.25 4018
45 [MFC :: OpenGL] 회전과 이동 (마우스) [2] file 심플디 2014.04.15 3200
44 [MFC :: OpenGL] OpenGL 시작하기 -> 설명 file simpled 2013.09.22 2659
» [MFC :: OpenGL] 회전과 이동 (키보드) file 심플디 2014.04.15 2578
42 [MFC :: OpenGL] OpenGL 시작하기 [2] file simpled 2013.09.22 2570
41 [MFC :: OpenGL] IGES 파일 포맷 분석 [2] file simpled 2013.09.22 2560
40 [MFC :: OpenGL] DXF 파일 포맷 분석 file 심플디 2013.09.22 2335
39 [MFC :: OpenGL] MFC CODE (작도 및 컨트롤) file simpled 2013.09.22 2327
38 [MFC :: OpenGL] 리소스 추가2 & 점, 선, 면 file 심플디 2013.10.28 2281
37 [MFC :: OpenGL] DXF 파일 포맷의 기본 지식 simpled 2013.09.22 2276
36 [MFC :: OpenGL] 움직이는 사각형 (옮김) file 심플디 2014.04.25 2246
35 [MFC :: OpenGL] 조명 설정 (옮김) 심플디 2014.04.25 2203
34 [MFC :: OpenGL] 리소스 추가 1 file simpled 2013.09.22 2189
33 [MFC :: OpenGL] Tool bar(툴바) 편집방법 (옮김) 심플디 2014.04.25 2119
32 [MFC :: OpenGL] 바닥과 좌표 축 설정 (옮김) file 심플디 2014.04.25 2110
31 [MFC :: OpenGL] Data Dialog 와꾸짜기 (옮김) 심플디 2014.04.25 2015
30 [MFC :: OpenGL] 비트맵(이미징), 텍스쳐 (옮김) 심플디 2014.04.25 2010
29 MFC :: OpenGL] ProjectMFCReport 와꾸짜기 (옮김) 심플디 2014.04.25 1986