IDL/Object Graphics

Object Graphics in IDL [14]

이상우_idl 2010. 12. 6. 03:32
728x90
반응형

렌더링(Rendering) 과정

렌더링이라는 것은 Object Graphics상에서 그래픽을 실제로 구현하여 나타내는 과정을 말한다. 이는 그래픽 컨텐츠가 출력될 디바이스에 해당되는 객체에 대하여 Draw라는 메서드를 실행함으로써 이루어진다. Draw 메서드의 인자는 계층구조에 있어서 최상위 레벨에 해당되는 객체가 되어야 한다. 예를 들어, 구현될 그래픽이 다음과 같은 계층구조를 갖고 있다고 가정해보자.

oWindow = OBJ_NEW(‘IDLgrWindow’)

oView = OBJ_NEW(‘IDLgrView’)

oModel = OBJ_NEW(‘IDLgrModel)

oView -> Add, oModel

oXAxis = OBJ_NEW(‘IDLgrAxis’, 0)

oModel -> Add, oXAxis

oYAxis = OBJ_NEW(‘IDLgrAxis’, 1)

oModel -> Add, oYAxis

이렇게 구현된 뷰 객체 및 그에 속한 하위 그래픽 객체들이 실제로 눈에 보이도록 그래픽 윈도우상에서 그려지게 하려면, 윈도우 객체에 대하여 Draw 메서드를 사용하되 그 인자는 뷰 객체로 설정하여 다음과 같이 해주면 된다.

oWindow -> Draw, oView

단 한 줄의 간단한 명령처럼 보이지만 실제 내부적으로는 꽤 여러 단계를 거쳐 실행이 된다. 먼저 윈도우 객체에 대한 설정을 한 다음, 뷰 객체에 대하여 Draw 메서드가 수행되도록 한다. 그러면 뷰 객체에 대한 작업, 즉 여기서는 뷰 객체에 대하여 정해진 바탕 화면 색상으로 그래픽 영역을 한번 지워준다(Erase). 이렇게 화면을 한번 정리한 다음에서야 하위 그래픽 객체들을 그리는 작업으로 넘어간다. 이 예제에서는 oXAxis, oYAxis 두 개의 하위 그래픽 객체들이 존재하는데, 구현된 순서에 따라서 oXAxis가 먼저 그려지고 그 뒤에 oYAxis가 그려진다.

이와 같은 여러 단계의 과정들을 거치면서 실제로 우리 눈에 보이도록 그래픽이 구현된다. 특히 하위 그래픽 객체들이 구현될 때에는, 프로그램상에서의 순서가 실제 구현 순서라는 점을 염두에 둘 필요가 있다. 이와 같은 순서가 실제 구현된 그래픽상에서의 시각적인 차이를 줄 수도 있기 때문이다. 이러한 구현 순서는 Move라는 메서드를 사용해서 나중에 인위적으로 바꿀 수도 있다.

간단한 Plot 예제

다음의 예제 코드를 통하여 Object Graphics에서 간단한 plot을 한번 그려보도록 하자. 앞서 한번 언급하였듯이, Direct Graphics에서 가능했던 커맨드 입력창에서의 한 줄씩 입력하는 방식보다는, 하나의 완성된 프로그램의 형태를 갖도록 하는 것이 바람직하다. 하지만 지금은 아주 간단한 예제이므로 그냥 IDL의 커맨드 입력창에서 한 줄씩 입력하여 그냥 맛을 본다는 느낌으로 실행해보기 바란다.  2차원 plot의 기본형태만을 그리되, 그 외 축, 텍스트 등의 요소들은 일단 모두 생략하였다. 그리고 뷰 객체를 생성할 때 Viewplane_Rect와 같은 생소한 키워드도 나오는데, 이에 관한 내용은 추후에 객체의 위치잡기와 관련된 내용에서 자세히 다룰 것이므로 세부설명은 생략하기로 한다.

oView = OBJ_NEW(‘IDLgrView’, VIEWPLANE_RECT=[0, -1, 100, 2])

뷰 객체를 생성하되, 좌표체계가 (0, -1)을 원점으로 하고 X방향 및 Y방향의 크기가 각각 100과 2가 되도록 한다.

oModel = OBJ_NEW(‘IDLgrModel’)

모델 객체를 생성한다.

oPlot = OBJ_NEW(‘IDLgrPlot’, SIN(FINDGEN(100)/10))

사인 곡선 형태의 plot 객체를 생성한다.

oWindow = OBJ_NEW(‘IDLgrWindow’)

윈도우 객체를 생성한다.

oModel -> Add, oPlot

plot 객체를 모델 객체에 삽입한다.

oView -> Add, oModel

모델 객체를 뷰 객체에 삽입한다.

oWindow -> Draw, oView

뷰 객체가 윈도우 객체를 통해 나타나도록 rendering한다.

이와 같은 과정을 제대로 거쳤다면 다음과 같이 사인 형태의 곡선만 달랑 그려진 좀 허전한 느낌의 plot을 보게 될 것이다. 너무 허전해하지는 말자. 첫 걸음이란 다 이런 것이다.



그리고 허전하다고 해서 여기서 다 끝내지는 말자. 생성했던 객체들은 아직 메모리상에 상주하고 있다. 현재 떠있는 윈도우를 끄고 다음 명령을 다시 실행하여 새 윈도우를 다시 띄워보자.

oWindow = OBJ_NEW(‘IDLgrWindow’) 

그리고, 다음 명령을 다시 실행해보면 그림이 다시 나타날 것이다. 이것은 아까 구현했던 객체들이 아직도 메모리상에 있기 때문에, 그저 나타나라는(draw) 메서드만으로 바로 다시 나타나는 것이다. 일반적으로 기존의 Direct Graphics 체계하에서 작업을 할 경우였다면, plot명령부터 다 다시 실행해줘야 그림이 나타났을 것이지만, 여기서는 눈에 안보인다고 해서 진짜 사라진 것이 절대 아님을 기억해야 한다. 이제 정말 제대로 종결하려면 다음과 같은 명령을 사용하여 이를 모두 직접 제거해줘야한다는 점을 잊어서는 안된다.

OBJ_DESTROY, oWindow

윈도우 객체를 메모리상에서 제거한다.

OBJ_DESTROY, oView

뷰 객체를 메모리상에서 제거한다. 이 때 뷰 객체에 포함된 하위 객체들까지 한꺼번에 제거된다. 뷰 객체와 윈도우 객체를 따로 생각해줘야함을 유의한다. 객체의 종류에 상관없이 지금 존재하는 객체들 모두를 한꺼번에 제거해도 된다면, 다음과 같은 명령을 사용해도 무방하다.

OBJ_DESTROY, OBJ_VALID()


그래픽 객체들의 계층구조에 관해서는 이 정도로 마무리한다. 이제 다음부터는 화면상에서 객체들의 위치 지정에 관하여 자세히 살펴보기로 하겠다.

반응형

'IDL > Object Graphics' 카테고리의 다른 글

Object Graphics in IDL [16]  (0) 2010.12.15
Object Graphics in IDL [15]  (0) 2010.12.10
Object Graphics in IDL [13]  (0) 2010.12.01
Object Graphics in IDL의 연재와 관련하여...  (0) 2010.11.12
Object Graphics in IDL [12]  (0) 2010.10.10