2차원 공간에 존재하는 궤적이 있고 그 위에서 움직이는 입자가 있는 상황을 가정하여 이를 그래픽적으로 도식화하고 그 움직임을 담은 애니메이션 파일을 만들어보는 예제를 소개하는 게시물을 얼마전에 올린 바 있습니다. 이번에는 2차원 대신 3차원 공간에 대한 예제를 살펴보고자 합니다. 즉 3차원 공간에 존재하는 궤적이 있고 그 위에서 움직이는 입자가 있는 상황을 가정하여 이를 그래픽적으로 도식화하고 그 움직임을 담은 애니메이션 파일을 만들어보는 예제를 소개해보기로 합니다.
사실 전반적인 내용의 흐름 자체는 2차원 예제와 크게 다르지는 않습니다. 다만 모든 것이 3차원이 구현된다는 부분만 다를 뿐입니다. 그러면 3차원 공간상에 존재하는 궤적을 구성하는 점들의 좌표 데이터를 생성하는 작업부터 진행해야 하는데요. 여기서는 3차원 공간상에 존재하는 원형 궤적을 예제로 사용해보고자 합니다. 이를 위해서는 관련된 이론적인 수식을 이용해야 하는데 아무래도 3차원 버전이다보니 수식 자체는 약간 복잡합니다. 어쨌든 이러한 수식을 사용하여 데이터를 생성하는 과정은 다음과 같습니다.
n = 400
t = [0:2*!pi:2*!pi/n]
a = 7.
b = 6.
c = 5.
r = 6.
x = r/SQRT(a^2+b^2)*(b*COS(t)+a*c*SIN(t)/SQRT(a^2+b^2+c^2))
y = r/SQRT(a^2+b^2)*(-a*COS(t)+b*c*SIN(t)/SQRT(a^2+b^2+c^2))
z = r/SQRT(a^2+b^2)*(-(a^2+b^2)*SIN(t))/SQRT(a^2+b^2+c^2)
HELP, x, y, z
여기서는 ax+by+cz=0에 해당되는 평면상에 존재하며 중심 좌표가 (0, 0, 0)이고 반경이 r인 원형 궤적을 구성하는 좌표값들로 구성된 x, y, z를 정의한 것입니다. 물론 x, y, z는 각각 X축, Y축, Z축 방향의 좌표값들인데 여기서는 각각 400개의 실수형 값들로 구성된 배열이 됩니다. 이제 이러한 점들로 구성된 궤적을 그림으로 표출하는 작업을 해야 하는데 이를 위해서는 PLOT3D 함수를 사용하기로 합니다. 그 과정은 대략 다음과 같습니다.
sx = 600
sy = 600
win = WINDOW(DIMENSIONS=[sx, sy], /NO_TOOLBAR)
p = PLOT3D(x, y, z, COLOR='green', THICK=2, ASPECT_Z=1, $
AXIS_STYLE=2, FONT_SIZE=11, MARGIN=0.2, /CURRENT)
일단 이와 같은 내용을 실행하면 3차원 공간상에 궤적이 표시됩니다. 그 모습을 보면 다음 그림과 같습니다. 그냥 보기엔 마치 타원처럼 보일 수 있지만, 원형 궤적의 평면이 기울어져있어서 그렇게 보이는 것 뿐입니다.

그리고 궤적을 구성하는 점들 중 첫번째 점인 x[0], y[0], z[0]의 위치에 3차원 구체를 삽입하고자 합니다. 즉 3차원적인 구형의 그래픽 개체를 추가하려는 것인데, 지난번 2차원 버전에서는 이를 SYMBOL 함수로 처리한 바 있습니다. 하지만 여기서 3차원적인 구체를 추가하려면 SYMBOL 함수 대신 SCATTERPLOT3D 함수를 사용해야 합니다. 그 내용은 다음과 같습니다.
sym = SCATTERPLOT3D(x[0], y[0], z[0], SYM_OBJECT=orb(), $
SYM_SIZE=3, SYM_COLOR='red', /OVERPLOT)
여기서 SCATTERPLOT3D 함수를 사용해야 하는 이유는 3차원 구체를 삽입하기 위하여 사용되는 SYM_OBJECT 속성이 SYMBOL 함수에서는 지원되지 않기 때문입니다. 어쨌든 위의 내용까지 추가로 실행되면 그 결과는 다음 그림과 같습니다.

