2015. 2. 10.

[OpenGL]작은 태양계 만들기

 CTM을 활용하여 간단한 태양계를 만들어 보려고 한다. 태양, 지구, 달로 구성된 단순한 태양계이다. 그리고 CTM에서와 다른 점은 이번에는 물체들이 움직여야 한다는 점이다. 물체를 움직이게 하는 방법은 여러 가지가 있다. 어떤 방법을 사용해도 문제없다. 그럼 본격적으로 태양계를 만들어 보자.


태양 만들기
 먼저 간단하게 태양을 생성해보자. 색상을 지성하고, 좌표는 월드 좌표계의 원점이다. 그리고 glPushMatrix() 함수를 통해 현재의 CTM을 스택에 푸시하였다. 
 다음은 지구를 만들자. 지구는 태양을 중심으로 Day만큼 공전하고, Time만큼 자전한다. 이를 어떻게 구현해야 할까? 먼저 태양을 중심으로 지구를 회전시켜야 한다. 지구의 좌표계가 아닌 태양의 좌표계로 지구를 Day만큼 회전시키자. 그 다음 지구는 태양으로부터 7만큼 x축 방향으로 떨어져있다. 그리고 지구의 자전을 구현해야 한다. 지구의 자전은 태양이 아닌 태양으로부터 7만큼 떨어진 지구의 좌표계를 중심으로 이루어져야 한다. 그래서 glTranslate() 함수 후에 glRaotatef() 함수를 호출해야 한다. 만약 glRaotatef() 함수와 glTranslate() 함수의 순서를 자꾸면 현재와 전혀 다른 결과가 나타날 것이다. 왜 그런 결과가 나타나는지에 대해서도 설명할 수 있어야 한다.
 만약 위의 코드를 실행하면 어떤 결과가 나오겠는가? 먼저 태양으로부터  x축으로 7만큼 좌표계가 이동한다. 그리고 그 좌표계를 중심으로 Day, Time만큼 회전한다. 이전 코드와 어떤 점이 다른지 알겠는가? 만약 Day의 값이 증가한다고 생각해보자. 앞의 경우는 좌표계를 회전시킨 후에 이를 7만큼 이동시킨다. 결국 Day 값이 증가하면 할수록 지구는 태양을 공전하게 된다. 하지만 이번 경우는 태양을 중심으로 x축 만큼 7 이동시킨다. 이동시키는 방향은 일정하다. 앞의 경우는 좌표계를 Day 값에 따라 좌표계가 회전하였고, 회전한 좌표축을 기준으로 x축 방향으로 이동했으므로 지구는 결과적으로 공전하는 것처럼 보인다. 하지만 이번 경우는 x축 방향으로의 이동은 언제나 동일하다. 태양의 좌표계는 현재 고정된 상태이기 때문이다. 이동 후에 지구의 y축 방향으로 회전한다. 결국 지구는 제자리서 돌게 된다. 자전만 구현된다.
 이제 달을 만들어보자. 달은 지구를 중심으로 일정거리 떨어지고 지구의 좌표계를 중심으로 공전하면 된다. 즉 Time을 기준으로 회전하면 된다. 코드를 살펴보자. 지구의 좌표계가 Time만큼 회전한다. 그리고 회전한 좌표계를 중심으로 x축 방향으로 이동한다. 결과적으로 달은 지구를 중심으로 공전하게 된다.


키보드 이벤트 함수
 이 함수는 간단하다. 'd' 키를 누르면 Day값이 증가하고, 't' 키를 누르면 Time값이 증가한다. 앞에서 말했듯이 Day는 지구의 공전, Time은 지구의 자전을 나타내기 위해 사용한 변수이다.


정리하면

  • OpenGL은 물체의 변환보다는 좌표계의 변환으로 이해하자.
  • 변환함수를 사용하면 이 결과는 누적되어 CTM으로 보관된다. glPushMatrix() 함수를 통해서 특정시점의 CTM을 스택에 저장할 수 있다.

댓글 없음:

댓글 쓰기