Android OpenGL Lesson #4
민방위 훈련이 있어서 반차 내 놓고는 별로 할 일도 없고 해서 계속 올리고 있다..생각 보다는 빨리 진행되는 데 밑천 떨어지면 아마 세배는 더 시간이 걸릴 것 같다.
지난 강의 까지는 도형의 색 칠하는 것까지 했는데 오늘은 좌표 축을 중심으로 도형을 회전시키는 것을 알아 보도록 하겠다. (Nehe 의 영어는 참 쉽게 설명 돼 있는데 한글로 옮기는 게 더 어렵다.)
잠깐 중학교 수학 시간으로 돌아가서 직교 좌표계에 대해서 공부.
공부할 게 없구나…그럼 회전(Rotation) 에 대해서 공부!
만약 gl.glRotate(degree, x, y, z) 하는 메소드가 존재한다고 가정해 보자. 그랬을 때 gl.glRotate(90, 1, 0, 0) 이라고 하고 실행하면 x 축을 기준으로 반시계 방향(오른쪽) 으로 90도 만큼 회전하는 것이라고 대충 짐작할 수 있을 것이다.
아래는 다른 사이트에서 참조한 것이니 자세한 것은 직접 방문해 보시기 바란다.
http://blog.jayway.com/2010/01/01/opengl-es-tutorial-for-android-–-part-iii-–-transformations/
gl.glRotatef(90f, 1.0f, 0.0f, 0.0f); // OpenGL docs.
gl.glRotatef(90f, 0.0f, 1.0f, 0.0f); // OpenGL docs.
gl.glRotatef(90f, 0.0f, 0.0f, 1.0f); // OpenGL docs.
중학교 IQ 테스트 문제 같다.. X 축을 기준으로 90 도 회전하면 y 축이 z 축의 방향이 되고 z 축은 –y 방향이 된다는 것만 이해하고 나면 Y:1, Z:1 도 금방 이해 될 것이다. 세 그림은 연속된 회전을 시도한 경우다. 어떤 책에 보면 벡터의 개념으로 설명한 것도 있는데 지금 다시 중학교 수학을 배우기는 힘든 노릇이고 지금 단계에서는 감각적으로만 이해해도 될 것 같다.
그럼 실제로 도형을 한 번 회전 시켜 보도록 하자.
1) 세모 (세모와 삼각형의 차이는 뭘까?) 회전 시키기
Triangle 클래스에 있는 draw() 안에 다음 한 줄을 삽입한다.
gl.glRotatef(45.0f, 0, 0, 1); z 축을 기준으로 45 도 반시계 방향으로 회전시키라는 뜻이다. z 축의 + 방향은 휴대폰 화면에서 사용자를 향하고 있기 때문에 그냥 삼각형이 평면에서 45 도 회전한 거랑 똑같다. 45도만 돌린 이유는 90 도 돌리면 회전했는지 안 했는지 구분이 잘 안 가기 때문이다. 삼각형, 사각형이 같이 돌아간 것은 glRotatef() 메소드가 전체 좌표계를 돌려 버렸기 때문이다.
그래서 사각형 그릴 때는 좌표계를 초기화 해 줘야 한다.
Quad 클래스의 onDraw() 에 gl.glLoadIdentity(); 를 추가해 줘야 한다. 그럼 이걸로 끝이냐? 본인도 이것만 넣으면 되는 줄 알고 실행했더니 사각형이 어디로 사라져서 보이지 않는 것이었다. 0.5 초 동안패닉에 빠져 있다가 깨어나서 한 줄 밑에다가 gl.glTranslatef(0.0f, 0.0f, -6.0f); 추가하고 실행했더니 기대했던 결과가 나왔다.
[출처] Android Open GL #4|작성자 이외수와베르나르