这个例子展示了如何使用动画对象(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 = Aero.Animation;
这段代码设置每秒帧数。它控制帧在图形窗口中显示的速率。
h.FramesPerSecond = 10;
这段代码设置动画数据每秒的时间缩放。这个属性和“FramesPerSecond”
性能决定了仿真的时间步长。本例中的设置导致的时间步长约为0.5s。公式是(1/FramesPerSecond)*TimeScaling以及一些额外的术语来处理亚秒级精度。
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负载fltdata
要使用自定义飞行测试数据,此代码设置第二主体“TimeSeriesReadFcn”
。自定义的read函数位于这里:matlabroot /工具箱/航空/ astdemos / 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 ();
还可以使用自定义的、简化的代码“PositionFcn”
这是一个基于物体位置的静态位置(也就是说,没有动态)。简化“PositionFcn”
坐落在这里:matlabroot /工具箱/航空/ astdemos / staticCameraPosition.m
设置新的“PositionFcn”
。
h.Camera.PositionFcn = @staticCameraPosition;
用new运行动画“PositionFcn”
。
h.play ();
这段代码演示了如何将身体移动到起始位置(基于时间序列数据),并根据新“PositionFcn”
。这段代码使用updateBodies
和updateCamera
。
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}然后;
单独的机构使用moveBody
。这段代码分离并重新定位了两个主体。
h.moveBody(1,pos1 + [0 0 -3],rot1);h.moveBody(2,pos1 + [0 0 0],rot2);
这段代码演示了如何在第一个主体中创建透明度。代码通过更改body patch属性来实现这一点“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 =得到(patchHandles2 (k),“EdgeAlpha”);集(patchHandles2 (k),…“FaceVertexAlphaData”repmat (desiredFaceTransparency大小(tempFaceAlpha)));集(patchHandles2 (k),…“EdgeAlpha”repmat (desiredEdgeTransparency大小(tempEdgeAlpha)));结束
这段代码演示了如何更改第二个主体的主体颜色。代码通过更改body patch属性来实现这一点“PatchHandles”
。
patchHandles3 = h.Bodies {2} .PatchHandles;
此代码设置所需的补丁颜色(红色)。
desiredColor = [1 0 0];
该代码现在可以获得当前的面部颜色数据,并将所有值更改为所需的颜色值。注意代码的以下几点:
的如果
条件保持窗口不被着色。
name属性存储在主体的几何数据中(h.Bodies{2}. geometry . facevertexcolordata (k).name)。
代码只改变索引patchHandles3
与非窗口对应的体几何数据。
name属性可能并不总是可用来确定车辆的各个部分。在这种情况下,你需要使用另一种方法来选择性着色。
为tempFaceColor = get(patchHandles3(k), 1);“FaceVertexCData”);tempName = h.Bodies {2} .Geometry.FaceVertexColorData (k) . name;如果~包含(tempName挡风玻璃的) & &…~包含(tempName前窗的) & &…~包含(tempName“后窗”)设置(patchHandles3 (k),…“FaceVertexCData”repmat (desiredColor[大小(tempFaceColor, 1), 1]));结束结束
下面的代码为第二具尸体关闭起落架。为了做到这一点,它关闭与起落架相关的所有车辆部件的可见性。的索引patchHandles3
向量是根据几何数据中的name属性确定的。其他数据源可能没有可用的此信息。在这些情况下,您需要知道哪些索引对应于几何图形的特定部分。
为set(patchHandles3(k), k = [1:8,11:14,52:57])“可见”,“关闭”)结束
关闭和删除
h.delete ();
% #好< * REPMAT >