애니메이션 기법
MATLAB®에서 네 가지 기본 기법을 사용하여 애니메이션을 생성할 수 있습니다.
기법 | 설명 | 예 |
---|---|---|
루프에서 데이터 업데이트. | 루프에서 그래픽스 객체의 속성을 업데이트하고 업데이트 내용을 화면에 표시합니다. 이 기법은 플롯에서 대부분의 내용이 똑같이 유지되는 경우 애니메이션을 생성하는 데 유용합니다. 예를 들어, 루프에서 | |
행렬 변환 적용. | 변환을 객체에 적용합니다. 이 기법은 객체 그룹의 위치와 방향을 한꺼번에 변경하려는 경우 유용합니다. 그래픽스 객체를 transform 객체 아래에 있는 자식으로 그룹화합니다. | |
애니메이션 GIF 파일 생성. | 루프에서 Figure를 업데이트하고 | |
동영상을 생성합니다. | 루프에서 Figure를 업데이트하고 |
루프에서 데이터를 업데이트하여 애니메이션 만들기
선을 따라 움직이는 마커의 애니메이션을 만듭니다.
사인파를 플로팅합니다. 그런 다음 마커를 플로팅하고 이를 변수
mkr
로 저장합니다. 그러면 나중에 마커의 속성에 액세스할 수 있습니다.xlim
,ylim
,zlim
함수를 사용하여 각 좌표축의 제한을 설정합니다. 제한을 설정하면 자동 축 제한 계산이 비활성화되는데, 그 대신 화면 깜박임이 생길 수 있고 애니메이션 성능에 영향이 있을 수 있습니다.마커 좌표를 업데이트하는
for
루프를 생성합니다. 각 반복에서Scatter
객체(mkr
)의XData
및YData
속성을 변경하여 선을 따라 마커를 이동시킵니다.각 루프 반복의 끝에서
drawnow
명령을 호출하여 Figure 표시를 업데이트합니다.
x = linspace(0,10,500); y = sin(x); % Plot a line and 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
행렬 변환을 사용하여 애니메이션 만들기
효율적인 플롯 애니메이션 방법은 모든 점들을 반복하는 대신 하나 이상의 객체에 변환 행렬(transformation matrix)을 적용하는 것입니다. 사용할 수 있는 변환에는 평행 이동, 회전 및 스케일링 등이 있습니다. 사용자가 자체적인 변환 행렬을 정의할 수도 있습니다.
임의의 축에서 2π라디안만큼 회전하는 구의 애니메이션을 만듭니다.
sphere
함수를 사용하여 구의 좌표를 생성합니다.이름이
grp
인Transform
객체를 만듭니다. 그런 다음surf
함수를 호출하고 부모 객체를grp
로 지정하여 구를Surface
객체로 플로팅합니다.좌표축 그리드 선을 표시하고 3차원 보기에 플롯 상자를 표시합니다.
0~2π 사이에서 간격이 균일한 각도 값 300개를 순차적으로 실행하는
for
루프를 만들고 매 반복(회차)마다 작은 각도만큼 구를 회전시킵니다.makehgtform
함수를 사용하여 각 작은 회전 각도에 대한 변환 행렬을 생성합니다. 그런 다음grp
의Matrix
속성을 설정하여 회전을 수행합니다.각 루프 반복의 끝에서
drawnow
명령을 호출하여 Figure 표시를 업데이트합니다.
% Create the coordinates of a sphere figure 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
애니메이션 GIF 파일 생성하기
포물선을 따라 움직이는 마커의 애니메이션 GIF 파일을 만듭니다.
하나의 마커로 포물선을 플로팅합니다.
매 반복 시 마커의 위치를 변경하는
for
루프를 만듭니다.각 루프 반복의 끝에서
exportgraphics
함수를 사용하여 Figure를 애니메이션 GIF 파일의 프레임으로 캡처합니다.Append=true
이름-값 인수를 지정하는 경우exportgraphics
는 현재 프레임을 캡처하여 지정된 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; exportgraphics(gca,"parabola.gif",Append=true) end
동영상을 만들고 재생하기
루프에서 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)
참고 항목
함수
hgtransform
|makehgtform
|exportgraphics
|getframe
|movie
|writeVideo