주요 콘텐츠

애니메이션 기법

MATLAB®에서는 여러 가지 기법을 사용하여 애니메이션을 만들 수 있습니다.

기법설명

루프에서 데이터 업데이트.

루프에서 그래픽스 객체의 속성을 업데이트하고 업데이트 내용을 화면에 표시합니다.

이 기법은 플롯에서 대부분의 내용이 똑같이 유지되는 경우 애니메이션을 생성하는 데 유용합니다.

루프에서 데이터를 업데이트하여 애니메이션 만들기

행렬 변환 적용.

그래픽스 객체를 그룹화하고 그룹 전체에 변환을 적용합니다.

이 기법은 객체 그룹의 위치와 방향을 한꺼번에 변경하려는 경우 유용합니다.

행렬 변환을 사용하여 애니메이션 만들기

애니메이션 GIF 파일 생성.

루프에서 Figure를 업데이트하고 exportgraphics 함수를 사용하여 애니메이션 GIF 파일의 프레임을 캡처합니다.

이 기법은 저장 후 다시 재생할 애니메이션을 만드는 경우에 유용합니다.

애니메이션 GIF 파일 생성하기

동영상 생성.

루프에서 Figure를 업데이트하고 getframe 함수를 사용하여 동영상의 프레임을 캡처합니다.

이 기법은 실시간으로 빠르게 그릴 수 없는 복잡한 애니메이션이나, 애니메이션을 저장하여 다시 재생하려는 경우에 유용합니다. 동영상을 재생하려면 movie 함수를 사용합니다.

동영상을 만들고 재생하기

애니메이션된 선 생성.

animatedline 함수를 사용하여 데이터의 선 애니메이션을 만듭니다.

이 기법은 선 애니메이션을 최적화하려는 경우에 유용합니다.

애니메이션된 선 만들기

특화된 애니메이션 함수 사용하기.

특화된 애니메이션의 경우, comet, comet3, streamparticles 등의 함수를 사용할 수 있습니다.

흐름 입자 애니메이션 만들기

루프에서 데이터를 업데이트하여 애니메이션 만들기

선을 따라 움직이는 마커의 애니메이션을 만듭니다.

  • 사인파를 플로팅합니다. 그런 다음 마커를 만들고 이를 변수 mkr로 저장합니다. 그러면 나중에 마커의 속성에 액세스할 수 있습니다.

  • xlim, ylim, zlim 함수를 사용하여 각 좌표축의 제한을 설정합니다. 제한을 설정하면 자동 축 제한 계산이 비활성화되는데, 이로 인해 애니메이션이 깜박이거나 느려질 수 있습니다.

  • 마커 좌표를 업데이트하는 for 루프를 생성합니다. 각 반복에서 Scatter 객체(mkr)의 XDataYData 속성을 변경하여 선을 따라 마커를 이동시킵니다.

  • 각 루프 반복의 끝에서 drawnow 함수를 호출하여 Figure 표시를 업데이트합니다.

x = linspace(0,10,500);
y = sin(x);

% Plot a line and create a marker
plot(x,y)
hold on
mkr = scatter(NaN,NaN,[],"red","filled");
hold off
xlim([0 10])
ylim([-1 1])
zlim([-1 1])

% Move the marker along the line
for i = 1:length(x)
    mkr.XData = x(i);
    mkr.YData = y(i);
    drawnow
end

Animation of a red marker tracing a line plot of a sine wave

행렬 변환을 사용하여 애니메이션 만들기

효율적인 플롯 애니메이션 방법은 모든 점들을 반복하는 대신 하나 이상의 객체에 변환 행렬(transformation matrix)을 적용하는 것입니다. 이 기법에서는 1개 이상의 그래픽스 객체를 Transform 객체의 자식으로 그룹화한 다음, Transform 객체의 행렬 속성을 설정하여 모든 자식의 위치를 조정합니다. 사용할 수 있는 변환에는 평행 이동, 회전 및 스케일링 등이 있습니다. 사용자가 자체적인 변환 행렬을 정의할 수도 있습니다.

구가 회전하는 애니메이션을 만듭니다.

  • sphere 함수를 사용하여 구의 좌표를 생성합니다.

  • hgtransform 함수를 사용하여 이름이 grpTransform 객체를 만듭니다. 그런 다음 surf 함수를 호출하고 부모 객체를 grp로 지정하여 구를 Surface 객체로 플로팅합니다.

  • 좌표축 그리드 선을 표시하고 3차원 뷰에 플롯 상자를 표시합니다.

  • 0~2π 사이에서 간격이 균일한 각도 값 300개를 순차적으로 실행하는 for 루프를 만들고 매 반복(회차)마다 작은 각도만큼 구를 회전시킵니다. makehgtform 함수를 사용하여 각 작은 회전 각도에 대한 변환 행렬을 생성합니다. 그런 다음 grpMatrix 속성을 설정하여 회전을 수행합니다.

  • 각 루프 반복의 끝에서 drawnow 함수를 호출하여 Figure 표시를 업데이트합니다.

