IDL/New Graphics

MESH_OBJ 명령을 이용한 폴리곤 생성 방법 [4]

이상우_idl 2022. 7. 19. 15:18
728x90
반응형

지난 회차에 이어서 오늘은 Type 5에 해당되는 Extrusion 유형에 관하여 알아보겠습니다. Extrusion이라는 유형은 그 단어의 뜻을 찾아보면 압출이라고 번역되는데, 이것은 마치 평면상에 존재하는 다각형을 Z축 방향으로 연장함으로써 마치 단면이 다각형(삼각형, 사각형, 오각형 등등)인 기둥과 같은 형태의 폴리곤을 생성하는 경우라고 보면 됩니다. 실제로는 기둥보다는 파이프 형태의 속이 빈 강관에 더 가깝긴 합니다. 어쨌든 이러한 특성에 맞는 입력정보들을 제공하여 MESH_OBJ 명령을 사용하면 되는데요. 예제를 먼저 보겠습니다.

 

arr = [[3, 8, 8, 3, 3], [1, 1, 7, 7, 1], [2, 2, 2, 2, 2]]

arr = TRANSPOSE(arr)

HELP, arr

MESH_OBJ, 5, vertices, polygons, arr, P2=[0, 0, 6]

 

여기서 MESH_OBJ 명령에서는 Type에 해당되는 5라는 값을 첫번째 인수로 주는 것 외에도 입력 인수 arr 및 키워드 P2가 사용되고 있습니다. 그리고 명령이 실행된 후 그 결과를 vertices, polygons로 돌려받게 됩니다. Type 5에서 정의되는 폴리곤은 앞서 언급했듯이 마치 단면이 다각형인 압출 기둥과 같은 형태를 띄게 되는데, 이를 위해서는 단면이 될 다각형의 형태를 사전에 정의하여 입력 정보로 제공해야 합니다. 여기서는 arr이라는 3x5 구조의 2차원 배열로 정의되었는데, 이것은 XY 평면상에서 X 방향으로 3~8 그리고 Y 방향으로 1~7의 범위를 가지며 Z 방향으로 높이 2에 위치하는 사각형에 대한 꼭지점 좌표값들로 구성되었습니다. 그리고 키워드 P2에는 압출의 방향 및 크기에 대한 정보가 주어져야 합니다. 여기서는 Z 방향으로 6만큼 이동시켜서 압출하라는 의미입니다. 따라서 생성될 폴리곤은 Z 방향으로는 2~8의 범위를 갖게 됩니다.

 

이제 이렇게 정의된 폴리곤의 모습을 보기 위하여 다음과 같이 XYZ 축으로 구성된 3차원 공간을 정의하고 그 안에 폴리곤이 표출되도록 해봅시다.

 

xv = REFORM(vertices[0, *])

yv = REFORM(vertices[1, *])

zv = REFORM(vertices[2, *])

n = 20

x = RANDOMU(seed, n)*10

y = RANDOMU(seed, n)*10

z = RANDOMU(seed, n)*10

win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)

p = PLOT3D(x, y, z, ASPECT_Z=1, $

  XRANGE=[0, 10], YRANGE=[0, 10], ZRANGE=[0, 10], $

  /NODATA, /CURRENT)

pol = POLYGON(xv, yv, zv, CONNECTIVITY=polygons, $

  COLOR='green', FILL_COLOR='green', CLIP=0, /DATA)

 

지금까지의 과정을 실행해보면 표출 결과는 다음 그림과 같습니다.

 

 

이 그림을 잘 보면 마치 사각형 단면의 파이프를 절단한 것과 같은 모습입니다. 실제로 이 폴리곤은 속이 비어있습니다. 그리고 하단에서 왼쪽 그림은 동일한 대상을 마치 위에서 XY 평면을 내려다본 것 같은 모습입니다. 그리고 이 폴리곤의 위치를 명확히 확인하기 위하여 시선 방향을 조정하여 표출해보면 다음과 같습니다.

 

 

