2006년 4월 16일 일요일

[OpenGL]Zoom in, out, pan 구현하기

방법 1)
glOrtho를 이용한다.
World coordinate에서 clipping할 영역을 지정하는 방법

int g_screenX = 800; // 화면의 가로 크기
int g_screenY = 600; // 화면의 세로 크기
float g_zoomFactor = 1;
float g_panningX = 0;
float g_panningY = 0;
float g_worldLeft = - g_screenX / 2.0 * g_zoomFactor + g_panningX;
float g_worldRight = g_screenX / 2.0 * g_zoomFactor + g_panningX;
float g_worldBottom = - g_screenY / 2.0 * g_zoomFactor + g_panningY;
float g_worldTop = g_screenY / 2.0 * g_zoomFactor + g_panningY;

void setCamera()
{
g_worldLeft = - g_screenX / 2 * g_zoomFactor + g_panningX;
g_worldRight = g_screenX / 2 * g_zoomFactor + g_panningX;
g_worldBottom = - g_screenY / 2 * g_zoomFactor + g_panningY;
g_worldTop = g_screenY / 2* g_zoomFactor + g_panningY;

glOrtho(g_worldLeft, g_worldRight, g_worldBottom, g_worldTop, -1, 1);
}

// 좌표 계산을 함
void calculateGLcoordinate(const int x, const int y, GLfloat* retX, GLfloat* retY)
{
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);

// openGL window coordinate는 system의 window coordinates와 반대이므로
// y좌표를 얻으려면 viewport[3] - y를 해야 한다.
// grid처리를 위해 gridWidth로 나눈 나머지 값을 버리고 다시 곱한다.
*retX = floorf((static_cast<float>(x) * (g_worldRight - g_worldLeft) / g_screenX  + g_worldLeft) / gridWidth) * gridWidth;
*retY = floorf((static_cast<float>(viewport[3] - y) * (g_worldTop - g_worldBottom) / g_screenY  + g_worldBottom) / gridWidth) * gridWidth;

//cout << "x : " << x << endl;
//cout << "y : " << y << endl;
//cout << "*retX : " << *retX << endl;
//cout << "*retY : " << *retY << endl;
}

방법 2)
glPerspective, glFrustum 등을 이용
Camera를 조절.
- 어떻게 하는 지 잘 모르겠음.

방법 3)
glScale, glTranslate를 이용한다.
Model Matrix를 고치는 방법.

방법 4)
glVertex에 입력하는 물체의 좌표를 직접 고친다.

주의)
이 방법이 모든 Model, view matrix에 적용되게 해야 한다.
. 화면에 그릴 때 (OpenGL이 지원)
. pick 할 때 (OpenGL이 지원)
. 화면에 입력할 때 (직접 고쳐야 함.)

댓글 없음:

댓글 쓰기