IDL/Object Graphics

Wire Frame 3D Sphere의 구현 [2]

이상우_IDL 2016. 10. 24. 17:16
728x90
반응형

지난 게시물에서는 와이어 프레임의 형태를 띈 3차원 구체 폴리곤(Spherical Polygon)을 구현하는 방법에 대하여 소개를 했었습니다. 이 작업은 IDL의 객체 지향 그래픽스 체계(Object Graphics)를 기반으로 MESH_OBJ 프로시저 및 IDLgrPolygon 클래스 등의 핵심 기능들을 사용하여 진행되었고, 관련 예제 코드도 소개를 했습니다. 그리고 이 방법으로 제법 그럴듯한 와이어 프레임 구체를 구현하는데 성공을 했는데요. 지난 게시물에서 구현된 형태도 나름 나쁘지 않지만 조금 더 작업을 진행해 보고자, 오늘 이 게시물에서 내용을 이어 가게 되었습니다.


오늘 작업의 목적은, 구체의 바깥쪽과 안쪽을 서로 다르게 보이도록 하는 것입니다. 즉 와이어 프레임의 외곽은 정상적으로 보이면서, 내부는 약간 반투명하게 보이도록 하고자 합니다. 사실 이러한 구현도 물론 가능하고 그 결과 그림도 이 게시물의 하단에 있으므로 미리 봐두셔도 좋습니다. 물론 이와 같이 보이도록 하려면 약간의 테크닉이 필요합니다. 왜냐하면, IDLgrPolygon 클래스의 STYLE 속성의 값을1로 설정함으로써 얻어지는 와이어 프레임(또는 그물망(Mesh) 구조라고도 함) 자체만으로는 안쪽 면과 바깥쪽 면의 투명도를 차별화하여 구현하는 것이 불가능하기 때문입니다.


그래서 여기서는 와이어 프레임 형태의 구체 외에 별도의 구체를 추가적으로 구현하는 방법을 시도해 보았습니다. 이러한 제 2의 구체는 이미 MESH_OBJ 프로시저에서 산출된 vertices, polygons 정보들을 그대로 사용합니다. 다만 STYLE 속성의 값이 2인 매끈한 면의 형태가 되도록 함과 동시에 이 면이 약간의 투명도를 갖도록 처리합니다. 이렇게 하면 전반적으로 와이어 프레임의 바깥쪽과 안쪽의 투명도가 서로 다른 듯한 효과를 줄 수가 있습니다. 이러한 작업을 하려면 지난번보다는 약간 복잡한 과정이 필요하긴 하지만, 그렇다고 코드의 양이 그렇게 많이 늘어나지는 않습니다. 구현을 위한 예제 코드의 내용은 다음과 같습니다.


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

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

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

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

  COLOR=[144, 238, 144], ALPHA_CHANNEL=0.5)

oModel = IDLgrModel()

oModel -> Add, oWire

oModel -> Add, oSphere

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


이 내용은 지난 회 예제 코드와 다른 점들이 몇가지 있는데요. 먼저 IDLgrPolygon 클래스의 객체 두 개를 생성하였습니다. 하나는 기존에 이미 구현해봤던 와이어 프레임 형태의 구체 폴리곤(oWire)에 해당되고, 또 하나는 매끈한 면으로 구현된 새로운 폴리곤(oSphere)에 해당됩니다. 새로운 구체 폴리곤에 대해서는 우선 면의 색상을 연한 녹색으로 설정했고, ALPHA_CHANNEL 속성의 값을 0.5로 설정함으로써 반투명하게보이도록 처리하였습니다. 이 두 개의 폴리곤 객체들이 동시에 존재해야 하기 때문에, 이 둘을 하나의 모델(Model)  객체 안에 포함시켰습니다.


모델 객체라 함은 IDLgrModel이라는 클래스에 속하는데, 여러 개의 그래픽 객체들을 한꺼번에 구현해야 할 경우 이들을 모두 포함하는 그릇의 역할을 한다 정도로만 이해하시면 됩니다. 위의 코드에서는 모델 클래스의 객체를 먼저 생성하고, Add라는 메서드를 사용하여 와이어 프레임 구체 및 면 구체 둘을 차례로 모델 안에 넣는 과정이 추가되었습니다. 따라서 XOBJVIEW 프로시저의 인자는 두 구체들을포함하는 모델 객체가 되어야 합니다. 이와 같은 과정을 통하여 구현된 구체의 모습은 다음 그림과 같습니다.



XOBJVIEW 인터페이스에서는 마우스 왼쪽 버튼을 누른 채 드래그를 하면 객체를 이리저리 회전시켜서 볼 수가 있습니다. 그리고 이렇게 회전을 시킬 때 드래그를 하는 동안에는 품질이 약간 저하되는 느낌이 들 수 있는데, 이것은 XOBJVIEW 인터페이스 자체의 기본 설정이기 때문입니다. 드래그를 할 동안에도 품질 저하가 없도록 하려면, 인터페이스 상의 상단 메뉴바에서 View -> Drag Quality 옵션을기존의 Medium 대신 High로 설정해두면 됩니다. 어쨌든 이 정도면 나름 그럴듯한 모습을 보이는 것 같습니다.


지금까지 OG 체계의 그래픽 기능을 사용하여 와이어 프레임 구체 폴리곤을 구현하는 방법을 소개해 보았습니다. 이러한 작업을 NG를 놔두고 굳이 그 복잡하다는 OG 체계 기반으로 한 이유는, 폴리곤(Polygon)의 구현에 있어서 OG 체계의 IDLgrPolygon 클래스가 NG 체계의 POLYGON 함수에 비하여 좀 더 다양하고 유연한 옵션들을 제공하기 때문입니다. 특히 폴리곤 표면상에 이미지를 입히는 텍스쳐 맵핑(Texture Mapping)과 같은 작업은 OG에서만 가능합니다. 따라서 이번에 설명한 내용과 그 외 OG에서 폴리곤 구현에 있어 지원되는 여러가지 기능들을 혼용한다면, 좀 더 다양하고 멋진 가시화도 가능할 것으로 생각해 봅니다.

반응형