IDL/Mapping

지도 이미지를 3차원 구체(Sphere) 폴리곤상에 입히기 [1]

이상우_idl 2015. 6. 29. 16:38
728x90
반응형

그 동안 제가 지도의 표출 및 활용법에 관한 게시물 연재를 한동안 손을 놓고 있었습니다. 사실 오늘 올리는 이 내용은 그 연장선에 있다고 보면 됩니다. 다만 제목은 독립적으로 지어봤습니다. 오늘 다뤄볼 주제는 지도를 그리고 그 지도를 3차원 구체(Sphere) 위에 입혀서 구현하는 방법에 관한 내용입니다.


당연한 얘기이겠지만, 지도라는 것은 지구상의 영역을 나타내는 그림으로서, 지구가 구체(Sphere)이기 때문에 그 위에 존재하는 정보들을 평면상에 투영시키는 방법에 따라 다양한 표출 방법이 존재합니다. 앞서 투영법에 관한 설명에서 이미 언급했던 내용이기도 합니다. 그렇다면 굳이 평면상의 그림으로 나타내지 않고, 정말 지구의 모습 그대로 3차원 구체상에 지도를 나타낼 수 있다면 어떨까요? 즉, 우리가 흔히 아는 지구본과 같은 방식으로 표출하는 방법에 관한 얘기입니다. 물론 IDL에서도 가능합니다. 다만 구체(Sphere)라고 하는 입체를 어떤 방식으로 구현하느냐의 문제가 가장 먼저 대두되는데, 이를 위해서는 조금 특별한 방법을 사용해야 합니다. 그것은 바로 IDL의 Object Graphics라는 그래픽 체계를 사용한 작업을 의미합니다.


사실 Object Graphics(이하 OG)라는 그래픽 체계를 제대로 사용하려면 원래는 나름의 공부가 좀 필요한데, 여기서는 우리의 목적에 필요한 최소한의 내용들만을 언급하면서 설명을 해보겠습니다. 가장 먼저 필요한 것은 구체 위에 입힐 지도를 그리는 일입니다. 즉, 세계전도(World Map)를 그리고 그 결과를 그림 파일로 저장하는 작업이 먼저 필요합니다. 사실 세계전도를 그리는 방법은 앞서 우리가 알아봤던 여러가지 방법들 중 거의 기초에 해당되는 부분이라 이제는 그리 어렵지 않게 다가오리라 생각됩니다. 일단 다음과 같이 그려보기로 합시다. 그 결과는 다음 그림과 같습니다.


win = WINDOW(DIMENSIONS=[1200, 600])

m1 = MAP('Geographic', BACKGROUND_COLOR='Dodger Blue’, $

  ASPECT_RATIO=0, MARGIN=0, /CURRENT)

m1.LIMIT = [-90, -180, 90, 180]

m2 = MAPCONTINENTS(FILL_COLOR='Gold', THICK=2)

m1.MapGrid.Hide = 1

win.Save, 'my_world_map.png', WIDTH=1200

win.Close



여기서는 대륙과 바다만 표시하고 그 외 경위도 선 등과 같은 것들은 모두 제외하였습니다. 그리고 이 그림을 my_world_map.png라는 PNG 형식의 파일로 저장하였습니다. 이제 그 다음 단계는 구체(Sphere)를 구현하고 이 위에 앞서 그렸던 지도를 입히는 작업이 됩니다. 이를 위해서는 다음과 같이 조금 특이하고 생소한 방법론들이 동원이 됩니다. 일단 내용을 보면 다음과 같습니다.


ifile = 'my_world_map.png'

img = READ_IMAGE(ifile)

MESH_OBJ, 4, vertices, polygons, REPLICATE(0.5, 101, 101)

oImage = OBJ_NEW('IDLgrImage', img)

vector = FINDGEN(101)/100.

texure_coordinates = FLTARR(2, 101, 101)

texure_coordinates[0, *, *] = vector # REPLICATE(1., 101)

texure_coordinates[1, *, *] = REPLICATE(1., 101) # vector

oSphere = OBJ_NEW('IDLgrPolygon', SHADING=1, DATA=vertices, $

  POLYGONS=polygons, COLOR=[255, 255, 255], $

  TEXTURE_COORD=texure_coordinates, $

  TEXTURE_MAP=oImage, /TEXTURE_INTERP)

XOBJVIEW, oSphere, XSIZE=600, YSIZE=600


이 내용을 보면 MESH_OBJ, OBJ_NEW, XBOJVIEW 등과 같이 생소한 프로시저 및 함수들이 등장을 하고 있습니다. 사실 이러한 내용들은 작정하고 설명하자면 정말 길어질 수가 있기 때문에, 여기서는 자세한 설명은 생략하기로 하겠습니다. 즉, 위의 내용에서 3~12번째 줄에 해당되는 내용은 그냥 OG 체계에서 구체를 3차원 폴리곤 객체(Polygon Object)의 형태로 구현하고 이 위에 내가 원하는 이미지를 입히는(Mapping) 과정의 전형적인 예제이다 정도로 이해해두시기 바랍니다. 다만 마지막 줄에 있는 XOBJVIEW라는 명령은 위와 같이 구현된 폴리곤 객체를 편리하게 볼 수 있도록 해주는 간단한 인터페이스를 띄워주는 역할을 합니다. 그래서 위의 내용들이 온전하게 실행된다면 다음 그림과 같은 장면을 볼 수 있게 됩니다.



이렇게 XOBJVIEW로 뜬 인터페이스상에서는 마우스 클릭 및 드래그에 의하여 그래픽 객체를 이리저리 돌려보거나 확대 및 축소를 해보는 등의 간단하고 직관적인 조작들이 가능합니다. 그래서 마우스 드래그로 구체를 이리저리 돌려보면 아마 마치 지구본을 보는 것과 유사한 느낌을 받게 될 것입니다.


자~ 일단 오늘은 이 정도까지 소개를 드리고 다음 회차에 또 이어지는 내용 소개하기로 하겠습니다.

반응형