Main Content

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

시간에 따른 발사체 경로

이 예제에서는 3차원 퀴버 플롯을 사용하여 시간 함수로 발사체 경로를 표시하는 방법을 보여줍니다.

속도와 가속도를 나타내는 상수 vza를 사용하여 발사체의 그다음 경로를 표시합니다. 0에서 1 사이 시간에서의 높이 z를 계산합니다.

z(t)=vzt+at22

vz = 10; % velocity constant
a = -32; % acceleration constant         
t = 0:.1:1;
z = vz*t + 1/2*a*t.^2;

x 방향과 y 방향의 위치를 계산합니다.

vx = 2;
x = vx*t;

vy = 3;
y = vy*t;

속도 벡터의 성분을 계산하고 3차원 퀴버 플롯을 사용하여 벡터를 표시합니다. 좌표축의 시점을 [70,18]로 변경합니다.

u = gradient(x);
v = gradient(y);
w = gradient(z);
scale = 0;

figure
quiver3(x,y,z,u,v,w,scale)
view([70,18])

Figure contains an axes object. The axes object contains an object of type quiver.

입자 애니메이션으로 표시할 수 있는 내용

흐름 입자 애니메이션은 벡터장의 흐름 방향과 속도를 시각화하는 데 유용합니다. “입자”(임의의 선 마커로 나타냄)는 특정 흐름선을 따라 흐름을 추적합니다. 애니메이션에서 각 입자의 속도는 흐름선을 따라 임의의 주어진 점에서 벡터장의 크기에 비례합니다.

1. 데이터 범위의 시작점 지정하기

이 예제에서는 적합한 시작점을 지정하여 플로팅할 볼륨의 영역을 결정합니다. 이 경우, 흐름 플롯은 x = 100에서 시작하고 z = 5 평면에서 y의 범위는 20~50인데, 이는 전체 볼륨 범위가 아닙니다.

load wind
[sx sy sz] = meshgrid(100,20:2:50,5);

2. 흐름선을 생성하여 입자 경로 나타내기

이 예제에서는 흐름선(stream3, streamline)을 사용하여 애니메이션된 입자의 경로를 추적하여 애니메이션의 시각적 맥락을 더합니다.

verts = stream3(x,y,z,u,v,w,sx,sy,sz);
sl = streamline(verts);

3. 보기 정의하기

모든 흐름선은 z = 5 평면에서 시작하지만, 일부 흐름선의 값은 이보다 더 낮은 값으로 나선형으로 떨어집니다. 다음과 같이 설정하면 애니메이션을 명확하게 표시할 수 있습니다.

  • 선택된 시점(view)은 대부분의 흐름선을 포함한 평면과 나선을 둘 다 보여줍니다.

  • 데이터 종횡비(daspect)를 [2 2 0.125]로 선택하면 z 방향의 해상도가 더욱 높아져 나선에서 흐름 입자를 더 쉽게 볼 수 있습니다.

  • 데이터 제한과 일치하도록 좌표축 제한을 설정하고(axis) 축 상자를 그립니다(box).

    view(-10.5,18)
    daspect([2 2 0.125])
    axis tight;
    set(gca,'BoxStyle','full','Box','on')
    

4. 흐름 입자 꼭짓점 계산하기

입자가 그려질 흐름선상의 꼭짓점을 결정합니다. interpstreamspeed 함수는 흐름선 꼭짓점과 벡터 데이터의 속도를 기준으로 이 데이터를 반환합니다. 이 예제에서는 속도를 0.05 간격으로 스케일링하여 보간된 꼭짓점의 개수를 늘립니다.

애니메이션이 더 빠르게 실행되도록 좌표축의 SortMethod 속성을 childorder로 설정합니다.

streamparticles 함수는 다음 속성을 설정합니다.

  • Animate10으로 설정하여 애니메이션을 10회 실행합니다.

  • ParticleAlignmenton으로 설정하여 모든 입자 추적을 함께 시작합니다.

  • MarkerEdgeColornone으로 설정하여 원형 마커의 면만 그립니다. 마커 가장자리를 그리지 않으면 애니메이션이 보통 더 빠르게 실행됩니다.

  • MarkerFaceColorred로 설정합니다.

  • Markero로 설정하여 원형 마커를 그립니다. 다른 선 마커도 사용할 수 있습니다.

    iverts = interpstreamspeed(x,y,z,u,v,w,verts,0.01);
    set(gca,'SortMethod','childorder');
    streamparticles(iverts,15,...
    	'Animate',10,...
    	'ParticleAlignment','on',...
    	'MarkerEdgeColor','none',...
    	'MarkerFaceColor','red',...
    	'Marker','o');