主要内容

模拟和实际飞行数据叠加

这个例子展示了如何用动画对象(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 /工具箱/航空/ astdemos / 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.Bodies{1}.Position;rot1 = h.Bodies{1}.Rotation;pos2 = h.Bodies{2}.Position;rot2 = h.Bodies{2}.Rotation;

使用moveBody.此代码分离并重新定位两个主体。

h.moveBody(1,pos1 + [0 0 -3],rot1);h.moveBody(2,pos1 + [0 0 0],rot2);

{“字符串”:“”,“它”:[],“乳胶”:[]}

在第一机构中创造透明度

在第一个主体中创建透明度。代码通过通过更改主体补丁的属性来实现这一点“PatchHandles”.(关于MATLAB®中的补丁的更多信息,请参见补丁对象简介)。

注意:在一些使用软件OpenGL®渲染的平台上,透明度可能会导致动画速度下降。

看到opengl有关OpenGL在MATLAB中的更多信息的文档。

要创建透明度,代码获取第一个主体的补丁句柄。

{1}.PatchHandles = h.Bodies;

设置所需的正面和边缘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 >