그러면 위와 같이 삽입된 구체가 궤적을 따라 움직이도록 해봅시다. 이를 위해서는 방금 삽입했던 구체의 위치 좌표가 순차적으로 변화하도록 해줘야 합니다. 이러한 처리는 구체에 대하여 SetData 메서드를 사용하면서 이를 반복형 구문 내에서 순차적으로 실행되도록 하면 됩니다. 그 내용은 다음과 같습니다.
FOR j = 0, n DO sym.SetData, x[j], y[j], z[j]
이와 같은 내용까지 실행하면 그래픽 창에 표출된 그림 내에서 구체가 궤적을 따라 순차적으로 이동하는 모습을 볼 수 있을 것입니다. 물론 이러한 움직임을 애니메이션으로 담은 파일을 제작하는 것 필요할 것 같습니다. 그러면 애니메이션 GIF 파일로 만들기 위하여 바로 위의 반복형 구문의 내용을 다음과 같이 수정해봅시다.
wfile = 'motion_on_curve_3d.gif'
FOR j = 0, n DO BEGIN
sym.SetData, x[j], y[j], z[j]
cap = win.CopyWindow(WIDTH=sx)
frame = COLOR_QUAN(cap, 1, r, g, b)
WRITE_GIF, wfile, frame, r, g, b, /MULTIPLE, $
DELAY_TIME=2, REPEAT_COUNT=0
ENDFOR
WRITE_GIF, wfile, /CLOSE
이와 같이 애니메이션 GIF 파일로 만드는 세부적인 방법에 관해서는 관련 게시물의 내용을 참조하시면 됩니다. 이 작업이 모두 끝나면 motion_on_curve_3d.gif라는 이름의 애니메이션 GIF 파일이 생성될 것입니다. 이 파일은 아래에 첨부하였습니다.

이번에는 작업을 좀 더 확대해서 궤적과 구체를 하나 더 삽입하여 두 종류의 궤적 및 구체를 구현해보는 것은 어떨까 합니다. 이를 위해서는 당연히 두 종류의 데이터가 필요하므로 앞선 내용을 참조하여 다음과 같이 시작합니다.
n = 400
t = [0:2*!pi:2*!pi/n]
a = 7.
b = 6.
c = 5.
r = 6.
x1 = r/SQRT(a^2+b^2)*(b*COS(t)+a*c*SIN(t)/SQRT(a^2+b^2+c^2))
y1 = r/SQRT(a^2+b^2)*(-a*COS(t)+b*c*SIN(t)/SQRT(a^2+b^2+c^2))
z1 = r/SQRT(a^2+b^2)*(-(a^2+b^2)*SIN(t))/SQRT(a^2+b^2+c^2)
a = 2.
b = 8.
c = 3.
r = 9.
x2 = r/SQRT(a^2+b^2)*(b*COS(t)+a*c*SIN(t)/SQRT(a^2+b^2+c^2))
y2 = r/SQRT(a^2+b^2)*(-a*COS(t)+b*c*SIN(t)/SQRT(a^2+b^2+c^2))
z2 = r/SQRT(a^2+b^2)*(-(a^2+b^2)*SIN(t))/SQRT(a^2+b^2+c^2)
HELP, x1, y1, z1, x2, y2, z2
여기서는 궤도 평면 및 반경이 서로 다른 두 종류의 궤적 데이터를 정의하였습니다. 이어지는 표출 과정은 앞선 예제와 거의 유사합니다. 표시할 그래픽 개체들이 두 종류가 되었다는 차이만 고려하면 됩니다.
sx = 600
sy = 600
win = WINDOW(DIMENSIONS=[sx, sy], /NO_TOOLBAR)
p1 = PLOT3D(x1, y1, z1, COLOR='green', THICK=2, ASPECT_Z=1, $
XRANGE=[-10, 10], YRANGE=[-10, 10], ZRANGE=[-10, 10], $
AXIS_STYLE=2, FONT_SIZE=11, MARGIN=0.2, /CURRENT)
sym1 = SCATTERPLOT3D(x1[0], y1[0], z1[0], SYM_OBJECT=orb(), $
SYM_SIZE=3, SYM_COLOR='red', /OVERPLOT)
p2 = PLOT3D(x2, y2, z2, COLOR='blue', THICK=2, ASPECT_Z=1, $
AXIS_STYLE=2, FONT_SIZE=11, MARGIN=0.2, /OVERPLOT)
sym2 = SCATTERPLOT3D(x2[0], y2[0], z2[0], SYM_OBJECT=orb(), $
SYM_SIZE=4, SYM_COLOR='aqua', /OVERPLOT)
여기서는 두 종류의 데이터에 해당되는 궤적 및 구체를 모두 표시하기 위하여 PLOT3D 함수 및 SCATTERPLOT3D 함수가 각각 두번씩 사용되었습니다. 표출된 그림을 보면 다음과 같습니다.