% Create the coordinates of a sphere
ax = axes;
[x,y,z] = sphere(270);

% Create transform object and plot the sphere
grp = hgtransform(Parent=ax);
s = surf(ax,x,y,z,z,Parent=grp,EdgeColor="none");

% Display grid lines and show the plot box in 3-D
grid on
view(3)
axis vis3d
axis tight manual

% Rotate the sphere by small angles in a loop
for ang = linspace(0,2*pi,300)
   tm = makehgtform("axisrotate",[1,1,1],ang);
   grp.Matrix = tm;
   drawnow
end

Animation of a rotating sphere

애니메이션 GIF 파일 생성하기

포물선을 따라 움직이는 마커의 애니메이션 GIF 파일을 만듭니다.

  • 하나의 마커로 포물선을 플로팅합니다.

  • 매 반복 시 마커의 위치를 변경하는 for 루프를 만듭니다.

  • 각 루프 반복의 끝에서 exportgraphics 함수를 사용하여 Figure를 애니메이션 GIF 파일의 프레임으로 캡처합니다. 첫 루프 반복에서는 Append 이름-값 인수를 false로 설정하여 첫 프레임으로 새 파일을 만듭니다. 그런 다음, 나머지 루프 반복에서는 Append 이름-값 인수를 true로 설정하여 현재 프레임을 캡처하고 지정된 GIF 파일에 추가합니다.

  • 결과로 생성되는 parabola.gif 파일이 현재 폴더에 저장됩니다.

% Plot a parabola and a marker
x = -10:0.5:10;
y = x.^2;
p = plot(x,y,"-o",MarkerFaceColor="red");

% Move the marker along the parabola and capture frames in a loop
for i = 1:41
    p.MarkerIndices = i;
    if i == 1
        exportgraphics(gca,"parabola.gif",Append=false)
    else    
        exportgraphics(gca,"parabola.gif",Append=true)
    end 
end

Animation of a red marker tracing a line plot of a parabola

동영상을 만들고 재생하기

루프에서 getframe 함수를 사용하여 형태가 바뀌는 곡면 플롯의 동영상을 만듭니다. getframe 함수는 구조체로 구성된 배열에서 동영상 프레임을 캡처합니다. 동영상을 재생하려면 movie 함수를 사용합니다.

  • surf 함수를 사용하여 peaks 함수의 좌표를 곡면으로 플로팅하고, Surface 객체를 변수 s로 저장합니다.

  • axis tight manual 명령을 사용하여 플롯 상자를 곡면에 단단히 위치시키고 좌표축 제한을 고정합니다.

  • 애니메이션 프레임을 포함할 40개 구조체로 구성된, F라는 이름의 배열을 만듭니다.

  • 매 반복 시 곡면의 형태를 변경하는 for 루프를 만듭니다.

  • 각 루프 반복의 끝에서 drawnow 명령을 사용하여 Figure를 업데이트하고 getframe 함수를 사용하여 동영상 프레임을 캡처합니다.

  • 결과로 생성되는 동영상이 구조체형 배열 F로 저장됩니다.

% Plot a surface
Z = peaks;
s = surf(Z);
axis tight manual

% Change the shape of the surface and capture frames
loops = 40;
F(loops) = struct("cdata",[],"colormap",[]);
for j = 1:loops
    Zframe = sin(j*pi/10)*Z;
    s.ZData = Zframe;
    drawnow
    F(j) = getframe(gcf);
end

동영상을 두 번 재생합니다.

fig = figure;
movie(fig,F,2)

Animation of a surface plot changing shape

애니메이션된 선 만들기

animatedline 함수를 사용하면 선 애니메이션을 최적화하는 데 도움이 됩니다. 이 함수를 사용하면 기존의 점을 다시 정의하지 않고 선에 새 점을 추가할 수 있습니다.

2개의 선이 점점 길어지는 애니메이션을 만듭니다.

  • 각기 다른 색의 애니메이션된 선 두 개를 생성합니다.

  • 루프가 시작되기 전에 축 제한을 설정하여 루프 반복마다 제한을 다시 계산하지 않도록 합니다.

  • 선에 점을 추가하는 for 루프를 만듭니다.

  • 각 루프 반복의 끝에서 drawnow 또는 drawnow limitrate를 사용하여 Figure 표시를 업데이트합니다.

% Create two animated lines of different colors
a1 = animatedline(Color=[0 0.7 0.7]);
a2 = animatedline(Color=[0 0.5 0.5]);
axis([0 20 -1 1])
drawnow

x = linspace(0,20,10000);
for k = 1:length(x)
    % Add to first line
    xk = x(k);
    ysin = sin(xk);
    addpoints(a1,xk,ysin);

    % Add to second line
    ycos = cos(xk);
    addpoints(a2,xk,ycos);

    % Update screen
    drawnow limitrate
end

Animation of two lines growing as they accumulate data

참고 항목

함수

도움말 항목