오다기리 박의 알고리즘 노트

[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 06. 모델변환과 시점변환 본문

컴퓨터 그래픽스/OpenGL

[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 06. 모델변환과 시점변환

오다기리 박 2019. 2. 14. 21:10

OpenGL로 배우는 3차원 컴퓨터 그래픽스


Chapter 06. 모델변환과 시점변환

Section 01. 좌표계

  • 3차원 물체의 표현

    • 메쉬 표현…

  • 벡터 공간

    • 주어진 벡터로부터 파생되는 모든 벡터의 집합

  • 어파인 공간

    • 점을 마치 벡터의 동족처럼 취급함으로써 벡터공간을 확장한 것

  • 좌표축 / 좌표계

    • 기저 벡터끼리는 선형 독립이여야 한다.

    • 차원 : 점의 위치를 표현하기 위한 기저 벡터의 수

    • 좌표 : 각각의 기저 벡터에 곱해지는 계수

    • 좌표계 : 원점과 기저벡터로 구성되는 프레임

  • 동차 좌표


Section 02. 기하변환

  • 기하변환

    • 물체의 이동, 회전, 크기조절 작업

  • Translation

  • Rotaion

    • 하나의 객체를 x, y, z축 주위로 각각 ∮라디안만큼 회전시킨다.

  • Scaling

    • 균등, 차등이 존재

  • 쉬어 변환

    • 점 p가 <math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mfenced><mrow><msub><mi>p</mi><mi>x</mi></msub><mo>+</mo><mi>s</mi><msub><mi>p</mi><mi>z</mi></msub><mo>,</mo><mo>&#xA0;</mo><msub><mi>p</mi><mi>y</mi></msub><mo>,</mo><mo>&#xA0;</mo><msub><mi>p</mi><mi>z</mi></msub></mrow></mfenced><mi>T</mi></msup></math>로 이동

  • 복합변환

    • 효율을 높이기 위함

  • Reflection

    • 특정 좌표 부호를 반대로 한다

  • 구조왜곡(Structure Deforming)

    • 테이퍼링 (Tapering)

    • 휨(Bending)

    • 비틀림 (Twisting)

  • 변환의 분류


Section 03. GL 모델변환 (Modeling Transformation)

  • 모델좌표계와 전역좌표계

    • 물체의 정점은 물체 하나를 설계할 때의 좌표계 ~ 한 장면에 여러 물체를 모아 놓았을 때의 좌표계 ~ 그 장면을 바라보는 시점에 따른 좌표계 등을 거쳐가며 새로운 좌표값으로 바뀌어 최종적으로 화면에 그려진다.

    • GL 프로그램 처음 실행 시 전역 좌표계와 모델 좌표계가 일치되어 있음

    • 물체에 변환을 가하면 GL은 전역좌표계를 모델좌표계로 일치시키기 위한 변환을 가하고 이를 기준으로 모델좌표계에서 정의된 물체를 그려낸다.
      <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>P</mi><mrow><mi>W</mi><mi>C</mi><mi>S</mi></mrow></msub><mo>=</mo><mi>M</mi><mo>&#xB7;</mo><msub><mi>P</mi><mrow><mi>M</mi><mi>C</mi><mi>S</mi></mrow></msub></math>

  • GL 파이프라인

    • 설계된 물체 또는 그래픽 라이브러리에서 가져온 물체를 장면에 맞도록 기하변환시키는 것을 모델변환(Modeling Transformation)이라고 한다.

    • 변환된 물체를 관찰하기 위해 카메라 위치와 방향을 설정하는 것을 시점변환, 뷰변환(Viewpoint Transformation, View Transformation)이라고 한다.

    • 카메라의 렌즈를 선택하고 촬영하여 물체의 2차원 영상을 필름에 맺히게 하는 것이 투상변환(Projection Transformation)

    • 그렇게 해서 찍혀진 사진의 크기를 줄이거나 늘리는 작업이 뷰포트변환(Viewport Transformation)

    • 행렬의 내용은 프로그램에 의해 결정되지만 저장된 값에 의거하여 최종적인 기하변환을 가하는 것은 GL 파이프라인 프로세서의 몫이다.

  • 모델변환

    • 1. 행렬 모드(Matrix Mode) 설정 : 변환의 종류를 명시

      • void glMatrixMode(GLenum mode);

    • 2. 행렬 내용 채우기 : 원하는 변환 가하기 (전역좌표계를 기준으로 모델좌표계를 어떻게 변환하는지에 관한 정보를 현 변환행렬에 저장한다.)

      • void glLoadIdentity(); -> 현 변환행렬이 I로 초기화됨

      • void glLoadMatrixf(const GLfloat *M); -> 행렬 M을 현 변환행렬로 올린다.

      • void glMultMatixf(const GLfloat *M); -> 현 변환행렬(후위곱셈)에 M 행렬을 곱한다.

      • 변환작업 자체를 명시

        • void glTranslatef(GLfloat dx, GLfloat dy, GLfloat dz); -> 모델좌표계를 전역좌표계로부터 이동

        • void glScalef(GLfloat sx, GLfloat sy, GLfloat sz); -> 모델좌표계 눈금 크기조절

        • void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -> 모델좌표계를 전역좌표계로부터 반시계방향으로 회전

    • 예)

  • 복합변환에 의한 모델링

    • 물체변환(Object Transformation)

      • 고정된 전역좌표계를 중심으로 물체를 움직이는 것.

      • 일단 이미 물체가 전역좌표계 원점에 그려져 있다고 가정하고 물체를 원하는 곳으로 가져다 놓는 방법.

    • 좌표계변환(Coordinate Transformation)

      • 후위곱셈

      • 모델좌표계를 움직이는 방법.

      • 아직 물체가 그려지지 않은 것으로 가정하고 모델좌표계를 원하는 곳으로 가져다 놓은다음 최종적인 모델좌표계를 기준으로 물체를 그려내는 방법.

      • GL의 명령어 순서의 기준.

  • 행렬스택

    • 행렬 스택은 모델좌표계가 변해온 과정을 저장하기 위한 것이다.

    • void glPushMatrix(); -> 현 변환행렬의 복사본을 스택 탑에 삽입하고 그것이 새로운 현 변환행렬이 되게 함.
      void glPopMatrix(); -> 스택 탑의 행렬을 삭제함으로써 그 바로 아래있던 이전의 현 변환행렬을 현 변환행렬로 복원함.

  • 계층구조 모델링 (Hierarchy Modeling)

    • 순방향 키네마틱스(Forward Kinematics)

      • 계층구조의 상위에서 점차 하위로 내려오면서 사용자가 직접 필요한 만큼의 각도를 지정하여 회전시킴으로써 최종적으로 원하는 자세를 만들어 내는 것

      • 장점 : 사용자 마음대로 필요한 자세를 만들어 낼 수 있다

      • 각 관절마다 회전각을 사용자가 직접 입력해야 한다.

    • 역방향 키네마틱스 (Inverse Kinematics)

      • 계층구조의 가장 아래에 있는 물체 위치를 명시하면 상위 물체의  움직임을 컴퓨터 내부에서 자동으로 계산되게 하는 방법

      • 예) 손이 그 위치에 존재하기 위해 나머지 모든 객체들이 해당 관절을 중심으로 몇 도를 회전해야 하는지에 대한 계산


