主要内容

叠加模拟和实际飞行数据

这个例子展示了如何用动画对象(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=航空动画;

设置动画对象属性

此代码设置每秒的帧数。此代码控制在“体形”窗口中显示帧数的速率。

h.FramesPerSecond = 10;

这段代码设置了动画数据的秒数。这个性质和“FramesPerSecond”属性确定模拟的时间步长。此示例中的设置导致时间步长约为0.5s。公式为(1/FramesPerSecond)*时间刻度以及一些额外的项,以达到亚秒精度。

h.TimeScaling = 5;

创建和加载主体

此代码使用createBody对于动画对象,H。此示例将使用这些实体处理并显示模拟和实际飞行轨迹。第一个实体为橙色,表示模拟数据。第二个实体为蓝色,表示实际飞行数据。

idx1=h.createBody(“pa24-250_橙色,ac”,“Ac3d”);idx2 = h.createBody (“pa24 - 250 _blue.ac”,“Ac3d”);

加载飞行轨迹的记录数据

使用前一代码中的实体,该代码在以下文件中提供飞行轨迹的模拟和实际记录数据:

  • simdata文件包含记录的模拟数据。simdata设置为6自由度阵列,这是默认数据格式之一。

  • fltdata文件包含实际的飞行测试数据。在这个例子中,fltdata以自定义格式设置。示例必须创建一个自定义读函数并设置“TimeSeriesSourceType”参数到“自定义”

加载simdata和fltdata文件。

负载simdata负载fltdata

要使用自定义飞行测试数据,此代码设置第二个主体“TimeSeriesReadFcn”.自定义读取功能位于这里:matlabroot/toolbox/aero/astdemos/CustomReadBodyTSData.m

h.Bodies{2}。TimeseriesReadFcn = @CustomReadBodyTSData;

设置主体的timeseries数据。

h.Bodies{1}。TimeSeriesSource = simdata;h.Bodies{2}。TimeSeriesSource = fltdata;h.Bodies{2}。TimeSeriesSourceType =“自定义”;

相机操作

这段代码演示了如何为两个物体操作摄像机。

这个“位置FCN”摄影机对象的属性控制相对于动画中实体的摄影机位置。默认摄影机“位置FCN”沿着一级追踪车辆的路径行驶。因此,相机需要几步才能将自身正确定位在追逐平面位置。默认值“位置FCN”坐落在这里:matlabroot/toolbox/aero/aero/doFirstOrderChaseCameraDynamics.m

设置“位置FCN”

h.Camera.PositionFcn = @doFirstOrderChaseCameraDynamics;

在图中显示身体几何图形

此代码使用显示方法创建动画对象的图形图形对象。

h、 show();

使用动画对象播放飞行轨迹

此代码使用方法在timeseries数据期间设置实体动画。使用此方法将说明模拟数据和飞行数据之间的细微差异。

h、 play();

该代码还可以使用自定义的、简化的“位置FCN”这是一个基于物体位置的静态位置(即,没有动力学)。简化“位置FCN”坐落在这里:matlabroot /工具箱/航空/ astdemos / staticCameraPosition.m

开创新局面“位置FCN”

h、 Camera.PositionFcn=@staticCameraPosition;

使用new运行动画“位置FCN”

h、 play();

移动身体

这段代码演示了如何将物体移动到起始位置(基于时间序列数据),并根据新的“位置FCN”.这段代码使用updateBodiesupdateCamera

t = 0;h.updateBodies (t);h.updateCamera (t);

重新定位实体

这段代码演示了如何重新定位物体,首先获取物体的当前位置,然后分离物体。

从身体对象获取当前身体位置和旋转。

pos1 = h.Bodies {1} .Position;rot1 = h.Bodies{1}然后;pos2 = h.Bodies {2} .Position;rot2 = h.Bodies{2}然后;

单独的机构使用移动体.这段代码分离并重新定位两个主体。

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

在第一身体中创建透明度

这段代码演示了如何在第一个主体中创建透明性。代码通过改变身体补丁属性来实现“补丁手柄”.(有关MATLAB®补丁的更多信息,请参阅补丁对象简介MATLAB文档中的第节。)

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

看到opengl在MATLAB中获取更多关于OpenGL的信息。

要创建透明度,代码将获取第一个实体的修补程序句柄。

patchHandles2=h.Bodies{1}.PatchHandles;

设置所需的面和边的alpha值。

desiredFaceTransparency = 3;desiredEdgeTransparency = 1;

此代码获取当前面和边的alpha数据,并将所有值更改为所需的alpha值。在图中,注意第一个主体现在是透明的。

对于if (patchHandles2(k) = 1, tempFaceAlpha = get(patchHandles2(k)),“FaceVertexAlphaData”); tempEdgeAlpha=get(patchHandles2(k),“EdgeAlpha”); 套件(无插接手柄2(k),...“FaceVertexAlphaData”repmat (desiredFaceTransparency大小(tempFaceAlpha)));集(patchHandles2 (k),...“EdgeAlpha”,repmat(理想的透明度,大小(tempEdgeAlpha));终止

更改第二个实体的颜色

此代码说明了如何更改第二个实体的实体颜色。此代码通过以下方式更改实体修补程序属性来完成此操作:“补丁手柄”

patchHandles3 = h.Bodies {2} .PatchHandles;

此代码设置所需的面片颜色(红色)。

desiredColor = [1 0 0];

代码现在可以获取当前的面部颜色数据,并将所有值更改为所需的颜色值。请注意代码中的以下几点:

  • 这个如果情况使窗户无法上色。

  • name属性存储在body的几何数据中(h.Bodies{2}. geometry . facevertexcolordata (k).name)。

  • 代码只改变索引patchHandles3与非窗口对应的身体几何数据。

name属性可能并不总是可用于确定车辆的各个部分。在这些情况下,您需要使用选择性着色的替代方法。

对于if (patchHandles3(k) = 1, tempFaceColor = get(patchHandles3(k)),“FaceVertexCData”); tempName=h.Bodies{2}.Geometry.FaceVertexColorData(k).name;如果~包含(tempName“挡风玻璃”) &&...~包含(tempName前窗的) &&...~包含(tempName‘后窗’)套件(无插接手柄3(k),...“FaceVertexCData”repmat (desiredColor[大小(tempFaceColor, 1), 1]));终止终止

关闭第二个机身上的起落架

下面的代码关闭第二具尸体的起落架。为了做到这一点,它关闭了与起落架相关的所有车辆部件的能见度。注意patchHandles3矢量是根据几何体数据中的name属性确定的。其他数据源可能没有此信息。在这些情况下,您需要知道哪些索引对应于几何体的特定部分。

对于k=[1:8,11:14,52:57]集,“可见”,“关闭”)终止

关闭并删除动画对象

关闭并删除

h.delete ();
% #好< * REPMAT >