PLOT3D를 좀 더 3차원스럽게 그려보려면?

댓글 10

IDL/New Graphics

2014. 1. 20.

NG(New Graphics) 체계가 DG(Direct Graphics)와 비교되는 장점들 중 하나가 3차원적인 그래픽 표출을 비교적 간단한 코딩만으로 구현할 수 있다는 점입니다. PLOT3D라는 그래픽 함수 역시 그러한 하나의 예인데요. 물론 예전 DG 체계에서도 PLOT_3DBOX라는 프로시저가 있어서 3차원적인 플롯을 그릴 수는 있었지만, 표출 결과물은 아무래도 NG체계의 PLOT3D가 더 깔끔합니다. 제가 어디서 무슨 발표를 하는데 발표파일에 넣을 3차원 플롯 그림을 그린다면, 당연히 선택은 PLOT3D일 것입니다. 아래 코드는 XYZ 공간상에 존재하는 임의의 데이터 포인트들을 200개 생성해서 3차원 공간상에 뿌려놓은 모습을 PLOT3D로 표출하는 예제입니다. 그리고 그 표출 결과물은 다음 그림과 같습니다.


n = 200

x = RANDOMU(seed, n)*10

y = RANDOMU(seed, n)*10

z = RANDOMU(seed, n)*10

p1 = PLOT3D(x, y, z, LINESTYLE=6, SYMBOL='circle', SYM_COLOR='black', SYM_THICK=2, /SYM_FILLED, $

  SYM_FILL_COLOR='magenta', SYM_SIZE=2, CLIP=0, AXIS_STYLE=2)



여기서는 각 포인트를 Magenta 색상의 원형 심볼로 표현하고 가독성 측면을 약간 고려하여 테두리를 검은 선으로 둘러싸게 하였습니다. 이런 결과물 괜찮습니다. 보기에도 꽤 깔끔해 보여서 어디에 내놔도 손색은 없습니다. 다만 한가지 아쉬운게 있습니다. 그래픽창에서 플롯 자체를 마우스로 이리저리 드래그를 해보다보면, 시선 각도에 따라 원형 심볼들이 다음과 같이 납작하게 보이는 경우가 생깁니다. 이건 뭐 원형 심볼 자체가 평면 기반으로 구현된 도형이기 때문에 사실 당연한겁니다. 하지만 그래도 명색이 "3D"라고 한다면, 심볼들도 좀 더 입체적으로 보이면 좋겠다는 아쉬움은 있습니다.



만약 이러한 아쉬움이 커서 심볼을 그냥 평면상의 원형(circle)이 아닌 그야말로 입체적인 구체(sphere)의 형태로 구현하고 싶다면 어떻게 해야 할까요? 사실 방법은 있습니다. PLOT3D의 속성들 중 SYM_OBJECT라는 속성을 잘 활용하면 됩니다. 물론 도움말에서 이 속성에 대하여 찾아보면 아래와 같이 요상한 설명이 나옵니다.


Set this property equal to an object reference to be used for the plotting symbol. The SYM_OBJECT may be either an IDLgrModel object or an atomic graphics object.


사실 여기 나오는 object reference, IDLgrModel object, graphic object 등등의 용어들은 일반 IDL 사용자들에게는 그리 친숙하게 다가올만한 문구들은 아닙니다. 원래 이 용어들은 IDL의 객체 지향 그래픽 체계(Object Graphics)와 관련된 용어들입니다. 이 용어들의 의미를 다 이해하려면 OG 그래픽 체계에 대한 공부가 어느 정도 필요합니다. 하지만 여기서는 이런거 다 제끼고 그냥 방법 자체만 알려드리는 것으로 합시다. 앞선 예제에서와 같이 PLOT3D 함수를 쓰는 것은 같습니다. 다만 그 앞부분에 다음과 같이 두어 줄 정도의 문구만 추가한 다음에 PLOT3D 함수를 사용하면 됩니다.


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

oPolygon = OBJ_NEW('IDLgrPolygon', SHADING=1, DATA=vertices, POLYGONS=polygons, COLOR=[255, 0, 255])

p2 = PLOT3D(x, y, z, LINESTYLE=6, SYM_OBJECT=oPolygon, CLIP=0, AXIS_STYLE=2)


여기서 첫번째 줄의 MESH_OBJ라는 명령도 설명을 제대로 하려면 사연이 깁니다. 다만 구체 폴리곤을 만드는게 필요한 꼭지점 정보들을 알아서 생성해주는 역할을 한다는 점, 그리고 이 줄의 뒷부분에서 REPLICATE라는 함수에 들어간 첫번째 인자가 구체의 반경에 해당된다는 점 정도만 일단 기억을 하면 됩니다. 그리고 그 다음 줄에 있는 OBJ_NEW, IDLgrPolygon 등의 것들은 앞서 MESH_OBJ에서 생성된 vertices, polygons라는 이름으로 얻어진 정보를 그대로 사용하여 구체 폴리곤을 구현합니다. 우리가 원하는 "심볼"이 바로 구체의 형태니까요. 그리고 이 줄에서의 COLOR는 255, 0, 255라는 RGB값들로 구성되어 표현되었는데, 이 색상이 앞선 예제에서 사용했던 Magenta라는 색상과 거의 비슷합니다. 그 다음 줄에서는 PLOT3D가 앞선 예제에서와 비슷한 방식으로 사용되는데, 다만 SYMBOL 속성 대신 SYM_OBJECT라는 속성이 사용되었고 이 속성에 대하여 oPolygon이라는 변수가 사용된다는 차이만 존재합니다. 어쨌든 이와 같은 방법으로 표출된 3차원 플롯의 그림은 다음과 같습니다.



어떻습니까? 좀 더 3차원스러운 느낌이 들지 않으시나요? 특히 플롯 자체를 마우스 드래그를 해보면 좀 더 3차원스러운 느낌을 받으실 수 있을 겁니다. 각 데이터 포인트에 해당되는 구체 폴리곤들에 대해서는 SHADING 속성을 적용하여 표면을 매끈하게 처리함으로써 입체적인 느낌을 더 강조한 것입니다. 물론 이러한 표출방식을 사용하는데 있어서 유의할 점이 있습니다. 지금의 예제에서는 데이터 포인트의 갯수가 200개인데, 이 갯수가 더 늘어나면 시스템적인 부담이 더 커질 수 밖에 없습니다. 몇 백개나 되는 폴리곤들이 한꺼번에 보이는 상태로 마우스 드래그로 이리저리 돌려볼 수도 있다는 것은, 이 정보들이 컴퓨터 메모리상에 상주하고 있다는 의미입니다. 따라서 데이터 포인트의 갯수를 점점 늘려가면서 테스트를 해보시면, 내 컴퓨터가 IDL에서 3차원 폴리곤들을 원활하게 표현할 수 있는 한계가 어디까지인지도 확인해볼 수 있습니다. 만약 여기서 좀 더 욕심을 내서, 데이터 포인트를 구체가 아닌 다른 형태의 폴리곤들(사면체, 육면체, 팔면체, 원통, 특정 형태 등등)로 표현하고 싶다면 사실 여기서는 OG 체계의 그래픽 구현이라는 영역으로 넘어가는 문제이기 때문에 그리 권장해 드리지는 않겠습니다.