- View Cube란?

사용자가 View를 조작할 수 있게 도와주는 기능. 사용자는 View Cube를 드래그 함으로써 Model의 View를 자유롭게 변환 가능하다. 현재 View에서 X축을 기준으로 회전, Y축을 기준으로 회전, 또는 Isometric View로의 전환 등 기존의 방식에서 더욱 나아가 좀 더 정교한 방식으로 View 조작을 가능케 하는 것이 View Cube 이다.
2. 어떻게 View Cube?
결국 View Cube와 View Cube를 통해서 조작되는 Model View 모두 컴퓨터 그래픽이다. 따라서 컴퓨터 그래픽을 구현하기 위해서 사용되는 가장 대표적인 오픈소스 중의 하나인 OpenGL을 사용하게 되었고 이에 대해 공부하고 활용한 내용을 정리하였다. 다만, Gen/Civil의 코드가 20년이 넘었기 때문에 Legacy Opengl을 완전히 지울 수 없었고 Modern Opengl의 쉐이더와 같은 개념을 이용하기 보다는 행렬연산을 통해 View Cube를 구현하게 되었다. 현재 널리 쓰이는 기술과는 거리가 있지만 컴퓨터 그래픽의 이론적 배경을 익힐 수 있다는 점에서 공부하고 정리할 가치가 있다고 생각하였다.
결국 View Cube 구현의 핵심은 아래의 그림 2처럼 ModelView Matrix에 달려있다. Main View상에 보이는 교각도 하나의 Model로 볼 수 있고 View Cube 자체도 View Cube Window에 있는 하나의 Model로 볼 수 있으므로 두개의 Model View Matrix를 동기화 시키면 View Cube의 회전이 Main View 상의 모델을 회전 시킬 수 있다. 마찬가지로 Main View 상의 모델이 회전하면 View Cube가 회전하게 된다.

Model View Matrix는 회전 + 평행이동 + 스케일링이 조합된 4X4 행렬….

3. Model View Matrix가 좌표에 작용하는 과정.

위의 그림 4 처럼 각각의 Object는 고유의 좌표계를 가지고 있고 그 좌표계를 기준으로 점들의 집합이 Object를 이루게 된다. 이때, 아래의 그림 5처럼 이 좌표들에 Model Matrix를 곱하면 World 좌표계를 기준으로 Object의 점들의 좌표값을 얻을 수 있다. 또한 다시 카메라 또는 시점의 좌표계를 기준으로 Object들의 좌표값을 구하기 위해 View Matrix를 곱해주면 카메라 또는 시점을 원점으로 하는 좌표계를 기준으로 모든 Object들의 좌표값을 구할 수 있게 된다.

그렇다면 카메라 또는 시점을 기준으로 Object들의 3차원 좌표값을 구하였다. 이는 컴퓨터 상에 존재하는 가상의 3차원 정보인데 이 정보를 사람이 모니터를 통해서 확인하려면 무엇을 더 해야 할까? 이때 이루어지는 것이 렌더링 이라는 작업이고 컴퓨터 그래픽의 정수라고 볼 수 있다.
4. 컴퓨터 그래픽이란?
평소에 컴퓨터 그래픽을 실생활에서 많이 접하지만 핵심이 되는 개념을 이번에 공부하면서 알게 되었다. 얼핏 생각하면 3차원 컴퓨터 그래픽이 3D만 다루는 것이라고 생각할 수도 있다. 그러나 결국 모니터나 스크린은 2D 평면이고 이를 통해 인간에게 시각 정보가 전달되게 된다. 즉, 3D 컴퓨터 그래픽은 컴퓨터 메모리 안 가상의 3차원 정보를 2차원 스크린에 투영되어 보이게 만드는 지에 대한 기술이다. 아래의 그림 6을 통해 직관적으로 이해가 가능할 것이다.

그렇다면 이전 스텝에서 구한 카메라 또는 시점을 기준으로 한 물체의 3차원 좌표값에서 2차원 화면의 픽셀로 나타낼려면 아래의 그림 7처럼 Projection Matrix를 좌표에 곱해줌으로써 3차원이 2차원 평면에 Projection된 이미지 좌표값을 얻을 수 있다. 우리는 이러한 이미지 좌표값의 집합을 봄으로써 2차원에서 투영된 3차원 좌표값들을 보는 것이다.

앞서 설명한 것의 전체적인 요약은 아래의 그림 8에 파이프라인과 같다.
컴퓨터 그래픽, 파이프라인

5. 사용자 이벤트 처리의 중요성.
사용자가 마우스를 갖다 댈 때, 해당 부분이 어떤 부분인지 인식을 하는 방법은?! 바로 Selection 그중에서도 View cube 구현을 위해서 Color Code라는 심플한 방법을 사용하였다.


CG 영화처럼 일방적으로 렌더링된 View가 제공되는 것이 아니라 사용자의 행동에 따라 실시간으로 렌더링된 View의 모습이 바뀌어야 하는 컴퓨터 그래픽이 가미 된 제품의 경우 특정 사용자의 행동에 따라 변수의 값이 어떻게 할당되고 특정 Flag가 어떻게 바뀌고 이때 어떤 변수가 어떻게 바뀌고 또한 이 모든 것들의 순서가 매우 중요하다. 특히 초기화와 순서의 중요성은 아무리 강조해도 지나치지 않다….


진행하면서 발생했던 핵심 토픽들...
- PushMatrix()와 PopMatrix의 짝을 맞추는게 중요함....!
- 행렬이 곱해지는 순서의 중요함.... 회전같은 경우 역행렬의 관계에 있는 것을 Transpose를 이용해서 순서를 구하면 쉽다.
- 좌표계의 이해를 위해서 Local Axis를 이용한 Top-Down 방식과 Global Axis를 이용한 Bottom-Up 방식이 존재한다.
- 클릭, 마우스이동, 마우스 클릭 때기 등의 동작의 순서와 그에 따른 Flag와 변순의 변화들....
- Color Coding을 이용한 Selection, 원래 버퍼에 그리는 방식과 새로운 버퍼에 저장하는 방식...
- Frame이 그려지는 것과 사용자 Input, Model View Matrix의 관계
- Frame buffer, front buffer, back buffer 등등...
- glReadPixels에서 xpos와 viewport[3]-ypos를 사용하는 이유.
- 로드리게스 회전과 Quaternion을 이용한 회전...!
10. 현재 상태를 나타내는 변환행렬의 저장과 연속성
11. 동차좌표계의 의의와 용도
'CS > 컴퓨터 그래픽' 카테고리의 다른 글
| GDI(Graphics Device Interface)에 관하여 (0) | 2023.08.16 |
|---|---|
| 두 직선의 교점과 두 벡터의 외적을 이용한 평행이동 (0) | 2023.08.09 |