그 다음은 삽입된 구체들이 각자의 궤도상에서 움직이도록 하는 작업입니다. 요령은 앞선 예제와 비슷하며 단지 구체 하나가 더 추가되었다는 점만 다를 뿐입니다.
FOR j = 0, n DO BEGIN
sym1.SetData, x1[j], y1[j], z1[j]
sym2.SetData, x2[j], y2[j], z2[j]
ENDFOR
이와 같은 내용을 실행하면 그래픽 창에 표출된 그림 내에서 구체가 궤적을 따라 순차적으로 이동하는 모습을 볼 수 있게 됩니다. 이제 이 모습을 애니메이션 GIF 파일로 만들기 위하여 위의 내용을 다음과 같이 수정합니다.
wfile = 'motion_on_curve_3d.gif'
FOR j = 0, n DO BEGIN
sym1.SetData, x1[j], y1[j], z1[j]
sym2.SetData, x2[j], y2[j], z2[j]
cap = win.CopyWindow(WIDTH=sx)
frame = COLOR_QUAN(cap, 1, r, g, b)
WRITE_GIF, wfile, frame, r, g, b, /MULTIPLE, $
DELAY_TIME=2, REPEAT_COUNT=0
ENDFOR
WRITE_GIF, wfile, /CLOSE
이 작업이 모두 끝나면 motion_on_curve_3d.gif라는 이름의 애니메이션 GIF 파일이 생성될 것입니다. 이 파일은 아래에 첨부하였습니다.

오늘 소개된 두가지 예제들에서는 애니메이션을 담은 파일을 GIF 형식으로 만들었는데, MP4 형식의 동영상 파일로 만드는 것도 물론 가능합니다. 그 방법은 앞서 2차원 공간 버전에 대한 내용을 담은 게시물에서 소개된 것과 동일하며 여기서는 생략하기로 합니다.
* 이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.
'IDL > New Graphics' 카테고리의 다른 글
| 궤적 상의 입자 운동 구현 및 애니메이션 (0) | 2026.03.13 |
|---|---|
| 데이터 포인트들을 다양한 색상으로 표출하기 [3] (0) | 2026.03.06 |
| 막대 차트(Bar Chart) 표출하기 (0) | 2025.12.09 |
| BOXPLOT 함수 소개 (0) | 2025.12.03 |
| 2종의 막대 그래프를 서로 붙여서 표출하기 (0) | 2025.11.27 |