김형준 GIS 연구소 (for Developers)  
Front Page
Notice | E-Mail | Admin | Write Article   
 
프로그래밍/Open Source에 해당하는 글 8건
2011/09/15   [Java] 타원체간의 경위도 좌표계 변환 오픈소스 라이브러리 (7)
2011/09/07   [Java] 가벼운 좌표 변환 오픈소스 (3)
2011/05/12   JTS Geometry Class Diagram
2011/04/15   GeoTools를 이용해 SHP, DBF 파일 읽기 (2)
2009/09/03   [C++] XML 파서, CMarkup (25)
2006/10/15   ExampleFrameListener의 개념
2006/09/30   ExampleApplication의 개념 (5)
2006/09/25   시작하며... (1)


2011/09/15 18:01 2011/09/15 18:01
[Java] 타원체간의 경위도 좌표계 변환 오픈소스 라이브러리

얼마전에 가벼운 좌표변환 오픈소스 라이브러리를 소개한 글(http://www.gisdeveloper.co.kr/738)을 올렸습니다. 상당히 가볍고 매우 다양한 좌표계 투영이 가능한 라이브러리이지만 서로 다른 타원체 간의 좌표 변환에 있어서 제약이 있는 라이브러리였습니다.

이 글은 그에 대한 해결책으로 서로 다른 타원체 간의 경위도 좌표계 간의 변환을 지원합니다. 먼저 소개해 드린 라이브러리와 이 글에서 소개해 드릴 라이브러리를 조합하면 상당한 정확한 좌표 변환 성과를 얻으실 수 있으리라 확신합니다.

먼저 이 라이브러리를 구성하고 있는 클래스(총 4개)들의 관계도를 살펴보면 다음과 같습니다.

사용자 삽입 이미지

보시면.. Ellip2Ellipsoid라는 클래스만이 나머지 클래스와 관계를 맺고 있고 나머지는 독립적입니다. 관계를 맺고 있지 않은 클래스를 먼저 살펴보는 것이 순서이므로.. 순서대로 하나 하나 살펴보면.. 먼저 Ellipsoid는 타원체를 나타냅니다. 장반경과 편평도로 타원체 하나를 정의할 수 있습니다. 그리고 Parameters7은 타원체간의 경위도 좌표 변환을 위한 변환 계수로써 7 Parameters를 의미합니다. Vaues3는 단순히 3개의 값을 담고 있는 클래스로써 경위도값과 높이값을 담는데 사용합니다. 이 클래스는 타원체간의 경위도 좌표 변환의 입력값고 결과값의 타입으로 사용합니다. 끝으로 이 세 클래스와 유일하게 관계를 맺고 있는 Ellip2Ellipsoid는 2개의 상이한 타원체 간의 경위도 좌표를 7개의 변환 계수를 사용해 변환해 주는 주요 클래스입니다.

이제 이 클래스들을 이용하여 실제로 Bessel1841 타원체와 WGS84 타원체 간의 경위도 좌표 변환의 코드를 예로 살펴보겠습니다.

1번와 2번 코드에 앞서 언급했던 2개의 타원체를 정의하고 있습니다. 타원체 정의는 장반경과 편평도값을 통해 가능합니다. 3번 코드는 타원체 간의 변환을 위한 변환계수로써 X, Y, Z의 3개 축에 대한 이동량 그리고 또 3개의 축에 대한 회전량 끝으로 축척차값입니다. 타원체 간의 경위도 좌표 변환은 단번에 이루어지는 것이 아니라 중간 단계로 지심좌표계라는 X, Y, Z축 좌표계로 변환하게 되는데 다시 지심좌표계를 또 다른 타원체로 변환하기 위해 지심좌표계 자체를 3축에 대해 이동하고 회전하며 크기를 조절하는 과정에서 이 7개의 변환 매개변수가 사용됩니다. 9번 코드를 통해 이렇게 생성한 2개의 타원체와 변환 매개변수로써 Ellip2Ellipsoid를 생성합니다. 그리고 11번 코드부터는 실제 각 타원체간의 경위도 좌표계의 변환입니다. 결과는 아래와 같습니다.

사용자 삽입 이미지

만약 다른 프로그램 등을 통해 좌표변환을 수행했을때 위의 결과와 차이를 보인다면 변환 매개변수값으로 다른 값을 사용했기 때문입니다. 즉 위의 코드에서 3번 코드의 Parameters7 클래스의 생성시 사용한 인자값들에 해당합니다. 위의 3번 코드에서 사용한 변환 매개변수를 현재 한국에서 사용하도록 권장하고 있는 매개변수로써 대다수의 좌표변환 툴에서 사용하고 있는 매개변수입니다. 끝으로 본 오픈소스에 대한 다운로드는 아래의 링크를 통해 받으시기 바랍니다.

끝으로 궁금하신 점은 댓글을 통해 남기시면 최대한 답변해 드리겠습니다. 또한 이 오픈소스 라이브러리는 지오서비스에서 개발했으며 LGPL 라이센스를 따릅니다.
Tag :
2011/09/07 10:59 2011/09/07 10:59
[Java] 가벼운 좌표 변환 오픈소스

오픈소스를 검색하고 사용할만하다.. 라는 항목 중에 하나가 "가볍다"입니다. 필요한 기능은 "딱" 하나인데.. 이 하나의 기능을 사용하기 위해 다른 라이브러리가 덕지 덕지 붙어야만 하는 라이브러리는 아무리 기능이 좋아도 사용할 수 없는 상황(모바일 GIS 개발)입니다..

GPS로부터 받은 WGS84 경위도좌표를 우리나라에서 흔히 사용하는 좌표계로 변환하기 위한 자바 기반의 오픈소스를 검색하던 중.. 가벼운 녀석을 찾았고.. 다시 몇일 동안의 검증을 통해 사용하기로 결정된 좌표변환 오픈소스가 바로 Java Map Projection Library입니다.

이 오픈소스가 참조하고 있는 또 다른 오픈소스 라이브러리는 행렬계산을 위한 Jama라는 오픈소스 라이브러리입니다. Jama는 이미 행렬계산을 위해 제가 예전부터 사용하고 있던터라.. 문제가 없었습니다. 아래는 간단히 경위도 좌표를 카텍 좌표계로 투영하는 코드의 예입니다.

경도 128, 위도 38이 (400000, 600000)으로 투영되는 카텍좌표 투영에 대한 정보에 대한 인자로써 7~16라인의 코드에 params라는 문자 배열로 정의하고 있습니다. 이러한 인자값은 C언어 기반의 PROJ.4의 인자.. 바로 그것입니다. PROJ.4를 유용하고 사용하고 있는 저에게는 매우 반가운 방법입니다. 실제로 투영을 위한 Projection이라는 클래스의 객체를 생성하는 코드는 18번으로 앞서 정의한 인자값을 인자로 받습니다. 그리고 경도 128, 위도 38에 대한 좌표 변환은 20번 코드이고.. 21번 코드를 통해 화면에 출력해 확인하고 있습니다.

사용자 삽입 이미지

네, 위의 화면이 실행결과입니다. 그런데 석연치 않은 부분이 있습니다. 바로 20번 코드의 transform의 입력 인자로 받은 경도 128, 위도 38에 해당하는 타원체가 무엇인지에 대한 것입니다. WGS84 타원체일까... 아니면 Bessel 타원체 일까... 답은 Bessel인데요. 이유는 Projection 클래스의 객체를 생성하기 위해 정의했던 인자들 중 11번째 코드의 +ellips=bessel에 따릅니다. 그렇다면 앞서 말씀드렸던 목표.. GPS에서 수신받은 좌표체계인 WGS84 경위도가 아니라는 것입니다.

그렇다면 WGS84 경위도좌표계를 Bessel 경위도좌표계로 변환하고 이렇게 변환된 경위좌표를 카텍으로 변환해 주면 되겠군요. 하지만 여기서 문제는 이 Java Map Porjection 오픈소스가 타원체 간의 경위도 좌표 변환을 지원하지 않는다는 점입니다. 여기에 대한 해결점은 또 다른 포스팅(http://www.gisdeveloper.co.kr/740)을 통해 공유해 드리겠습니다.
2011/05/12 16:01 2011/05/12 16:01
JTS Geometry Class Diagram
사용자 삽입 이미지
JTS는 자바로 잘짜여진 지오메트리 공간연산 기능을 제공하는 오픈소스입니다. 세상에 나온지 수년이 지났고 워낙 잘짜여진터라 C언어로도 포팅되졌습니다. 위의 UML을 그려본 이유는 최근에 자바언어로 ESRI의 SHP 파일과 DBF 파일을 읽고 쓸 수 있는 라이브러리를 오픈소스 차원에서 개발할때 JTS에서 제공하는 Geometry 타입을 사용하기 위함입니다. 자바언어로 SHP와 DBF 파일을 읽는 오픈소스를 찾아보았으나 너무 다른 라이브러리에 깊이 관계를 맺고 있어 최적화시켜 사용하기가 제겐 부담이 되어 이번 기회에 새롭게 만들어 오픈소스 형태로 공유해볼 생각입니다.
Tag :
2011/04/15 19:05 2011/04/15 19:05
GeoTools를 이용해 SHP, DBF 파일 읽기

GeoTools(http://www.geotools.org)는 자바 기반의 GIS 시스템을 구축할 수 있는 다양한 기능을 갖춘 오픈소스입니다. 제가 처음 GeoTools에 관심을 가졌던 이유는 SHP 파일을 읽기 위한 자바 라이브러리가 필요해서 였는데요. 이 기능을 파악하기 위해 테스트로 작성했던 코드를 공유해 봅니다.

먼저 SHP 파일에서 좌표를 읽어 들이는 코드입니다.

다음으로는 DBF 파일에서 값을 읽어 들이는 코드입니다.

Tag : ,
2009/09/03 19:36 2009/09/03 19:36
[C++] XML 파서, CMarkup

XML 데이터를 쓰고 읽기 위해서 인터넷을 검색하던 차에 속도를 강점으로 내세우면서 STL 만을 사용하여 플랫폼 이식에도 뛰어난 오픈소스를 찾았는데요. 바로 CMarkup 입니다. 다운로드 사이트는 http://www.firstobject.com/ 이구요. 사용해 보니 XML의 charset도 지원하여 더욱 믿음이 가는 오픈소스였습니다. XML을 처리할 일이 있다면 한번 사용해 보시기 바랍니다.

추후 이 오픈소스를 다시 사용할 때를 대비하여 사용 방법을 정리해 정리차원에서 올려봅니다.

컴파일 시 주의할 사항은... CMarkup은 MFC의 CString와 STL의 string에 대한 문자열 타입을 사용하며 기본적으로 CString을 사용합니다. 플랫폼에 독립적인 구성을 위해서 STL을 사용하는것이 좋기 때문에 전처리에서 MARKUP_STL를 정의해줘야 합니다. 이 전처리 정의는 프로젝트의 속성 페이지에서 해줌으로써 전역적으로 적용되도록 해야 합니다. 아래의 코드는 XML을 쓰는 예제 코드입니다. 윈도우즈 계열의 개발툴인 VS2008로 작성했습니다.

결과는 다음과 같습니다.

사용자 삽입 이미지

AddElement를 통해 엘리먼트를 만들고, 해당 엘리먼트의 자식을 추가하기 위해 AddChildElem을 사용하거나 먼저 IntoElem을 호출한 후 다시 AddElement를 사용합니다.

이제 반대로 위와 같은 XML 데이터를 읽어 보도록 하겠습니다. 먼저 위의 결과를 파일로 저장해 놓고 그 파일을 읽어 데이터를 추출하는 예제를 들어 보겠습니다. 예를 들어... 아이템(ITEM)의 이름(NAME)과 수량(QTY)을 읽어 보도록 하겠습니다. 위의 XML 문자열의 경우 아이템의 개수는 총2개이므로 2개가 검색될 것입니다. 다음이 이 예제와 부합되는 코드입니다.

먼저 XML 데이터를 가지고 있는 파일을 Load 매서드를 이용해 읽습니다. 다시 반복문을 사용하여 루트 엘리먼트의 자식 ITEM 엘리먼트를 검색하기 위해 FindChildElem을 사용합니다. 그러면 해당되는 자식 엘리먼트가 추출됩니다. 해당되는 자식 엘리먼트의 자식 엘리먼트를 읽기 위해 IntoElem() 함수를 사용한 뒤에 원하는 엘리먼트(NAME, QTY)를 검색하기 위해 FindChildElem을 호출하고 실제로 값을 읽기 위해서 GetChildData 매서드를 호출합니다. 다 읽은 후 OutOfElem()을 호출합니다. 결과는 아래와 같습니다.

사용자 삽입 이미지

Tag :
2006/10/15 01:01 2006/10/15 01:01
ExampleFrameListener의 개념
ExampleFrameListener는 ExampleApplication 클래스와 마찬가지로 Ogre에서 기본적으로 제공하는 Framework 클래스 중 하나이다. KeyListener와 FrameListener로부터 다중상속을 받는 구조이며 기본적으로 갖는 책임 중에 가장 중요한 것은 마우스나 키보드로부터 입력을 받아 처리하고 Frame을 렌더링하데는 필요한 상태정보를 갱신하고, 렌더링을 계속할 것인지의 여부의 결정이다. 아래는 ExampleFrameListener 클래스 관계도이다.

또한 Overlay 클래스를 이용하여 FPS 정보 등을 나타내준다. 사용자가 마우스나 키보드의 입력을 buffer 방식인지, unbuffered 방식인지의 결정에 따라 buffered 방식인 경우, 사용자 입력에 대한 처리를 Event 방식(Callback 방식)으로 하기 위해 EventProcessor 클래스의 인스턴스를 생성해준다.

unbuffered 방식인 경우에는 InputReader 클래스의 인스턴스를 생성해서 사용자가 필요한 시점에서 InputReader의 인스턴스를 이용해서 키보드나 마우스의 상태를 Query할 수 있다. buffer 방식인 경우에도 InputerReader 인스턴스를 사용할 수 있다는 점도 알아 두길 바란다.

기본적으로 ExampleFrameListener 클래스는 unbuffered 방식의 경우에 대해 마우스와 키보드 입력에 대한 처리를 해 놓았다. 예를 들어 커서키를 누르면 화면이 이동한다든지, 마우스를 이용해 확대나 이동을 한다든지 말이다. 하지만 사용자가 원할 경우 이러한 처리를 재정의해서 쉽게 변경할 수 있다.

buffered 방식인지, unbuffered 방식인지의 결정은 ExampleFrameListener 클래스 생성자의 인자를 통해 결정한다.

사용자 입력 이외에 ExampleFrameListener 클래스에서 중요한 것은 FrameListener 클래스의 상속에 있다. FrameListener 클래스는 단지 frameStarted와 frameEnd 가상함수만을 가지고 있다. frameStarted는 하나의 frame을 렌더링 하기 직전에 호출하고 frameEnd는 하나의 frame에 대한 렌더링이 끝났을때 호출된다. 두개의 함수 모두 bool을 반환하는데, false일 경우 다음 frame을 렌더링하지 않는다. 즉, 계속 렌더링하려면 true를 반환해야 한다.

위의 말대로라면 Ogre3D의 main loop인 Root::startRendering 함수의 내용은 다음과 같을 것이고, 실제로 같다.

  1. Root 객체는 자신에 등록된 모든 FrameListener 객체의 frameStarted 함수를 호출
  2. Root 객체는 하나의 frame을 렌더링 함
  3. Root 객체는 자신에 등록된 모든 FrameListener 객체의 frameEnd 함수를 호출
입력이 unbuffered 방식일때 frameStarted나 frameEnd 함수안에서 InputReader 인스턴스를 이용해 키보드나 마우스의 상태를 Query 해서 회전상태나, 이동상태값들을 변경해서 물체를 회전시키고 이동시킬 수 있다. 클래스 관계도에서 ExampleFrameListener 클래스가 Camera 클래스와 관계를 맺고 있는 이유가 여기에 있는데, 입력에 따라 상태정보를 변경하고 다시 이 상태정보를 통해 Camera를 제어하기 위해서이다. RenderWindow와 연관을 맺는 이유는 다음과 같다.

  • FPS를 얻기
  • 개발을 위한 Debug 기능을 이용
  • 화면을 캡쳐화여 png 파일로 저장

마지막으로, 여러분들이 ExampleFrameListener 클래스의 소스를 열어놓고 기본적으로 입력에 대해서 구현해 놓은 것이 무엇인지를 살펴보길 바란다. 이 글을 읽은 후에 소스를 살펴보면 조금이라도 이해가 수월할 것이다.

2006/09/30 21:10 2006/09/30 21:10
ExampleApplication의 개념

ExampleApplication 클래스는 Ogre에서 기본적으로 제공하는 Framework 클래스이다. 이 클래스가 Framework가 될 수 있는 이유는 이 클래스를 상속 받아 가상함수를 구현하면 하나의 3D 어플리케이션이 만들어지기 때문이다. ExampleApplication 클래스의 구조와 흐름을 파악한다면, Ogre의 전체적인 흐름까지 쉽게 파악할 수 있을 것이므로 Ogre의 첫번째 분석에 ExampleApplication에 대해서 집중적으로 살펴보았다. 아래는 ExampleApplication의 클래스 관계도이다. 매우 심플한 구조인것을 알 수 있다. 심플하다는 것은 확장성이 뛰어나다는 것을 의미하며 또 그만큼 견고하다는 의미라고 생각된다. (너무 Ogre를 좋게만 보는거 아닌가 싶다)

위의 클래스 관계도에서 파악할 수 있는 몇가지를 살펴보면, ExampleApplication 클래스는 RenderWindow, Root, SceneManager, FrameListener, Camera를 속성맴버로 갖고 있다. (SceneNode는 아니다) 생성과 소멸에 관한 Composition 관계는 ExampleApplication은 Root와 FrameListener를 생성하며 Root가 RenderWindow와 SceneManager를 생성한다. 그리고 Camera는 SceneManager가 생성하여 관리한다. 일단 여기서 가장 중요한 FrameListener와 SceneManager에 대해 간단히 설명하면, FrameListener는 사용자의 Interaction에 대해 렌더링될 각 Frame을 컨트롤하는 역활을 한다. 그리고 SceneManager는 화면상에 렌더링될 SceneNode 들을 관리해준다.

SceneNode는 직접적으로 ExampleApplication과는 관계가 없지만 Ogre에서 매우 중요한 개념(대부분의 3D엔진에서 중요한 용어이며 개념이다)이다. Ogre에서 SceneNode를 말하려면 Entity도 함께 언급을 해야한다. Entity는 3차원 Geometry 좌표로 구성한 Mesh라고 할 수 있는데, 이 Entity가 SceneNode에 붙게된다. SceneNode는 위치와 방향 값을 갖고 있으므로 Entity와 SceneNode가 붙게되면 특정 위치와 방향으로 놓이게 되는 물체가 정의되는 것이다. 여기서 중요한 것은 하나의 SceneNode에는 여러개의 Entity가 붙을 수 있다는 점이다. 참고로 빛(Light)도 SceneNode에 붙일 수 있다.

관계도에서 하나 더 알 수 있는 것은 ExampleApplication의 모든 맴버 함수는 추상함수라는 점이다. 즉, 앞서 언급한것처럼 ExampleApplication을 상속받아 추상함수를 구현하게 되면 하나의 어플리케이션이 만들어진다는 것이다.

이제 ExampleApplication의 추상함수들의 용도를 살펴보면, 유일한 공개(public) 함수인 go()와 보호(protected) 접근자 함수인 그외의 함수들로 구성되며 그 목적은 다음과 같다.

  • go - WinMain이나 main, 또는 Rendering Thread에서 직접 호출되며 SceneNode 등과 같은 것을 화면상에 렌더링 한다. 내부적으로 setup 함수를 호출하고 조건무한루프 함수인 Root의 startRendering 함수를 실행한 뒤, destroyScene 함수를 호출한뒤, 일반적으로 어플리케이션이 종료된다.
  • setup - 가장 많은 일을 하는 함수로, 리소스 파일을 읽어들이고 Root 클래스를 초기화하며 Root 클래스를 통해 SceneManager를 생성시킨다. 그외에 카메라, 뷰포트, SceneNode를 생성을 담당하는 함수등을 차례로 호출한다.
  • destroyScene - 어플리케이션이 종료되기 직전에 더 이상 필요하지 않을 SceneNode를 메모리에서 제거한다.
  • setupResources - 리소스(이미지, Mesh, 스크립트 등)의 경로를 외부 cfg로부터 읽어들여 추후에 읽어들일 리소스의 경로를 파악한다.
  • configure - 사용자에게 3D API로 OpenGL이나 Direct3D를 쓸것인지와 해상도, 전체화면여부등을 결정할 수 있도록 하고, 결정된 사항을 기반으로 3D 환경을 설정한다.
  • chooseSceneManager - sceneManager를 생성한다.
  • createCamera - 카메라 생성
  • createViewport - Viewport 생성. Viewport는 실제 렌더링될 창(Window)의 배경색 및 픽셀 너비와 높이 값등을 가지고 있다.
  • createResourceListener - 리소스를 실제로 Loading할때 사용자에게 현재 얼마만큼의 리소스가 Loading되었는지를 파악할 수 있는 Listener 클래스를 생성한다.
  • loadResources - 실제 리소스를 Loading 한다.
  • createScene - 다른 추상 함수와는 달리 순수 추상함수로써 화면상에 렌더링할 SceneNode를 생성한다.
  • createFrameListener - 사용자의 Interaction을 받거나 그외의 다른 이유를 통해 변경된 사항을 매 Frame에 반영할 수 있도록하는 Listener를 생성한다. Ogre를 분석때 처음에 ExampleApplication을 분석하는 것처럼 다음에는 ExampleFrameListener를 분석해 볼것이다. 일단 여기서는 간단이 앞서 언급한 내용만 알아도 충분할 것같다.

일단 ExampleApplication에 대한 개념적인 것을 정리했다. 다음에는 실제로 ExampleApplication을 상속받아 화면상에 하나의 모델을 나타내는 예제를 만들어보는 것으로 해서 ExampleApplication에 대한 정리를 마루리할 것이다.

여기서 ExampleApplication의 이름을 ExampleApplication이라고 정의했는지 생각해 볼 필요가 있을 것 같다. ExampleApplication은 단지 Ogre에서 최소한 실행되는 3D 프로그램이 갖추어야할 것들만을 가지고 있는 예제에 불과한것같다. 즉, 처음 Ogre에 접근하는 개발자들에게 ExampleApplication을 상속받아, 얼마나 쉽게 3D 프로그램을 개발할 수 있는지를 보여주기 위한 Example에 불과한것이 아닌가 싶다. 물론 예상일뿐이지만 말이다.

2006/09/25 23:38 2006/09/25 23:38
시작하며...
OGRE는 Object-Oriented Graphics Rendering Engine의 약자로써, 이미 아시는 분들은 저보다 훨씬 잘아시리라 믿습니다. 3D를 주 테마로 잡고 있는 개인이 운영하는 사이트를 보면 OGRE를 강한 열정을 가지고 분석하고 있는 분들이 많더군요. 하지만 저는 단지 수개월전에 OGRE를 공개소스로써 3D 그래픽 엔진 중 인기순위 1위를 차지하는 라이브러리 정도로만 알고 있었고, 그 당시 한번 컴파일이나 해보자는 마음으로 소스코드를 다운로드 받아 컴파일을 시도했지만, 실패하고 말았었습니다. 왜 실패했는지 그 이유는 모르겠습니다. 아마도 제 마음속에 별.. 그다지 OGRE에 대한 관심이 별로 없었지 않았나 싶습니다. 하지만 다행이 이미 컴파일된 데모들을 실행해 볼 수는 있었고, 단지 "좋군.."이 전부였습니다.


하지만 최근 우연이 Direct3D를 전문으로 다루는 어느 개인 블로그에 방문했데, 그 곳에 OGRE를 다루더군요. 또 다시 호기심이 발동한 저는 다시한번 컴파일이나 해볼 요량으로  OGRE의 공식 사이트인 www.ogre3d.org에 방문해 차근 차근 시도를 해보았습니다. 그런데 이번엔 왠일인지 쉽게 컴파일이 되더군요. 이상하게도 컴파일이 되니 제 마음속에서 이 놈을 깊이 있게 분석해보리라는 강한 욕심이 생겼습니다. 정말입니다. 컴파일 성공이라는 첫걸음이 성공하는 순간, 저도 전혀 예상하지 못했던 흥분과 욕심이 생기는겁니다!

제가 OGRE에서 얻고자 하는 바는 다음과 같습니다.
  • 많은 3D 그래픽 개발자로부터 찬사를 받고 있는 OGRE를 직접 사용해보고...
  • 최고 수준의 Object-Oriented를 지향한다는 Ogre의 개발자의 이 엔진으로부터 설계방법을  배우며...
  • OpenGL이나 DirectX보다 상위 수준의 API 통해 최신 그래픽 기술을 직접 코딩해 느껴보고, 점차 하위 수준으로 접근해 나간다.
위의 3가지 목적중에 2번째인 설계방법이 가장 큰 목표입니다. OGRE의 첫자인 "O"가 Object-Oriented인 만큼, 또한 OS 독립적이며 OpenGL과 Direct3D를 실행중에 유연하게 선택할 수 있는 설계방식이 무척 궁금합니다. 물론 제 나름대로의 이러저러하게 하면 되지 않을까 하는 다소 어설픈 아이디어는 있지만, 다른 개발자의 아이디어는 어떨까, 배우고 싶습니다.
위는 Ogre의 핵심 클래스의 관계도입니다. 간단해 보이기는 하지만 다른 부수적인 것들이 붙으면 매우 복잡하겠지요. Ogre를 분석하는 방법은 Ogre 사이트에서 제공하는 Tutorial과 Demo 소스를 분석하는 방식으로 하려 합니다. 제 스스로에게 건투를 빕니다.
BLOG main image
 Notice
DuraMap-Xr 소개 및 다운로드
[오픈소스] SimpleSHP v0.1
FingerEyes-Xr 소개 및 다운로드
OpenGL Tutorials
 Category
전체 (552)
GIS 개발 (155)
프로그래밍 (240)
스치는 생각들 (128)
번역 또는 집필 (3)
영작학습 (6)
 TAGS
GIS Xr OpenGL Shader BlackPoint FingerEyes Algorithm Java Map Engine WPF
 Calendar
«   2012/05   »
    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 29 30 31    
 Recent Entries
English Writing Study
English Writing Study
English Writing Study 4
English Writing Study 3
English Writing Study 2
 Recent Comments
안녕하세요~ 코봉히님....
김형준 - 05/15
동부->중부 좌표변환할 일...
코봉히 - 05/14
잘봤습니다.
지나가다 - 05/11
지금 사용하고 있는 dem...
김형준 - 05/04
단면도 측정 결과를 보고....
아무개 - 05/02
출처를 밝히시면 마음껏...
김형준(Dip2K) - 05/02
하나더 말씀을 안드렸네요...
Begginer - 05/02
고맙습니다. OpenGL으로...
Begginer - 05/02
네, 기존 버전에 대해 불...
김형준(Dip2K) - 05/01
정말 감사합니다..새로운...
조성각 - 05/01
 Archive
2012/05
2012/04
2012/03
2012/02
2012/01
2011/12
2011/11
2011/10
2011/09
2011/08
2011/07
2011/06
 Link Site
Adobe Flex 3 Help
Cartograph 2.0
GADM
GIS 위키디피아
GIS 프로그래밍 연구소
MapTools.org
OGC
OGRE3D
OSGeo 한국 지부
Paul Bourke Site
Wikipedia
국가수자원관리 정보시스템
국립지리원
국토연구원
국토해양부
네이버 과학
대한측량협회
류광님의 블로그
이민파님의 공간분석과 리...
지오서비스(GeoService)
 Visitor Statistics
Total : 982094
Today : 116
Yesterday : 582
태터툴즈 배너
rss