IDL/Object Graphics

Wire Frame 3D Sphere의 구현 [1]

이상우_IDL 2016. 10. 21. 08:00
728x90
반응형

최근에 IDL/ENVI 유저그룹에서 질문으로 올라왔던 이슈인데, 제 생각에 심층적으로 다뤄볼만한 것 같아서 이 블로그에서 한번 다뤄보고자 이 글을 올려보게 되었습니다. IDL에서 3차원 구체(Sphere)를 와이어 프레임(Wire Frame)의 형태로 구현하는 방법에 관한 이슈인데요. 물론 결론부터 얘기한다면, "당연히 가능하다"입니다. 물론 가능은 하지만 실제로는 어떤 그래픽 체계에서 어떤 방식으로 구현해야 하는가의 문제로 넘어가게 됩니다.


이러한 작업이 가능한 IDL의 그래픽 체계는 OG(Object Graphics)와 NG(Direct Graphics) 두가지라고 보면 됩니다. 전통적인 체계인 DG(Direct Graphics)에서는 불가능하지는 않겠으나 별로 효율적이지는 않기 때문에 아예 논외로합니다. 그렇다면 OG와 NG 중 어느 쪽을 택해야 하는가의 문제인데요. 저는 가급적 OG에서 구현하는 것을 권장합니다. 왜냐하면 이 작업이 기본적으로 폴리곤(Polygon)을 3차원에 구현하는 작업인데, 폴리곤 구현 기능의 효용성 측면에서 NG의 POLYGON 함수보다는 OG의 IDLgrPolygon 클래스가 더 낫습니다. 이 차이점에 관해서는 얘길 막상 하자면 너무 길어질 가능성이 큽니다. 이건 다음 기회를 기약하기로 하고, 그냥 바로 구현 방법으로 가보겠습니다. 그리고 구체적으로는 OG 기반으로 IDLgrPolygon 클래스를 사용하는 방법을 택하기로 합니다.


원래 이 방법에 대하여 제대로 이해하려면 OG에 대한 지식이 어느 정도 필요한 것이 사실이긴 합니다. 하지만, 그냥 해결책으로 먼저 가보고 보충 설명을 해보기로 하겠습니다. 우선 구현을 위하여 작성된 코드는 다음과 같습니다. 사실 의외로 몇 줄 되지도 않습니다.


MESH_OBJ, 4, vertices, polygons, REPLICATE(1, 37, 19)

HELP, vertices

HELP, polygons

oSphere = OBJ_NEW('IDLgrPolygon', DATA=vertices, POLYGONS=polygons, $

  COLOR=[0, 0, 255], STYLE=1, THICK=2)

XOBJVIEW, oSphere, XSIZE=600, YSIZE=600, SCALE=0.8


여기서가장 핵심적인 역할을 하는 부분은 MESH_OBJ라는 프로시저인데요. 이 프로시저는 제가 예전에 이 블로그의 다른 게시물에서 언급했던 적은 있습니다. 하지만 구체적인 설명은 생략했었는데요. 오늘은 생략은 안하겠지만 간단하게만 설명하겠습니다. 이것도 제대로 이해하려면 좀 복잡한 부분들이 있기 때문입니다. MESH_OBJ의 역할은 내가 구현하고자 하는 폴리곤을 구성할 점들, 즉 Vertex라고 하는 것들의 XYZ 좌표값들을 생성하는 역할을 합니다. 사실 MESH_OBJ에서는 여러가지 생성 방법들이 지원되는데, 그 중 4라고 하는 숫자는 구체(Sphere) 폴리곤에 해당됩니다. 여기서는 반경이 1이면서 경도 방향으로는 37개 그리고 위도 방향으로는 19개의 격자점들로 구성되는 구체를 생성하고자 합니다. 37개의 격자점들은 구간으로 따지면 36개에 해당되고, 19개의 격자점들은 구간으로 따지면 18개에 해당됩니다. 36X18인데, 구체 폴리곤상에서 이러한 격자 간격은 결국 마치 경도 방향 0~360도와 위도 방향 -90~90도에 해당된다고 볼 수 있습니다.


위의 MESH_OBJ 프로시저가 실행되면 vertices, polygons라는 두 배열들을 돌려 받게 됩니다. 전자는 폴리곤을 구성하는 격자점(vertex)들의 XYZ 좌표값들로 구성된 배열이며, 후자는 이 격자점들을 어떻게 이어줘야 하는가에 관한 정보, 즉 우리가 연결성(Connectivity)이라고 부를 수 있는 정보가 담긴 배열에 해당됩니다. 이 두 배열은 바로 밑에서 IDLgrPolygon 클래스의 객체를 생성할 때 필수 인수로 전달해줘야 하는 정보이기도 합니다. 이와 같은 방식으로 oSphere라는 폴리곤 객체를 구현할 때, STYLE이라는 속성을 사용하여 렌더링 방식을 선택할 수 있습니다. 이 값을 1로 설정하면 바로 wire frame 형태로 구현이 됩니다. 참고로 STYLE 속성의 디폴트 값은 2이며,이는 Filled 방식 즉 격자점 사이사이 공간을 꽉 메우는 Shading 기반의 렌더링 방식에 해당됩니다.


그리고 맨 밑에서 사용된 XOBJVIEW는 OG 기반으로 생성된 개별 그래픽 객체를 쉽게 조회할 수 있도록 해주는 GUI 프로그램입니다. 원래 OG에서는 그래픽 객체를 구현하여 우리 눈으로볼 수 있도록 하기까지 조금 복잡한 과정들이 필요한데(얼마전 OG 교육에 오셨던 분들은 아마 이해하실 겁니다), 이 과정들을 생략하고 간편하게 볼 수 있도록 해주는 보조 역할을 수행하는 독립 프로그램이라고 보면 됩니다. 어쨌든 위와 같은 과정에 의하여 구현된 구체 폴리곤의 모습은 다음 그림과 같습니다.



아마 이 정도면 나름 봐줄 만한 결과물이 나왔다고 생각할 수도 있고, 여기서 좀 더 해볼만한 것들이 또 있지 않을까 하는 생각이 들 수도 있습니다. 저는 여기서 조금만 더 가보려고 합니다. 구체적으로 언급한다면, 구체의 겉면은 그대로 두되, 구체의 내부면은 조금 흐릿하게 처리되도록 할 생각인데요. 이렇게 하면 구체의 겉과 속을 시각적으로 구분하기가 좀 더 쉬워집니다. 물론 위의 내용보다 좀 더 복잡한 작업이 필요하긴 하지만, 충분히 해볼 만한 작업이기도 합니다. 이 내용은 곧 이어질 후속 게시물에서 다뤄보도록 하겠습니다.

반응형