오늘은 IDL에서 고리형(Ring Shaped) 폴리곤을 구현하는 방법을 소개해보기로 하겠습니다. 반지 또는 팔찌 등과 유사한 형태의 폴리곤(Polygon)을 IDL의 OG(Object Graphics) 체계에서 구현하는 방법을 간략하게 설명하는 방식으로 진행해볼까 합니다.
이를 위해서는 먼저 고리의 형태를 구성하는 꼭지점들(Vertices)을 어떤 방식으로 구성해야 할지를 정해야 하는데요. 간단하게 생각해보면 고리를 하나의 원형의 선으로 생각을 해볼 수 있습니다. 그러면 0도에서 360도까지 일정한 반경을 유지하며 특정한 간격으로 퍼져있는 점들을 생각해보면 됩니다. 만약 0, 10, 20, ..., 350, 360과 같이 10도의 각도 간격을 갖도록 하고, 원점으로부터의 거리 즉 반경이 20이라는 값을 유지하도록 하는 경우라면 다음과 같은 방식으로 점들의 X, Y 좌표를 설정할 수 있습니다.
incr = 10
angs = FINDGEN(360/5+1)*incr
radius = 20
xp = radius*COS(angs*!DTOR)
yp = radius*SIN(angs*!DTOR)
그런 다음에 다음과 같이 IDL의 그래픽 객체 클래스들 중 선형에 해당되는 클래스인 IDLgrPolyline 클래스를 사용하여 다음과 같이 구현을 해볼 수 있습니다. 여기서는 Z 좌표는 모두 0이라고 가정하였습니다. 그리고 두께를 20으로 설정하여 선의 두께가 좀 있도록 구현해보았습니다. XOBJVIEW 명령을 사용하여 그 결과를 표출한 다음, 적당한 각도로 회전을 시켜주면, 그 결과는 다음 그림과 같이 나옵니다.
ring_obj = OBJ_NEW('IDLgrPolyline', xp, yp, COLOR=[255, 0, 255], THICK=20)
XOBJVIEW, ring_obj
XOBJVIEW_ROTATE, [1, 0, 0], -30
XOBJVIEW_ROTATE, [0, 1, 0], 30
그럭저럭 된 것 같죠? 그냥 간단한 가시화를 위한 경우라면 이 정도도 보기에 그렇게 나쁘진 않습니다. 그런데 뭔가 조금 아쉽습니다. 그렇습니다. 폴리곤으로서의 입체감이 전혀 보이질 않습니다. 사실 지금 구현된 그림은 엄밀히 말하면 폴리곤(Polygon)이 아닙니다. 클래스 이름에서 봤듯이 선(Line)에 해당되는 클래스이기 때문에 표면, 질감 등의 개념이 없기 때문입니다. 만약 진정한 폴리곤의 형태로 구현하고자 한다면 어떻게 해야 할까요?
물론 방법이 있습니다. 바로 MESH_OBJ 명령 및 IDLgrPolygon 클래스를 사용하는 방법입니다. 그런데 이 MESH_OBJ라는 명령은 사실 내용이 좀 복잡한 편입니다. 물론 IDL 도움말에도 내용이 있고, 제가 예전에 출판했던 책에서도 소개를 한 적은 있지만, 그리 금방 쉽게 다가올만한 내용은 아닌 것 같습니다. 그래서 일단 코드 내용부터 먼저 적어보겠습니다. 대략다음과 같은 코딩이면 입체적인 모습의 고리형 폴리곤의 구현이 가능합니다.
여기서 MESH_OBJ는 우리가 구현하고자 하는 형태의 고리형 폴리곤을 구성하는 모든 꼭지점들의 좌표 및 연결성 정보를 생성해주는 역할을 합니다. 그리고 그렇게 생성된 폴리곤 및 연결성 정보인 vts, pol을 받아서 IDLgrPolygon 객체에 부여하는 방식으로 작업이 진행됩니다. MESH_OBJ의 첫번째 인자의 값이 6으로 되어 있는데, 이 값의 의미는 회전형(Revolution)으로 폴리곤 꼭지점들을 생성하란 의미입니다. 그런데 뭘 회전시켜야 우리가 원하는 고리형 폴리곤이 나오느냐의 문제가 되는데요. 비유해본다면, 원의 형태로 오려낸 종이를 팔을 뻗어 지면과 수직하게 들고 있는 상태에서 제자리에서 한바퀴 도는 방식이라고 생각하면 됩니다. 그러면 그 원형이 거쳐가는 각도마다 그 원의 모습이 계속 남고 그 원들을 주욱 이어나가면 바로 고리형이 됩니다. 그러면 들고 있는 종이원의 반경은 고리선의 두께(radius_inside)가 되고, 뻗은 팔의 길이가 고리의 반경(radius_ring)이 되는 셈입니다. 그리고 MESH_OBJ 명령의 끝부분에 있는 P1이란 키워드에 10이란 값이 설정되어 있는 것이 보이는데요. 일단 이 상태로 구현된 고리형 폴리곤의 모습부터 봅시다. 다음과 같이 XOBJVIEW 명령으로 표출해본 모습은 다음 그림과 같습니다.
arr = FLTARR(3, N_ELEMENTS(angs))
radius_ring = 20
radius_inside = 4
arr[0, *] = radius_ring+radius_inside*COS(angs*!DTOR)
arr[2, *] = radius_inside*SIN(angs*!DTOR)
MESH_OBJ, 6, vts, pol, arr, P1=10
ring_obj = OBJ_NEW('IDLgrPolygon', vts, POLYGONS=pol, COLOR=[255, 0, 255])
XOBJVIEW, ring_obj
XOBJVIEW_ROTATE, [1, 0, 0], -30
XOBJVIEW_ROTATE, [0, 1, 0], 30
이번에는 P1의 값을 확 늘려서 100으로 설정한 후의 결과를 또 봅시다. 그 결과는 다음 그림과 같습니다.
그러면 P1의 역할이 무엇인지 짐작이 가능하리라 생각합니다. 팔들 뻗고 돌 때 그 각도 스텝의 갯수입니다. 따라서 이 갯수가 많을수록 좀 더 부드러운 형태의 고리형 폴리곤이 구현됩니다. 물론 이 숫자가 너무 많아지면 고리형 폴리곤을 구성하는 꼭지점(Vertex)들의 숫자도 많아지기 때문에 CPU의 부담이 더 갈 수 있습니다. 따라서 전체적으로 보면 내부 고리원을 이루는 원형의 각도 스텝 갯수 및 P1의 값 등을 적정하게 조정하여, 고리 전체를 이루는 꼭지점들의 갯수가 너무 많아지지 않도록 적당한 밸런스 조정은 필요합니다. 어쨌든 이와 같은 방식으로 고리형 폴리곤의 구현이 가능하다는 것을 볼 수 있습니다.
지금 소개된 예제코드에서는 객체의 가시화를 XOBJVIEW를 사용했는데요. 원래 OG 체계에서는 Model, View, Destination 객체들까지 직접 구현해줘야 하기도 하지만 이와 관련된 내용은 여기서는 다루지 않겠습니다. 어쨌든 MESH_OBJ라는 명령이 이해하기가 그리 쉬운 편은 아니지만 잘만 이해한다면 다양한 형태의 폴리곤들을 구현할 수 있는 길을 열어준다라는 점은 객체 지향 그래픽 체계를 다루는데 있어서 매우 중요하다는 점을 강조하고 싶습니다. 위의 내용이 담긴 예제코드를 아래에 첨부합니다.
'IDL > Object Graphics' 카테고리의 다른 글
Wire Frame 3D Sphere의 구현 [1] (0) | 2016.10.21 |
---|---|
3D 폴리곤 가시화 예제 (Stanford bunny) (0) | 2015.06.01 |
Mac OS Mountain Lion 10.8에서 Object Graphics 구현시의 문제 해결법 (0) | 2012.10.31 |
비디오 파일 생성 기능 소개 (0) | 2011.05.11 |
Object Graphics in IDL [31] (0) | 2011.04.05 |