1.创建流粒子动画
1.1随时间变化的抛射体路径
此示例演示如何使用三维箭头图将抛射体路径显示为时间函数。
使用速度和加速度常量 vz
与 a
显示如下抛射体路径。计算时间从 0 到 1 的变化过程中高度 z
的值。
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;
计算速度向量的分量并使用三维箭头图显示该向量。将坐标区的视点改为 [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])
1.2粒子动画可以显示哪些信息
流粒子动画可用于可视化向量场的流向和速度。“粒子”(由线标记表示)用于跟踪沿特定流线的流动。动画中每个粒子的速度与流线上任何给定点处的向量场的模成正比。
1.3指定数据范围的起点
本示例通过指定适当的起点来确定要绘制的体区域。在本例中,流线图的起点为 x = 100,y 方向上的范围为 20 到 50,并位于 z = 5 的平面上,这并不是完整的体范围。
load wind
[sx sy sz] = meshgrid(100,20:2:50,5);
1.4创建流线以指示粒子路径
本示例使用流线(stream3、streamline)跟踪动画粒子的路径,为动画添加视觉环境。
verts = stream3(x,y,z,u,v,w,sx,sy,sz);
sl = streamline(verts);
1.5定义视图
虽然所有流线都开始于 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')
1.6计算流粒子顶点
确定流线上要绘制粒子的顶点。interpstreamspeed 函数基于流线顶点和向量数据的速度返回此数据。本示例将速度缩放 0.05,以增加插值顶点的数量。
将坐标区的 SortMethod
属性设置为 childorder
,使动画运行速度更快。
streamparticles
函数设置以下属性:
-
将
Animate
设置为10
,使动画运行 10 次。 -
将
ParticleAlignment
设置为on
,以便同时开始所有粒子跟踪。 -
将
MarkerEdgeColor
设置为none
,以便只绘制圆形标记的面。如果不绘制标记的边,动画通常会运行得更快。 -
将
MarkerFaceColor
设置为red
。 -
将
Marker
设置为o
,以绘制圆形标记。您也可以使用其他线标记。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');
2.利用圆锥图显示向量场
2.1圆锥图可以显示哪些信息
本示例绘制 wind
数据的速度向量圆锥图。生成的圆锥图利用了好几种可视化方法:
-
通过等值面为圆锥图提供视觉环境,并提供为一组圆锥体选择特定数据值的方法。
-
通过光照使等值面的形状清晰可见。
-
通过透视投影、相机定位和视角调整合成最终视图。
2.2创建等值面
在矩形数据空间显示等值面可为圆锥图提供视觉环境。创建等值面需要多个步骤:
-
计算代表风速的向量场的模。
-
使用 isosurface 和 patch 绘制等值面,以说明矩形空间中哪些位置的风速等于特定值。等值面内的区域风速较高,等值面外的区域风速较低。
-
使用 isonormals 根据体数据计算等值面的顶点法线,而不是根据用来渲染等值面的三角形来计算顶点法线。这样的法线通常可以生成更准确的结果。
-
设置等值面的视觉属性,使其为红色并且不绘制边(
FaceColor
、EdgeColor
)。load wind wind_speed = sqrt(u.^2 + v.^2 + w.^2); hiso = patch(isosurface(x,y,z,wind_speed,40)); isonormals(x,y,z,wind_speed,hiso) hiso.FaceColor = 'red'; hiso.EdgeColor = 'none';
2.3为等值面添加等值顶
等值顶与切片平面的相似之处在于它们都显示体的横截面。它们被设计成等值面的端顶。在等值顶上使用插补面颜色将导致数据值映射到当前颜色图中的颜色。要为等值面创建等值顶,请按相同的等值定义它们(isocaps、patch、colormap)。
hcap = patch(isocaps(x,y,z,wind_speed,40),...
'FaceColor','interp',...
'EdgeColor','none');
colormap hsv
2.4创建第一组圆锥体
-
在调用
coneplot
之前,请使用 daspect 设置坐标区的数据纵横比,以便函数确定圆锥体的正确大小。 -
通过计算具有较小等值的另一个等值面来确定放置圆锥体的点(使圆锥体显示在第一个等值面之外),并使用 reducepatch 减少面和顶点的数量(使图中的圆锥体不会过多)。
-
绘制圆锥体,并将面颜色设置为
blue
,将边颜色设置为none
。daspect([1 1 1]); [f,verts] = reducepatch(isosurface(x,y,z,wind_speed,30),0.07); h1 = coneplot(x,y,z,u,v,w,verts(:,1),verts(:,2),verts(:,3),3); h1.FaceColor = 'blue'; h1.EdgeColor = 'none';
5.5创建第二组圆锥体
-
绘制第二组圆锥体,并将面颜色设置为 green,将边颜色设置为 none。
xrange = linspace(min(x(:)),max(x(:)),10); yrange = linspace(min(y(:)),max(y(:)),10); zrange = 3:4:15; [cx,cy,cz] = meshgrid(xrange,yrange,zrange); h2 = coneplot(x,y,z,u,v,w,cx,cy,cz,2); h2.FaceColor = 'green'; h2.EdgeColor = 'none';
2.6定义视图
-
将投影类型设置为透视,以生成更自然的体视图。设置视点并放大,以使场景变大(camproj、camzoom、view)。
axis tight set(gca,'BoxStyle','full','Box','on') camproj perspective camzoom(1.25) view(65,45)
2.7添加光照
添加光源并使用 Gouraud 光照,使等值面具有最平滑的光照效果。提高等值顶上的背景光强度,使等值顶更亮(camlight、lighting、AmbientStrength
)。
camlight(-45,45)
hcap.AmbientStrength = 0.6;
lighting gouraud