IDL/New Graphics

SURFACE 함수 소개 [2]

이상우_IDL 2017. 3. 31. 16:08
728x90

NG 체계의 SURFACE 함수에 관한 소개를 지난 회차에 이어서 계속 진행해 보도록 하겠습니다. 지난 회에는 기본적인 사용법 및 몇가지 세부 속성들(COLOR, STYLE 등)을 살펴 보았는데요. SURFACE 함수로 표출된 서피스 그림은 기본적으로 3차원이기 때문에 서피스 그림상에서 마우스 왼쪽 버튼을 누른 채 드래그를 하면 서피스 그림의 모습을 이리저리 돌려가며 볼 수 있습니다.



그러면 오늘은 서피스 표면상에 이미지를 입히는 텍스쳐 맵핑(Texture Mapping) 기능에 대해 알아봅시다. 텍스쳐 맵핑이란 폴리곤의 형태로 구현된 그래픽 개체의 표면에 이미지를 덧씌우는 기법을 뜻하는데요. 먼저 다음과 같이 IDL 설치 디렉토리 내에 있는 예제 데이터 파일을 읽어서 서피스의 형태로 먼저 표출해 보겠습니다.


zfile = FILEPATH('elevbin.dat', SUBDIR=['examples', 'data'])

zdata = READ_BINARY(zfile, DATA_DIMS=[64, 64])

HELP, zdata

PRINT, MIN(zdata), MAX(zdata)

win_sf1 = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)

sf1 = SURFACE(zdata, XSTYLE=1, YSTYLE=1, /CURRENT)


여기서는 IDL의 설치 디렉토리 내에서 examples/data 안에 있는 elevbin.dat라는 바이너리 파일을 READ_BINARY 함수를 사용하여 읽고 이 데이터를 zdata라는 배열로 만들었습니다. 읽은 직후 HELP와 PRINT 명령으로 확인해보면 이 zdata 배열은 64x64의 구조를 갖는 0~222의 범위의 바이너리 값들로 구성되어 있음을 알 수 있습니다. 이 zdata 배열을 SURFACE 함수로 표출한 모습은 다음 그림과 같습니다.



실제로 이 데이터는 어떤 지역의 지형을 나타내는 고도(Elevation) 자료로서 zdata 배열내의 값들은 고도의 값들에 해당됩니다. 따라서 이 그림을 보면 높은 산악지역과 낮은 평원지역이 공존하는 듯한 모습처럼 보입니다. 따라서 이와 같이 서피스의 형태로 가시화하면 고도의 높낮음을 입체적으로 나타낼 수 있게 됩니다. 이제 이번에는 이 지역의 실제 이미지를 읽어서 서피스 위에 덧씌우는 작업을 진행해 봅시다. 먼저 이 지역에 대한 위성 촬영 이미지 파일을 읽어야 하는데, 이 파일 역시 IDL의 examples/data 안에 JPG 파일의 형태로 존재합니다. 따라서 다음과 같이 READ_JPEG 명령을 사용하여 img라는 배열로 만들면 됩니다. 이 배열을 IMAGE 함수로 표출하여 그냥 먼저 독립된 이미지의 형태로 본 모습은 다음 그림과 같습니다.


ifile = FILEPATH('elev_t.jpg', SUBDIR=['examples', 'data'])

READ_JPEG, ifile, img

win_img = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)

im = IMAGE(img, MARGIN=0, /CURRENT)



이제 이 이미지를 서피스 표면에 덧씌우는 텍스쳐 맵핑을 적용해 보겠습니다. 이를 위해서는 다음과 같이 SURFACE 함수를 사용하여 서피스를 구현할 때 TEXTURE_IMAGE라는 키워드를 사용해야 합니다. 이 키워드에 이미지 배열을 부여하면 됩니다. 방법 자체는 꽤 단순합니다. 이와 같이 텍스쳐 맵핑이 적용된 모습은 다음 그림과 같습니다.


win_sf2 = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)

sf2 = SURFACE(zdata, XSTYLE=1, YSTYLE=1, TEXTURE_IMAGE=img, /CURRENT)



보시는 것처럼 아까는 서피스의 기하학적 형태만 존재했던 반면, 이제는 이미지를 입혀놓아서 좀 더 제대로 된 지형 및 고도 데이터의 형태로 볼 수 있게 되었습니다. 물론 이 그림 역시 마우스 왼쪽 버튼을 누른 채 드래그하면 이리저리 돌려가서 볼 수 있다는 점 잊지 마시길바랍니다.


이와 같이 우리가 어떤 2차원 데이터를 갖고 있을 때 이를 서피스의 형태로 구현해 놓고 텍스쳐 맵핑 기능을 적용하여 표면 위에 해당 이미지를 덧씌우면 꽤 입체적인 그림을 얻을 수 있습니다. 그래서 유사한 예제를 하나 더 보고자 하는데, 지난 회 게시물에서 다뤘던 예제를 약간 응용하면 다음과 같은 방식의 표출도 가능합니다.


data = HANNING(50, 50)*100

win_sf3 = WINDOW(DIMENSIONS=[600, 600])

sf3 = SURFACE(data, TEXTURE_IMAGE=data, RGB_TABLE=67, /CURRENT)


여기서 원본 2차원 데이터를 SURFACE 함수의 TEXTURE_IMAGE 키워드에 부여하는 방식은 이미 오늘 해본 예제들과 유사합니다. 다만 이번에는 RGB_TABLE 속성을 함께 사용해 보았습니다. 이를 통하여 서피스의 표면에 입혀지는 이미지에 컬러 테이블이 적용되도록 한 것입니다. 이 결과는 다음 그림과 같습니다.



따라서 SURFACE 함수로 그림 표출을 하는데 있어서 그 표면 이미지에 컬러 테이블을 반영하고자 할 경우 위와 같은 기법을 사용하시면됩니다. 지금까지 2회에 걸쳐서 NG 체계의 SURFACE 함수의 사용법을 살펴 보았습니다. 이를 통하여 SURFACE 함수에 관하여 기본적으로 소개해야 할 내용들은 언급이 다 된 것 같습니다. 물론 나중에라도 SURFACE 함수를 사용한 또 다른 흥미로운 예제가 생긴다면 여기서 또 다뤄보기로 하겠습니다.

LIST