Android OpenGL Lesson #5
민방위 훈련 담날부터 계속 출장이 있어서 공부 하나도 못했다. 수원 삼성 사업장에 파견 댕겨 왔는데, 인터넷도 안되고 할당 받은 IP 는 충돌 난다고 뜨고..개발폰으로 와이파이 잡아 인터넷 하면서 지루하게 하루를 보냈다. 비효율의 극치라고나 할까…
오늘 어떤 문제의 해답을 하나 찾았다. gl.glTranslatef(1, 0, 0) 에서 매개 변수 값들이 정확히 어떤 의미를 가지는 지 몰랐는데 알게 됐다.
gl.glTranslatef(1, 0, 0) 는 x 축을 따라 + 방향으로 1 만큼 이동한다는 것인데 도형의 x 축 방향 크기와 똑 같은 거리를 이동한다는 것이다. 그래서 위 그림처럼 되는 것이다. 그러면 GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f, 100.0f) 에서 near Z 가 0.1 이고 far Z가 100.0 이니까 – Z 방향으로 -99 만큼 이동 해도 도형이 보인다는 것 같다.(테스트 해 보지는 않았다). 즉, 1/100 크기까지 작게 볼 수 있다는 뜻이겠지.. -100 을 하면 안 보이고..
무의식이 한 일인지 아닌지 모르겠지만 이런 작은 지식이라도 혼자 힘으로 알게 되면 기분이 상쾌해진다^^*
오늘은 간단하게 정육면체 그리는 것 하나만 하고 끝내야겠다.
소스는 http://blog.jayway.com/2009/12/03/opengl-es-tutorial-for-android-part-i/
와 http://insanitydesign.com/wp/projects/nehe-android-ports/ 에서 참조했다.
public class AndroidOpenGL extends Activity {
private GLSurfaceView mSurfaceView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSurfaceView = new GLSurfaceView(this);
mSurfaceView.setRenderer(new CustomRenderer());
setContentView(mSurfaceView);
}
}
지난 포스팅까지 GLSurfaceView 를 상속 받은 클래스 만들어 썼는데 실제로 하는 일이 아무 것도 없었다. 왜 그렇게 썼는 지 모르겠다. 지금부터는 그냥 객체 하나 할당해서 해야겠다.
CustomRenderer.java 는 어제까지 소스와 다른 부분이 하나도 없다(첨부소스참조)
public class Cube {
……..
void draw(GL10 gl) {
gl.glFrontFace(GL10.GL_CCW);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColorBuffer);
gl.glRotatef(mRotateAngle, 1, 0, 0);
gl.glRotatef(mRotateAngle, 0, 1, 0);
//Draw the vertices as triangles, based on the Index Buffer information
gl.glDrawElements(GL10.GL_TRIANGLES, mNumOfIndex, GL10.GL_UNSIGNED_BYTE,
mIndexBuffer);
//Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
mRotateAngle += 0.5f; // 회전 효과 주기 위해 삽입
}
}
그려야 하는 꼭지점의 수가 많이 늘어 났다는 것과 그리는 방향만 고려해 주면 평면 사각형이나 삼각형 그리는 것과 차이가 없다.
육면체를 그렸는데 육면체가 아닌 것처럼 보인다
그래서 gl.glDrawElements(GL10.GL_LINE_LOOP, mNumOfIndices,
GL10.GL_UNSIGNED_SHORT, mIndicesBuffer);
이렇게 수정해서 실행했더니
mRotateAngle 은 회전하는 Cube 를 보여주기 위해 추가한 변수다.
[출처] Android Open GL #5|작성자 이외수와베르나르