模拟和实际飞行数据叠加
这个例子展示了如何用动画对象(air . animation)可视化模拟和实际的飞行轨迹,同时展示了一些动画对象的功能。在本例中,您可以使用Aero。动画object to create and configure an animation object, then use that object to create, visualize, and manipulate bodies for the flight trajectories.
创建动画对象
类的实例航空。动画
对象。
h = air . animation;
设置动画对象属性
设置每秒帧数。这将控制在图形窗口中显示帧的速率。
h.FramesPerSecond = 10;
设置每秒动画数据的秒数。这个属性和“FramesPerSecond”
属性确定模拟的时间步长。本例中的设置导致时间步长约为0.5s。方程是(1 / FramesPerSecond) *时间表
还有一些额外的术语来处理亚秒精度。
h.TimeScaling = 5;
创建和加载主体
使用createBody
对于动画对象,h
.本例使用这些物体来处理和显示模拟和实际的飞行轨迹。第一个主体是橙色的,表示模拟数据。第二个主体是蓝色的,表示实际的飞行数据。
idx1 = h.createBody(“pa24 - 250 _orange.ac”,“Ac3d”);idx2 = h.createBody(“pa24 - 250 _blue.ac”,“Ac3d”);
装载飞行轨迹的记录数据
使用前面代码中的主体,这段代码在以下文件中提供了飞行轨迹的模拟和实际记录数据:
simdata文件包含记录的模拟数据。
simdata
设置为6DoF数组,这是默认的数据格式之一。fltdata文件包含实际飞行测试数据。在这个例子中,
fltdata
以自定义格式设置。示例必须创建自定义读取函数并设置“TimeSeriesSourceType”
参数“自定义”
.
加载simdata和fltdata文件。
负载(“simdata.mat”,“simdata”)负载(“fltdata.mat”,“fltdata”)
为了使用自定义飞行测试数据,这段代码设置了第二个主体“TimeSeriesReadFcn”
.自定义读取函数位于这里:matlabroot /工具箱/航空/动画/ CustomReadBodyTSData.m
h.Bodies{2}。TimeSeriesReadFcn = @CustomReadBodyTSData;
设置身体的时间序列数据。
h.Bodies{1}。TimeSeriesSource = simdata;h.Bodies{2}。TimeSeriesSource = fltdata;h.Bodies{2}。TimeSeriesSourceType =“自定义”;
相机操作
这段代码说明了如何为两个主体操作摄像机。
的“PositionFcn”
属性控制摄像机相对于动画中的主体的位置。默认摄像头“PositionFcn”
遵循一阶追踪车辆的路径。因此,相机需要几个步骤来正确定位自己在追逐平面的位置。默认的“PositionFcn”
位于这里:matlabroot /工具箱/航空/动画/ doFirstOrderChaseCameraDynamics.m
集“PositionFcn”
.
h.Camera.PositionFcn = @doFirstOrderChaseCameraDynamics;
在图中显示身体几何图形
使用显示
方法为动画对象创建图形图形对象。
h.show ();
使用动画对象回放飞行轨迹
使用玩
方法在时间序列数据的持续时间内对物体进行动画。利用该方法可以看出模拟数据与飞行数据之间的细微差异。
h.play ();h.updateCamera (5);
等待
等待动画完成后再编辑对象属性。
h.wait ();
代码也可以使用自定义、简化“PositionFcn”
这是基于物体位置的静态位置(即没有动态)。简化“PositionFcn”
位于这里:matlabroot /工具箱/航空/动画/ staticCameraPosition.m
设置新的“PositionFcn”
.
h.Camera.PositionFcn = @ staticcamerposition;
使用new运行动画“PositionFcn”
.
h.play ();
等待
等待动画完成后再编辑对象属性。
h.wait ();
移动身体
移动主体到起始位置(基于时间序列数据),并根据新的更新相机位置“PositionFcn”
.此代码使用updateBodies
而且updateCamera
.
T = 0;h.updateBodies (t);h.updateCamera (t);
重新定位机构
通过首先获得当前的身体位置,然后分离身体来重新定位身体。
从身体对象中获取当前身体位置和旋转。
pos1 = h.身体{1}.位置;rot1 = h.Bodies{1}.旋转;pos2 = h.身体{2}.位置;rot2 = h.Bodies{2}.旋转;
使用moveBody
.这段代码分离并重新定位两个主体。
h.moveBody(1,pos1 + [0 0 -3],rot1);h.moveBody(2,pos1 + [0 0 0],rot2);
在第一个主体中创建透明度
在第一个主体中创建透明度。代码通过改变主体补丁属性来做到这一点“PatchHandles”
.(有关MATLAB®中的补丁的更多信息,请参阅补丁对象简介部分的MATLAB文档。)
注意:在一些使用软件OpenGL®渲染的平台上,透明度可能会导致动画速度下降。
看到opengl
有关MATLAB中OpenGL的更多信息的文档。
为了创建透明度,代码获取第一个主体的补丁句柄。
patchHandles2 = h.Bodies{1}.PatchHandles;
设置所需的正面和边缘alpha值。
desiredFaceTransparency = .3;desiredEdgeTransparency = 1;
获取当前的面和边缘alpha数据,并将所有值更改为所需的alpha值。在图中,请注意第一个主体现在具有透明度。
为tempFaceAlpha = get(patchHandles2(k),“FaceVertexAlphaData”);tempEdgeAlpha = get(patchHandles2(k),“EdgeAlpha”);集(patchHandles2 (k),...“FaceVertexAlphaData”repmat (desiredFaceTransparency大小(tempFaceAlpha)));集(patchHandles2 (k),...“EdgeAlpha”repmat (desiredEdgeTransparency大小(tempEdgeAlpha)));结束
改变第二个身体的颜色
改变第二个主体的主体颜色。代码通过改变主体补丁属性来做到这一点“PatchHandles”
.
patchHandles3 = h.Bodies{2}.PatchHandles;
设置所需的补丁颜色(红色)。
desiredColor = [1 0 0];
代码现在可以获得当前的面部颜色数据,并将所有值更改为所需的颜色值。在代码中注意以下几点:
的
如果
条件使窗口不被着色。name属性存储在主体的几何数据中
(h.Bodies {2} .Geometry.FaceVertexColorData (k) . name)
.代码只更改索引
patchHandles3
与体几何数据中的非窗口对应项。
name属性可能并不总是可用来确定车辆的各个部分。在这些情况下,使用选择性着色的替代方法。
为k = 1:size(patchHandles3,1) tempFaceColor = get(patchHandles3(k),“FaceVertexCData”);tempName = h.Bodies{2}.Geometry.FaceVertexColorData(k).name;如果~包含(tempName挡风玻璃的) & &...~包含(tempName前窗的) & &...~包含(tempName“后窗”)设置(patchHandles3 (k),...“FaceVertexCData”repmat (desiredColor[大小(tempFaceColor, 1), 1]));结束结束
关闭第二主体的起落架
关闭第二机体的起落架。为了做到这一点,代码关闭了与起落架相关的所有车辆部件的可见性。的索引patchHandles3
向量是从几何数据中的name属性确定的。其他数据源可能没有此信息。在这些情况下,您将需要知道哪些指标对应于几何的特定部分。
为k = [1:8,11:14,52:57] set(patchHandles3(k),“可见”,“关闭”)结束
关闭并删除动画对象
关闭并删除。
h.delete ();
% #好< * REPMAT >
另请参阅
航空。动画
|updateBodies
|updateCamera