Section 04. GL 시점변환 (View Transformation)

  • GL 파이프라인

    • 설계된 물체 또는 그래픽 라이브러리에서 가져온 물체를 장면에 맞도록 기하변환시키는 것을 모델변환(Modeling Transformation)이라고 한다.

    • 변환된 물체를 관찰하기 위해 카메라 위치와 방향을 설정하는 것을 시점변환, 뷰변환(Viewpoint Transformation, View Transformation)이라고 한다.

    • 카메라의 렌즈를 선택하고 촬영하여 물체의 2차원 영상을 필름에 맺히게 하는 것이 투상변환(Projection Transformation)

    • 그렇게 해서 찍혀진 사진의 크기를 줄이거나 늘리는 작업이 뷰포트변환(Viewport Transformation)

    • 행렬의 내용은 프로그램에 의해 결정되지만 저장된 값에 의거하여 최종적인 기하변환을 가하는 것은 GL 파이프라인 프로세서의 몫이다.

  • 시점좌표계 설정

    • 단순 시스템

    • 렌더맨

    • 비행 시뮬레이션

    • PHIGS, GKS

      • 다양하고 자유로운 카메라 설정이 가능한 카메라 좌표계

  • GL의 시점좌표계

    • GL의 시점좌표계는 다음 세 가지 요소에 의해 정의

      • 카메라 위치

      • 카메라가 바라보는 점, 즉 초점(Focus, Target)의 위치

      • 카메라 기울임(Orientation)

    • 뷰행렬과 모델행렬

      • <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>P</mi><mrow><mi>W</mi><mi>C</mi><mi>S</mi></mrow></msub><mo>=</mo><mi>M</mi><mo>&#xB7;</mo><msub><mi>P</mi><mrow><mi>M</mi><mi>C</mi><mi>S</mi></mrow></msub></math> 모델행렬은 전역좌표계를 모델좌표계로 일치시키는 행렬
        <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>P</mi><mrow><mi>V</mi><mi>C</mi><mi>S</mi></mrow></msub><mo>=</mo><mi>V</mi><mo>&#xB7;</mo><msub><mi>P</mi><mrow><mi>W</mi><mi>C</mi><mi>S</mi></mrow></msub><mo>=</mo><mi>V</mi><mo>&#xB7;</mo><mi>M</mi><mo>&#xB7;</mo><msub><mi>P</mi><mrow><mi>M</mi><mi>C</mi><mi>S</mi></mrow></msub></math> 뷰행렬은 gluLookAt()에 의해 정의된 시점좌표계를 전역좌표계로 일치시키는 행렬

      • void gluLookAt (GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz);


    • 1. 전역 좌표계 = 시점 좌표계 = 모델 좌표계
      2. 시점 좌표계 분리
      3. 모델 좌표계 분리

  • 시점 설정(gluLookAt())에 의한 애니메이션

    • 극좌표계(Polar Coordinate System)

      • 극좌표로 표시된 시점의 위치를 모델뷰 행렬에 반영하기

      • 조종사 눈에 보이는 광경을 촬영