BLOG main image
FunnyPR (32)
OpenGL (20)
PatternRecognition (7)
Tips (2)
XML (1)
DataMining (1)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
2014. 4. 19. 20:34

◆ OPENGL - 클리핑 영역 설정


클리핑 영역을 조정하여 종횡비가 맞는 정사작형으로 만드는 일

aspect rate(종횡비): 아래 viewport에 보면 종횡비 aspect ratio = w/h 로 계산된다. 


http://www3.ntu.edu.sg/home/ehchua/programming/opengl/CG_Introduction.html


종횡비가 1일 경우 정사각형이며, 0.5일 경우 가로 2 세로가 1이기 때문에 가로가 늘려진 사각형임을 알 수 있음


뷰포트가 정사각형이 아닌 상태에서 정사각형 클리핑 영역을 매핑하게 되면 찌그러지게 되므로 적절한 클리핑 영역 설정을 통해 종횡비를 맞춰야 함


직교 투영 방식에서의 클리핑 영역 설정 방법

1
void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearVal, GLdouble farVal);


3D 좌표계에서 

left와 right는 x축의 최솟값과 최댓값

bottom, top는 y축의 최솟값과 최댓값

near, far: z축의  최솟값과 최댓값

z 축의 경우 값이 작아질수록 관측자로 부터 멀어짐을 의미




http://warmz.tistory.com/440


두 그림을 비교해 보면 x 축의 최댓값과 최솟값이 변화여 viewport에 보이는 사각형이 비율에 따라 줄어든것을 확인할 수 있다. 아래 그림 두번째 보면 glOrtho에서 사용되는 변수들의 위치를 확인할 수 있다. 

즉, Viewport를 설정해 그릴 화면 영역을 잡고 x,y,z 종횡비를 설정하여 어떻게 투영해서 보여 줄것인가를 결정하면 된다. 


http://potatoland.org/glart/week3/


http://www.pling.org.uk/cs/cgv.html


투영함수 이전에 다음 두 함수 사용

1
2
3
   // Reset coordinate system
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();


glMatrixMode 함수는 투영을 위한 행렬 변환을 하는 부분

glLoadIdentity 함수는 행렬 처리가 이루어지기 전에 좌표계를 초기화 하는 역할을 함

    - glOrtho의 작동 방식이 새로운 클리핑 영역을 만는 것이 아니라 기존의 클리핑 영역과 행렬을 곱한 값을 새로운 클리핑 영역으로 지정하기 때문임


glOrtho 호출 전에 좌표를 초기화 하는 과정이 필요함을 알아 두자.


glOrtho를 호출 후 다음 두 함수 사용됨


1
2
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


------------

정사각형 유지를 위한 클리핑 영역 설정 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
///////////////////////////////////////////////////////////
// Called by GLUT library when the window has chanaged size
void ChangeSize(int w, int h)
    {
    GLfloat aspectRatio;
 
    // Prevent a divide by zero
    if(h == 0)
        h = 1;
        
    // Set Viewport to window dimensions
    glViewport(0, 0, w, h);
 
    // Reset coordinate system
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
 
    // Establish clipping volume (left, right, bottom, top, near, far)
    aspectRatio = (GLfloat)w / (GLfloat)h;
    if (w <= h) 
        glOrtho (-100.0, 100.0, -100 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0);
    else 
        glOrtho (-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);
 
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }