본문 바로가기

Programming/OpenGL

OpenGL Transformations_Modeling

3차원 세계에서 변환이라는 것은 물체를 옮기는 것을 의미 해요. 앞선 포스팅에서 카메라에 대해서 볼 때 미리 보긴 했지만, 정점들의 위치를 바꾸는 것이죠.(그 전에도 기본적인 개념에 대해서는 구구절절 설명 했어요 :D)

OpenGL에서는 다음과 같은 함수로 정점들의 위치를 "이동" 할 수 있어요.
  • 함수 원형
    void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
    void glTranslated(GLdouble x, GLdouble y, GLdouble z);
    

  • 인자
    x, y, z : 각 축에 대해서 이동시킬 양

  • 반환 값
    void

  • 처리
    임의의 정점들을 x, y, z만큼 이동 시키는 행렬을 현재 행렬에 곱한다.

    함수의 이름에서 그 인자의 타입에 대해서 바로 알 수 있도록 되어 있죠. f면 float타입, d면 double 타입. 3차원 세계에서 int나 long 타입은 사용 할 수가 없어요. 실수형 타입이 정수형 타입에 비해서 정확하진 않을지언정 수치를 표현하는 범위 자체가 어마어마 하기 때문이에요.

    지난 포스팅에서도 언급을 살짝 하긴 했지만, 별다른 울타리를 쳐 놓지 않게 되고 변환에 관련된 함수를 사용하게 되면, 하부에 있는 모든 정점들에 대해서 모든 정점들이 영향을 받게 된답니다. 당장은 그냥 그렇구나~ 하고만 넘어가세요. :D


    아래에 예시 코드를 볼까요?
    // 이제 부터 사용할 행렬을 지정
    glMatrixMode(GL_MODELVIEW);
    
    // 현재 사용되는 행렬을 단위행렬로 세팅
    glLoadIdentity();
    
    // x, y, z각 축으로 5.0씩 하는 행렬을 내부적으로 곱
    glTranslatef(5.0f, 5.0f, 5.0f);
    
    // 사각형을 그린다.
    DrawCube();
    

    (0, 0, 0)에 정육면체가 있었다고 한다면, 위와 같은 그림으로 정육면체가 이동 해버리는 거죠.


이런 변환에는 회전이 있어요. 이동과 마찮가지로 하부에 있는 모든 정점들이 회전이 적용 되어버리는 거죠. 함수는 다음과 같아요.
  • 함수 원형
    void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
    void glRotated(GLdouble angle, GLdouble x, GLfloat y, GLdouble z);
    

  • 인자
    angle : 회전시킬 각도(degree)
    x, y, z : 축이 될 벡터 값

  • 반환 값
    void

  • 처리
    (x, y, z)를 회전의 기준이 되는 축으로 angle만큼 정점들을 회전시키는 행렬을 현재 행렬에 곱한다.

    축이 되는 벡터는 어떻게 숫자를 넣어도 내부적으로 단위 벡터(크기가 1인) 변경 되어서 입력크기에 대해서는 생각하지 않아도 되요. 하지만, 회전이 되는 축이 되므로 방향은 중요하겠죠.

    만약 x축을 기준으로 회전하고 싶다면 x, y, z에 x축 방향에 대한 값인 (1, 0, 0)을 넣어 주면 되겠죠?

     x축을 기준으로 90도 만큼 회전 시킨 거에요:) (이 포스팅을 작성하는 그림들을 파워포인트로 작성 중인데 정육면체 45도 같은 거 회전시키기가 힘드네요ㅋㅋ)

변환 처리의 마지막인 확대 축소가 남았어요. 이걸 Scaling이라고 하는데, 앞으로는 그냥 확대라고 할게요. (0.5배 확대는 1/2 만큼 축소시키는 거랑 같은 의미니까요. 번역에서는 별다른 말이 생각이 안나네요ㅠ)
  • 함수 원형
    void glScalef(Glfoat x, GLfloat y, GLfloat z);
    void glScaled(GLdouble x, GLdouble y, GLdouble z);
    

  • 인자
    x, y, z : 해당 축으로 확대시킬 비율(1.0 이면 변환을 하지 않는다)

  • 반환 값
    void

  • 처리
    각 축으로 확대시키는 행렬을 현재 행렬에 곱한다.

    이 부분에 대해서는 임의의 축으로 확대 시키는 변환이 별도로 있지는 않아요;_; 단순히 "x, y, z 축을 기준으로 몇 배씩 확대해라~" 만 할 수 있거든요.

     x축을 기준으로 2배 확대 한 거에요. 보시면 아시겠지만, 좌우로 동시에 길어 졌죠? 좌측 하단의 점만을 보았을 때 (-1, 0, 1) 은 (-2, 0, 1) 이 되는 거니까, 축의 양방향으로 길어지게 되는 거에요. 그럼 그걸 감안해서 실제로 너비 자체가 "2배"를 시키고 싶으면 양쪽으로 1.5배씩만 되도록 해야 겠죠?(@ㅂ@ㅋㅋ)

이번 포스팅에서는 OpenGL에서 제공되는 함수로 내부적으로 변환 행렬을 만드는 것을 알아봤는데, 다음은 만들어진 행렬이 어떤식으로 동작하게 되는지에 대해서 알아볼게요. 뭐… 기본이라 함은 어느 하나 안 중요한건 없지만, 다음 포스팅은 특히 잘 알아두어야 햇갈리지 않을까 생각해요 :D

 참조 : OPENGL GAME PROGRAMMING(Foreword by Mark J.Kilgard)

'Programming > OpenGL' 카테고리의 다른 글

OpenGL Transformations_Projection  (0) 2012.04.03
OpenGL Transformation_Matrix  (4) 2012.03.22
OpenGL Transformations_Viewing(Camera)  (0) 2012.03.15
Understanding Coordiante Transformations  (0) 2012.03.13
OpenGL primitives_2  (2) 2011.12.24