Cube 만들기

정육면체는 6개의 사각형으로 구성되어있습니다. 즉 OpenGL로 표현하기 위해서는 12개의 삼각형이 필요합니다.

그렇다면 사각형을 그리기위한 정점은 몇개가 필요할까요?

정답은 없습니다.

정점을 삼각형 갯수 만큼 잡는다면,
3개(삼각형 정점 수) * 12개(필요한 삼각형 수) = 36개가 필요할 것이고,

중첩되는 정점을 활용한다면 정점 배열의 사이즈를 아낄수도 있습니다.
그래서 전 중첩되는 정점을 활용하여 큐브의 꼭짓점 수 만큼 정점을 선언해 큐브를 만들어 보겠습니다.

float[] vertices = new float[]{ 
   -0.5f, -0.5f, -0.5f,
    0.5f, -0.5f, -0.5f,
    0.5f, 0.5f, -0.5f,
   -0.5f, 0.5f, -0.5f,
   -0.5f, -0.5f, 0.5f,
    0.5f, -0.5f, 0.5f,
    0.5f, 0.5f, 0.5f,
   -0.5f, 0.5f, 0.5f
};

위의 정점을 이용하여 삼각형을 그리는 순서를 정의해보겠습니다.

byte[] indices = new byte[]{
    0, 1, 3, 3, 1, 2, // Front face.
    0, 1, 4, 4, 5, 1, // Bottom face.
    1, 2, 5, 5, 6, 2, // Right face.
    2, 3, 6, 6, 7, 3, // Top face.
    3, 7, 4, 4, 3, 0, // Left face.
    4, 5, 7, 7, 6, 5, // Rear face.
};

큐브에 색상도 입히기 위해 색상도 지정해보겠습니다.

float[] colors = new float[]{
    0.0f, 1.0f, 1.0f, 1.0f,
    1.0f, 0.0f, 0.0f, 1.0f,
    1.0f, 1.0f, 0.0f, 1.0f,
    0.0f, 1.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f, 1.0f,
    1.0f, 0.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f, 1.0f,
    0.0f, 1.0f, 1.0f, 1.0f,
};

 

모델(큐브)은 원점에 두고, 카메라(뷰)만 뒤로 빼서 모델을 바라보도록 MVP매트릭스를 지정했습니다. 매트릭스는 기존에 삼각형, 사각형 그릴때와 동일하기 때문에 생략했습니다.

더 자세한 정보는 MVP매트릭스편을 확인해보시기 바랍니다.

완성된 모습입니다.

그런데 왜 큐브가 아닌 사각형일까요?
아닙니다 큐브가 맞습니다. 다만 큐브의 앞면을 제외한 옆, 위, 아래, 뒷면을 카메라가 보지 못하고 있기 때문입니다. 카메라를 이동시키거나, 큐브를 돌린다면 다른 면도 볼수 있을 것입니다.

큐브 돌리기

private long lastUpdateMillis = 0;
private int REFRESH_RATE_FPS = 60;
private long FRAME_TIME_MILLIS = TimeUnit.SECONDS.toMillis(1) / REFRESH_RATE_FPS;
private float rotation = 0f;
private float ROTATION_INCREMENT = 1f;
private void updateRotation() {
    long currentTime = SystemClock.elapsedRealtime();
    if (lastUpdateMillis != 0L) {
        long factor = (lastUpdateMillis-currentTime) / FRAME_TIME_MILLIS;
        rotation += ROTATION_INCREMENT * factor;
        rotation = rotation%360; //OpenGL에서 처리해주기 때문에 생략 가능
    }
    lastUpdateMillis = currentTime;
}

@Override
public void draw(float[] matrix) {
    super.draw(matrix);
    updateRotation();
    Matrix.setRotateM(modelMatrix,0, rotation, 1.0f, 1.0f, 1.0f);
}

1Frame을 그릴때 이전 프레임을 그렸던 시간과 비교하여 얼마나 큐브를 회전해야할지를 계산 하는 방법입니다. 

Matrix.setRotateM(…) 을 이용하여 계산된 회전값을 모델 메트릭스에 적용합니다.

 

카테고리: Graphics

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.