MESH_OBJ에 관한 연재 게시물이 어느덧 7회차를 맞고 있습니다. 연재가 너무 길어지는 감이 있긴 한데, 아마도 8회차가 마지막이 될 것 같습니다. 어쨌든 이번 7회차에서는 Type 6에 해당되는 Revolution 유형에 관하여 알아보겠습니다. 이 유형은 단어 뜻으로 보면 회전에 의하여 폴리곤을 생성한다는 의미임을 충분히 짐작할 수 있습니다. 실제로는 평면적인 형태를 갖는 폴리곤을 임의의 방향을 갖는 축(Axis)에 대하여 일정한 각도만큼 회전시킨 그 궤적(?)을 하나의 3차원적 폴리곤으로 얻게 해주는 유형이라고 볼 수 있습니다. 따라서 매우 다양한 형태의 예제들을 생각해볼 수 있겠지만, 여기서는 비교적 단순한 형태의 예제를 통하여 살펴보고자 합니다. 이 예제에서는 XZ 평면상에 존재하는 사각형을 Z축을 중심으로 회전시켜서 결과물을 얻어보도록 하겠습니다. 따라서 이러한 특성에 맞는 입력 정보들을 MESH_OBJ 명령에 제공하는 것이 먼저 필요한데 그 과정은 다음과 같습니다.
p1 = 10
p4 = 0*!DTOR
p5 = 90*!DTOR
arr = [[2, 0, 3], [4, 0, 3], [4, 0, 7], [2, 0, 7], [2, 0, 3]]
MESH_OBJ, 6, vertices, polygons, arr, P1=p1, P4=p4, P5=p5
여기서 MESH_OBJ 명령에서는 Type에 해당되는 6이라는 값을 첫번째 인수로 주는 것 외에도 입력 인수 arr 및 키워드 P1, P4, P5가 사용되고 있습니다. 그리고 명령이 실행된 후 그 결과를 vertices, polygons로 돌려받게 됩니다. Type 6에서 정의되는 폴리곤은 마치 평면적인 다각형을 회전시켜서 얻는 입체적 궤적과 같은 모습을 띄게 되는데, 이를 위해서는 단면이 될 다각형의 형태를 사전에 정의하여 입력 정보로 제공해야 합니다. 여기서는 arr이라는 3x5 구조의 2차원 배열로 정의되었는데, 이것은 XZ 평면상에서 X 방향으로 2~4 그리고 Z 방향으로 3~7의 범위를 가지며 Y 방향 좌표가 0인 사각형을 정의하는 꼭지점들로 구성되었습니다. 그리고 키워드 P1은 회전을 몇 단계로 끊어서 할 것인가를 나타내는 숫자가 되어야 하는데, 여기서는 10단계로 끊어가면서 회전시키라는 의미입니다. 그리고 P4, P5는 회전 각도의 범위에 해당되며, 여기서는 0도로 시작하여 90도에서 끝나도록 한 것입니다.
이제 이렇게 정의된 폴리곤의 모습을 보기 위하여 다음과 같이 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)
지금까지의 과정을 실행해보면 표출 결과는 다음 그림과 같습니다.
이 그림은 그냥 바로 결과를 표출했을 때의 모습입니다. XZ 평면상의 사각형 단면이 90도의 각도만큼 회전하면서 거쳐간 궤적이 그대로 3차원적인 폴리곤으로 형성된 모습임을 눈으로 확인할 수 있습니다. 실제로 이 폴리곤은 속은 비어있습니다. 마치 사각형 단면의 굽어진 파이프와 같다고 보면 될 듯합니다. 그리고 동일한 대상을 마치 위에서 XY 평면을 내려다본 것 같은 모습은 다음 그림과 같습니다.
이 그림을 보면 90도의 각도를 10단계로 끊어가면서 회전시킨 흔적이 그대로 보입니다. 그리고 애초에 회전의 대상이 되었던 XZ 평면상의 사각형 폴리곤만 따로 나타내보면 그 모습은 다음 그림과 같습니다.
즉 이러한 평면적 형태의 사각형 폴리곤을 0~90도의 각도 범위에 걸쳐 회전시키 결과물을 얻었다고 보면 됩니다. 따라서 위의 세 개의 그림들을 함께 비교하면서 보면 앞서 MESH_OBJ 명령에 부여했던 입력 정보들에 따른 기하학적 특성을 쉽게 확인할 수 있습니다.
만약 회전의 범위를 0~360도로 늘리고 단계수도 더 늘린다면 완전한 고리(Ring) 형태의 결과물을 얻을 수도 있습니다. 즉 다음과 같은 변경을 시도해봅시다.
p1 = 72
p4 = 0*!DTOR
p5 = 360*!DTOR
arr = [[2, 0, 3], [4, 0, 3], [4, 0, 7], [2, 0, 7], [2, 0, 3]]
MESH_OBJ, 6, vertices, polygons, arr, P1=p1, P4=p4, P5=p5
xv = REFORM(vertices[0, *])+5
yv = REFORM(vertices[1, *])+5
zv = REFORM(vertices[2, *])
여기서는 단계수를 72로 설정하고 회전 각도의 범위를 0도부터 360도로 변경하였습니다. 그리고 최종 완성될 폴리곤의 중심 좌표가 기존의 (0, 0) 대신 (5, 5)가 되도록 하였습니다. 이러한 변화를 반영하여 다시 실행해보면 결과는 다음 그림과 같습니다.
이와 같이 평면 사각형을 360에 걸쳐 회전시켜서 마치 각진 고리와 같은 모습을 띈 폴리곤을 얻을 수 있습니다. 그러면 이번에는 회전의 대상을 사각형 대신 오각형으로 변경해봅시다. 이를 위하여 arr을 다음과 같이 다시 정의합니다.
p4 = 0*!DTOR
p5 = 1*!DTOR
arr = [[2, 0, 3], [4, 0, 3], [5, 0, 5], [4, 0, 7], $
[2, 0, 7], [2, 0, 3]]
그리고 여기서는 일단 오각형의 모습만 잘 보이도록 하기 위하여 회전 범위를 0~1도로 매우 좁게 설정하였습니다. 이러한 변화를 반영하여 전체 과정을 다시 실행해보면 결과는 다음 그림과 같습니다.
즉 이와 같은 형태의 오각형을 Z축에 대하여 360도 회전시키겠다는 의미입니다. 이제 각도 범위를 0~360도로 다시 변경한 후 전체 과정을 다시 실행해봅시다.
p4 = 0*!DTOR
p5 = 360*!DTOR
그 결과는 다음 그림과 같습니다.
앞선 예제들에서는 회전의 중심이 되는 축이 항상 Z축 그 자체였습니다. 물론 회전축에 대한 별도의 설정을 통하여 임의의 회전축을 적용하는 것도 가능합니다. 이를 위해서는 아직 사용하지 않고 있었던 P2, P3 키워드를 사용해야 합니다. P2 키워드는 회전축 벡터의 시작점의 좌표가 되고 P3 키워드는 끝점의 좌표가 됩니다. 결국 P2, P3 키워드에 주어진 좌표들에 의하여 회전축의 시작점 및 방향이 결정된다고 보면 됩니다. P2 키워드의 디폴트 값은 [0, 0, 0]이고 P3 키워드의 디폴트 값은 [0, 0, 1]입니다. 즉 원점에서 출발하여 Z축 방향으로 향하는 벡터(결국 Z축 그 자체)가 회전축이 되는 것이 디폴트 설정입니다. 그러면 전반적인 설정을 다음과 같이 정의해봅시다.
p1 = 20
p2 = [0, 0, 0]
p3 = [0, 0, 1]
p4 = 0*!DTOR
p5 = 180*!DTOR
arr = [[2, 0, 3], [4, 0, 3], [5, 0, 5], [4, 0, 7], $
[2, 0, 7], [2, 0, 3]]
MESH_OBJ, 6, vertices, polygons, arr, P1=p1, P4=p4, P5=p5, $
P2=p2, P3=p3
xv = REFORM(vertices[0, *])
yv = REFORM(vertices[1, *])
zv = REFORM(vertices[2, *])
여기서는 p2, p3을 정의하고 이들을 P2, P3 키워드에 각각 부여하였습니다. 물론 디폴트 값과 똑같이 정의하여 사용했기 때문에 결과 자체는 앞선 예제와 다를 바가 없습니다. 다만 단계의 갯수는 20으로 그리고 각도 범위를 0~180도로 좀 다르게 설정해보았습니다. 또한 원활한 이해를 돕기 위하여 xv, yv에 굳이 5를 더하지 않고 그냥 그대로 사용하였습니다. 그 결과는 다음 그림과 같습니다.
이 그림을 보면 회전축이 Z축 자체임을 확실히 알 수 있습니다. 그러면 이번에는 회전축을 변경해보겠습니다. 다음과 같이 회전축이 X축이 되도록 설정해봅니다.
p2 = [0, 0, 0]
p3 = [1, 0, 0]
p4 = 180*!DTOR
p5 = 360*!DTOR
또한 이해를 돕기 위하여 각도 범위를 180~360으로 설정해보았습니다. 그 결과는 다음 그림과 같습니다.
이 그림을 보면 회전축이 X축 자체임을 확실하게 알 수 있습니다. 회전축 벡터는 임의의 방향이 되도록 정의할 수도 있습니다. 예를 들어 다음과 같이 XZ 평면상에서 X축 방향으로 많이 기울어진 벡터가 회전축이 되도록 해봅시다.
p2 = [0, 0, 0]
p3 = [5, 0, 2]
결과는 다음 그림과 같습니다. 회전축 자체가 어느 정도 기울어진 형태이기 때문에 그 결과로 구현된 폴리곤도 이렇게 기울어진 형태로 얻어지게 됩니다.
이와 같이 MESH_OBJ 명령에서 Type 6 Revolution을 사용하면 임의의 평면적 형태의 단면을 갖고 임의의 회전축 벡터를 중심으로 회전된 회전형 폴리곤을 비교적 쉽게 생성할 수 있음을 위의 예제들을 통하여 확인할 수 있습니다.
이제 이 시리즈의 마지막이 될 다음 8회차에서는 Type 0 Triangulated 유형에 관하여 알아보도록 하겠습니다.
'IDL > New Graphics' 카테고리의 다른 글
MESH_OBJ 명령을 이용한 폴리곤 생성 방법 [8] (0) | 2022.12.21 |
---|---|
기호(Symbol)의 크기 설정 (0) | 2022.12.06 |
MESH_OBJ 명령을 이용한 폴리곤 생성 방법 [6] (0) | 2022.08.22 |
MESH_OBJ 명령을 이용한 폴리곤 생성 방법 [5] (0) | 2022.08.03 |
TEXT 함수 소개 (0) | 2022.07.26 |