OpenGL

[OpenGL-4] Callback and Transformation

zamezzz 2016. 10. 30. 22:24

안녕하세요.


네번째 포스팅입니다 ^^


오늘은 cube를 만들고, 여러 콜백함수를 통해 이를 제어하는 프로그램을 만들예정이었지만...


그 전에 좀 더 확실히 하기 위해 콜백함수와 여러 변형에 대해서 알아보려고 합니다.


후에는 정말로 프로그램을 만들어 봅시다~


  4.1 Callback


Callback 함수에 대해서 들어보신적 있으신가요? 어느 언어를 사용하던지 꼭 듣게되는 녀석입니다


opengl의 glut라이브러리 역시 callback 함수를 가지고 있는데요.


Main event loop에서 여러 callback함수를 제어합니다. 


그럼 먼저 callback함수의 종류에 대해 알아보겠습니다.


* Display() : 윈도우가 그려질 때

* Idle() : 아무 이벤트가 없을 때

* Keyboard(unsigned char key, int x, int y)

* Menu()

* Mouse(int button, int state, int x, int y)

* Motion()

* Reshape(int w, int h)


우리가 일반적으로 알고있는 callback함수와 크게 다를 것이 없습니다.


이러한 callback함수 사용을 위해 main문 마지막에 glutMainLoop();를 넣어줍니다.


기억하시죠? 역할은 프로그램의 이벤트 루프를 초기화 해준답니다.


기본적인 callback함수 사용법은 매우 간답합니다. 앞으로 프로그램에서 사용하며, 하나하나씩


직접 적용해나가며 배워봅시다!


  4.2 Homogeneous coordinate


그래픽스에서 중요한 개념인 Transformation입니다. 즉 변형이죠...


객체를 이런저런 모습으로 변형시키고, 움직이고 하는데 있어 꼭 필요합니다!


이는 보통 행렬 계산으로 이루어집니다. 


여기서 중요한 개념 하나는 Homogeneous coordinate입니다. 동차좌표라고도 하죠!


(x,y,z)를 (x,y,z,w)로 표현한답니다. 여기서 원래 좌표를 구하기 위해서는 w=1로 맞추어요


즉 (x/w, y/w, z/w, 1) 이렇게 변환 후 1을 때어낸 (x/w, y/w, z/w)가 원래 좌표입니다!


이는 perspective projection을 다루는데 아주 유용하답니다.


하지만 여기서 문제가 하나 있어요. 아래 식과 함꼐 알아봅시다 ㅎㅎ 그 문제와 해결책을요!!



Homogeneous coordinate관점에서 보면 (1,1,0,1) = (2,2,0,2)는 같습니다.


하지만 이 좌표간의 수학연산을 하게 되면 결과값은 위 식처럼 달라지게 되어요.


이는 원점에 따라 매우 차이가 나는 모습을 보여줍니다.


W가 0이 아닌 상수이면 스칼라입니다. 즉 원점에 따라 그 차이가 있죠


이 문제를 해결하기 위해서는 벡터를 활용하면 됩니다. w가 0이면 벡터입니다.


벡터는 절대적이므로, 이러한 문제를 해결할 수 있죠!



  4.3 Transformation


이제 정말로 Transformation을 알아보죠~

shear에서 d는 기울기를 뜻해요


개념은 위와 같습니다. 실제 프로그램에서는 함수를 이용하여 간단하게 할 수 있습니다.


하지만 위와 같은 개념을 충분히 숙지해야합니다. 순서가 중요하기 때문이죠!


회전하고 크기 변환하는 것과 크기 변환하고 회전하는 것은 같은 값이라도 순서에 따라


정말 다른 객체로 바뀌기 때문이죠!


이처럼 기본적인 개념만 충분히 숙지한다면, 프로그래밍하는데 정말 쉽고 간단해요.


오늘 배운 개념을 잘 숙지하고 다음 포스팅에서 실제 프로그램을 함께 만들어 봅시다!


그럼 이만 마칠게요. 감사합니다~

반응형

'OpenGL' 카테고리의 다른 글

[OpenGL-6] Model View Matrix  (2) 2016.11.13
[OpenGL-5] Cube Control Program  (1) 2016.11.02
[OpenGL-3] GLSL이란  (0) 2016.10.24
[OpenGL-2] OpenGL 시작하기  (3) 2016.10.20
[OpenGL-1] OpenGL이란  (2) 2016.10.13