IDL/New Graphics

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

이상우_idl 2022. 8. 3. 14:09
728x90
반응형

지난 회차에 이어서 오늘은 Type 3에 해당되는 Cylindrical 유형에 관하여 알아보겠습니다. 이 유형은 말 그대로 원기둥과 같은 형태를 띄는 폴리곤에 해당됩니다. 이것은 마치 평면상에 존재하는 원형 폴리곤을 Z축 방향으로 연장함으로써 마치 단면이 원형인 기둥과 같은 형태의 폴리곤을 생성하는 경우라고 보면 됩니다. 실제로는 기둥보다는 단면이 원형이고 속이 빈 강관의 모습에 더 가깝긴 합니다. 이것도 사실 원형 기반의 압출이라고 볼 수 있기 때문에 원리적으로는 Type 5 유형인 Extrusion과 유사한 측면이 분명히 있습니다. 다만 압출의 대상이 임의의 다각형이냐 아니면 원형이냐의 차이만 있을 뿐입니다. 어쨌든 이러한 특성에 맞는 입력정보들을 제공하여 MESH_OBJ 명령을 사용하면 되는데요. 예제를 먼저 보겠습니다.

 

p3 = 1

p4 = 8

n = 10

arr = REPLICATE(4, n, 2)

MESH_OBJ, 3, vertices, polygons, arr, P3=p3, P4=p4

 

여기서 MESH_OBJ 명령에서는 Type에 해당되는 3이라는 값을 첫번째 인수로 주는 것 외에도 입력 인수 arr 및 키워드 P3, P4가 사용되고 있습니다. 그리고 명령이 실행된 후 그 결과를 vertices, polygons로 돌려받게 됩니다. Type 3에서 정의되는 폴리곤은 앞서 언급했듯이 마치 단면이 원형인 압출 기둥과 같은 형태를 띄게 되는데 이를 위해서는 단면이 될 원형 폴리곤의 형태를 사전에 정의하여 입력 정보로 제공해야 합니다. 여기서는 arr이라는 nx2 구조의 2차원 배열로 정의되었는데, 이것은 Z 방향으로 높이 4에 위치하며 n(여기서는 10)의 꼭지점들로 구성된 원형 폴리곤임을 의미합니다. 그리고 P3 P4는 압출의 방향 즉 Z 방향의 범위값이 되는데 여기서는 18로 설정되었습니다. 따라서 구현될 원기둥은 Z 방향으로 1~8의 범위에 위치하며 그 길이가 7이 됩니다.

 

이제 이렇게 정의된 폴리곤의 모습을 보기 위하여 다음과 같이 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)

 

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

 

 

이 모습을 보면 일단 단면이 되는 원형의 중심이 (0, 0)임을 알 수 있습니다. 따라서 적당한 위치로 옮겨주는 것이 좋을 것 같습니다. 그리고 단면의 모습이 원형이라고 하기엔 좀 투박해 보이는데, 아무래도 앞서 꼭지점들의 개수를 10으로 제한했기 때문에 이렇게 각진 모습이 되었습니다. 따라서 이 개수를 좀 늘려주면 더 매끄러운 형태가 될 것입니다. 따라서 이러한 변화를 다음과 같이 반영해봅시다.

 

n = 100

arr = REPLICATE(4, n, 2)

MESH_OBJ, 3, vertices, polygons, arr, P3=p3, P4=p4

xv = REFORM(vertices[0, *])+5

yv = REFORM(vertices[1, *])+5

zv = REFORM(vertices[2, *])

 

이와 같이 단면이 될 원형을 구성할 꼭지점 개수를 100개로 대폭 늘리고 중심의 위치가 (5, 5)가 되도록 해봅시다. 이 상태로 다시 실행해보면 결과는 다음 그림과 같습니다.

 

 

위의 그림은 그냥 바로 표출했을 때의 모습입니다. 첫 결과물보다 더 매끈해진 원형 단면의 기둥을 절단한 것과 같은 모습을 확인할 수 있습니다. 실제로 이 폴리곤은 속은 비어있습니다. 따라서 원형 단면의 파이프와 같다고 보면 될 듯합니다. 그리고 이 폴리곤의 위치를 명확히 확인하기 위하여 시선 방향을 조정하여 표출해보면 다음과 같습니다.

 

 

여기서 상단의 그림은 동일한 대상을 마치 위에서 XY 평면을 내려다본 것 같은 모습입니다. 그리고 하단의 그림은 동일한 대상을 마치 정면에서 XZ 평면을 바라본 것 같은 모습입니다. 그래서 이 두 그림들을 보면 앞서 MESH_OBJ 명령에 부여했던 입력 정보들에 따른 기하학적 특성을 쉽게 확인할 수 있습니다.

 

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

 

p3 = 1

p4 = 8

n = 100

arr = REPLICATE(4, n, 2)

MESH_OBJ, 3, vertices, polygons, arr, P3=p3, P4=p4

polygons = [polygons, n-1, INDGEN(n-1), n-1, INDGEN(n-1)+n]

 

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

 

 

이 그림을 보면 원래는 뚫려있던 위아래 부분이 원형의 면으로 채워진 것을 볼 수 있습니다. 그리고 P1, P2 키워드도 사용이 가능한데, 이 키워드들은 시작 각도와 끝 각도에 해당되며 라디안(Radian) 단위로 값을 부여하면 됩니다(각도의 기준은 X축 방향으로부터 반시계 방향). 예를 들면 다음과 같습니다.

 

p3 = 1
p4 = 8
n = 100
arr = REPLICATE(4, n, 2)
MESH_OBJ, 3, vertices, polygons, arr, P1=45*!DTOR, P2=270*!DTOR, P3=p3, P4=p4
xv = REFORM(vertices[0, *])+5
yv = REFORM(vertices[1, *])+5
zv = REFORM(vertices[2, *])

 

이와 같이 P1은 45도 그리고 P2는 270도가 되도록 해봅시다. 그리고 여기서는 위아래를 채우지않고 그냥 속이 빈 듯한 모습이 되도록 하였습니다. 이러한 변동사항들을 반영하여 결과를 다시 얻어보면 그 모습은 다음과 같습니다.

 

 

이 모습을 보면 각도상으로 45~270도의 범위만 렌더링된 것을 확인할 수 있습니다. 어쨌든 결국 MESH_OBJ 명령의 Type 3 유형을 사용하면 이와 같이 원기둥 또는 원형 파이프와 같은 형태의 폴리곤을 쉽게 생성할 수 있는 효과적인 방법이 될 수 있습니다.

 

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

반응형