OrangeMap – 3차 릴리즈

2005년 1월 5일부터 진행된 2D GIS 컴포넌트입니다. 총 5단계로 나누어져 진행되는 프로젝트이며, 4단계까지는 공개이며 마지막 5단계는 비공개로 진행되는 프로젝트입니다.

3차배포 샘플예제 실행화면 일부

5월 4일에 3차 배포까지 진행되었습니다. 3차 배포까지의 대략적인 기능은 다음과 같습니다.

▭ 수치지도(Shape) 화면 표시 및 조작
▭ 다중 레이어 관리
▭ 수치지도의 속성에 따른 복합심벌
▭ 주기(Annotation, Label)
▭ 속성검색
▭ 수치지도에 공간격자 기법 적용
▭ Point의 경우 이미지 심벌 적용 기능
▭ Tracking Layer 기능
▭ 수치지도 및 속성 편집
▭ 편집시 Undo/Redo 기능
▭ MapLegend 컨트롤
▭ GeoTIF 형식의 영상 표시
▭ 영상의 투명도, 명암, 채도등의 필터 적용
▭ 자체포멧정의(수치지도: EPF, 영상: EPrR)
▭ 영상지도에 피라미드와 타일링 기법 적용

최근 배포된 3차 배포의 실행버전과 OrangeMap의 자세한 개요는 다음 링크로터 다운로드 받을 수 있습니다.

오렌지맵 3차 릴리즈(컴포넌트 및 예제소스)
대전지역(픽셀해상도 1m) 항공영상 데이터

필요한 기능에 대한 피드백을 보내주시면 수집하여 중복될 경우 적극적으로 반영시키겠습니다.

[OpenGL Tutorial] Bill-board(빌보드) 기법

사용자 삽입 이미지빌보드 기법이란 사각형이 항상 시점을 바라보도록 만드는 것을 말한다. 결과적으로 관찰자가 어느 위치로 이동하더라도 사각형은 항상 같은 면을 관찰자에게 보여주게 된다. 응용예로써 넓은 대지위에 나무를 나타내고자 할때, 나무를 메쉬(Mesh)를 사용하여 모델링하지 않고 나무 이미지만으로 구현이 가능하다.

구현에 대한 핵심은, 항상 시점을 바라보도록 사각형을 이루는 네 좌표를 조정하여야 하는데, 이를 위해 Model View 행렬을 이용한다. Model-View 행렬에는 관찰자의 시점에 대한 정수직벡터와 정우측벡터에 대한 정보가 담겨있다.

일단 OpenGL에서 Model View 행렬을 얻는 코드를 알아보자.

Glfloat viewMatrix[16];
GlGetFloatv(GL_MODELVIEW_MATRIX, viewMatrix);

ViewMatrix에 저장된 Model View 행렬이 다음 그림과 같다고 할 때 벡터(m1, m5, m9)은 시선 벡터와 수직인 위쪽 벡터이고, 벡터(m0, m4, m8)는 시선 벡터와 수직인 오른쪽 벡터이다.사용자 삽입 이미지시선과 위쪽으로 수직인 벡터를 UpVector라 하고 오른쪽 방향으로 수직인 벡터를 RightVector라 하자. 이 두 벡터를 이용하여 사각형을 이루는 4개의 좌표를 조정하기 위해, 사각형의 중심 벡터를 centerVector라고 하면, 사각형을 이루는 4개의 좌표는 다음 그림과 같다. 사용자 삽입 이미지위의 네 좌표를 스칼라값 Size를 적용하면 다음과 같다. Size는 사각형의 크기로 생각할 수 있다.

CenterPoint + (RightVector + UpVector) * (-Size))
CenterPoint + (RightVector -UpVector) * Size
CenterPoint + (RightVector + UpVector) * Size
CenterPoint + (UpVector -RightVector) * Size

실제로 구현 코드를 살펴보자.

void GL_Window::Draw(void)
{
    // Clear Screen And Depth Buffer
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     
    glLoadIdentity (); // Reset The Modelview Matrix
    glTranslatef (0.0f, 0.0f, -6.0f); // Translate 6 Units Into The Screen
    glRotatef (angle, 0.0f, 1.0f, 0.0f); // Rotate On The Y-Axis By angle
   
    // 모델뷰 행렬을 얻는다
    float mat[16];
    glGetFloatv(GL_MODELVIEW_MATRIX, mat);
   
    // 모델뷰 행렬로부터 시선방향에 대해 수직으로 오른쪽 벡터와 
    // 수직으로 윗쪽 벡터를 정의한다.
    vector3_t right(mat[0], mat[4], mat[8]);
    vector3_t up(mat[1], mat[5], mat[9]);
   
    glBindTexture(GL_TEXTURE_2D, texture[0]); // Select Our Texture
   
    vector3_t pos(0.0f, 0.0f, 1.0f);
   
    glBegin(GL_QUADS);
    // 빌보드 기법을 적용하지 않은 폴리곤의 경우
    // Bottom Left Of The Texture and Quad
    // glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); 
    // Bottom Right Of The Texture and Quad
    // glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
    // Top Right Of The Texture and Quad
    // glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); 
    // Top Left Of The Texture and Quad
    // glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); 
   
    // 빌보드 기법이 적용된 폴리곤의 경우
    // Bottom Left Of The Texture and Quad
    glTexCoord2f(0.0f, 0.0f); glVertex3fv((pos+(right+up)*(-1)).v);
    // Bottom Right Of The Texture and Quad 
    glTexCoord2f(1.0f, 0.0f); glVertex3fv((pos+(right-up)*(+1)).v);
    // Top Right Of The Texture and Quad
    glTexCoord2f(1.0f, 1.0f); glVertex3fv((pos+(right+up)*(+1)).v); 
    // Top Left Of The Texture and Quad
    glTexCoord2f(0.0f, 1.0f); glVertex3fv((pos+(up-right)*(+1)).v); 
    glEnd();

    glFlush();
} 

위의 소스에서 이미 제작된 vector 클래스를 사용하였다. vector 클래스의 사용은 크게 어렵지 않으므로 10여분정도 투자하여 소스를 분석해보면 쉽게 이해할 수 있을 것이다.

빌보드 기법을 적용하지 않은 경우에 대한 소스 코드를 주석처리하였 놓았다. 주석을 제거하여 실행해 보면서 비교해보기 바란다.