여기서 첫번째 그림은 동일한 폴리곤의 XY 평면상의 모습입니다. 즉 위에서 내려다본듯한 모습이다보니 속이 비어있는 것이 바로 확인이 됩니다. 그리고 두번째 그림은 XZ 평면상의 모습 즉 마치 정면에서 바라본 듯한 모습입니다. 그래서 이 두 그림들을 보면 앞서 MESH_OBJ 명령에 부여했던 입력 정보들에 따른 기하학적 특성 즉 X, Y, Z 각 방향별 좌표 범위를 쉽게 확인할 수 있습니다.

 

어쨌듯 MESH_OBJ 명령에서 Type 5는 기본적으로 이러한 형태에 해당됩니다. 그런데 여기서 한가지 의문이 생길 수 있습니다. 즉 지금과 같이 위아래가 뚫린 파이프 형태 대신 위아래 면도 다 채워진 길쭉한 육면체 기둥과 같은 폴리곤을 얻을 수는 없을까요? 불가능하지는 않습니다. 다만 약간의 추가적인 처리 과정이 필요합니다. 앞서 MESH_OBJ 명령을 사용했던 부분에서 다음과 같이 한 줄의 작업을 추가해봅시다.

 

arr = [[3, 8, 8, 3, 3], [1, 1, 7, 7, 1], [2, 2, 2, 2, 2]]

arr = TRANSPOSE(arr)

HELP, arr

MESH_OBJ, 5, vertices, polygons, arr, P2=[0, 0, 6]

polygons = [polygons, 4, 0, 1, 2, 3, 4, 5, 6, 7, 8]

 

이와 같이 MESH_OBJ 명령을 실행하여 얻은 연결성 정보인 polygons에 대하여 위쪽 면과 아래쪽 면에 대한 연결성 데이터를 덧붙이는 방식의 배열 처리를 추가해주면 됩니다. 이러한 처리 내용이 추가된 상태로 전체 과정을 다시 실행해보면 다음과 같은 그림을 얻게 됩니다.

 

 

이 그림을 보면 원래는 뚫려있던 위아래 부분이 사각형의 면으로 채워진 것을 볼 수 있습니다. 그리고 압출의 방향도 다양하게 설정할 수 있는데, P2 키워드의 설정값을 다음과 같이 [3, 3, 6]으로 변경해봅시다.

 

arr = [[3, 8, 8, 3, 3], [1, 1, 7, 7, 1], [2, 2, 2, 2, 2]]

arr = TRANSPOSE(arr)

HELP, arr

MESH_OBJ, 5, vertices, polygons, arr, P2=[3, 3, 6]

polygons = [polygons, 4, 0, 1, 2, 3, 4, 5, 6, 7, 8]

 

이러한 변경사항을 반영하여 다시 실행해보면 결과는 다음 그림과 같습니다.

 

 

여기서는 압축 방향 벡터를 [3, 3, 6]으로 정의함으로써 X Y 축 방향으로도 어느 정도 기울어진 방향으로 압출이 되도록 한 것입니다. 따라서 그림을 보면 비스듬한 방향으로 압출된 폴리곤을 얻었음을 확인할 수 있습니다.

 

결국 MESH_OBJ 명령의 Type 5는 이와 같은 육면체 폴리곤을 쉽게 생성할 수 있는 효과적인 방법이 될 수 있습니다. 물론 여기서는 단면이 사각형인 육면체 폴리곤을 예제로 소개하였지만 그 외에도 삼각형, 오각형, 육각형 등등 다양한 모습의 단면을 갖는 폴리곤들을 생성하는 것도 얼마든지 가능합니다. 이 기법이 실제로 적용된 예제를 제가 얼마전에 관련게시물을 통하여 소개한 바 있으니 이 내용도 함께 참조해보시면 좋을 것 같습니다.

 

다음 회차에서는 Type 3 Cylindrical 유형에 관하여 알아보도록 하겠습니다.

반응형