主要内容

通过虚拟现实动画对象可视化飞机起飞

这个例子展示了如何用虚拟现实动画对象可视化飞机起飞和追逐直升机。在本例中,您可以使用Aero。VirtualRealityAnimationobject to set up a virtual reality animation based on the asttkoff.wrl file. The scene simulates an aircraft takeoff. The example adds a chase vehicle to the simulation and a chase viewpoint associated with the new vehicle.

创建动画对象

的实例航空。VirtualRealityAnimation对象。

h = Aero.VirtualRealityAnimation;

设置动画对象属性

这段代码设置每秒帧数和每秒动画数据的秒数。“FramesPerSecond”控制帧在图形窗口中显示的速率。“时间尺度”为动画数据的秒数/秒时间缩放。

“时间尺度”“FramesPerSecond”特性决定了仿真的时间步长。本例中的设置导致大约0.5s的时间步长。方程是:

(1/FramesPerSecond)* timscaling +额外的术语来处理亚秒精度。

h.FramesPerSecond = 10;h.TimeScaling = 5;

这段代码设置要在虚拟现实动画中使用的.wrl文件。

h.VRWorldFilename = [matlabroot,' /工具箱/航空/ astdemos / asttkoff.wrl”];

改变当前工作目录

VirtualRealityAnimation对象方法使用临时的.wrl文件来跟踪世界的变化。这要求包含原始.wrl文件的目录是可写的。此代码从一个临时目录运行示例,以确保目录权限没有问题。注意,要运行此示例,需要Simulink金宝app®3D Animation™的许可证。

将文件复制到临时目录拷贝文件(h。VRWorldFilename tempdir,“asttkoff.wrl”],“f”);%设置世界文件名为复制的。wrl文件。h.VRWorldFilename = [tempdir,“asttkoff.wrl”];

初始化虚拟现实动画对象

初始化方法加载中描述的动画世界“VRWorldFilename”动画对象的字段。在解析世界时,使用DEF名称为现有节点创建节点对象。的初始化方法也会打开Simulink 3D动画查看器金宝app。

h.initialize ();

设置附加节点信息

此代码设置模拟时间序列数据。takeoffData.mat包含记录的模拟数据。takeoffData被设为“StructureWithTime”,这是一种默认的数据格式。

负载takeoffData[~, idxPlane] = find(strcmp(“平面”h.nodeInfo));h.Nodes {idxPlane}。TimeseriesSource = takeoffData;h.Nodes {idxPlane}。TimeseriesSourceType =“StructureWithTime”

集合坐标变换函数

虚拟现实动画对象期望在航空航天体坐标中的位置和旋转。如果输入数据不同,您必须创建一个坐标转换函数,以便正确地将位置和旋转数据与虚拟世界中的周围对象对齐。这段代码为虚拟现实动画设置坐标转换函数。

在这种特殊情况下,如果输入平移坐标是[x1,y1,z1],则必须按如下方式调整:[X,Y,Z] = -[y1,x1,z1]。自定义变换函数可以在这里看到:matlabroot /工具箱/航空/ astdemos / vranimCustomTransform.m

h.Nodes {idxPlane}。CoordTransformFcn = @vranimCustomTransform;

增加一架追击直升机

这段代码演示了如何将追逐直升机添加到动画对象中。

属性可以查看当前虚拟现实动画对象中的所有节点nodeInfo方法。当不带输出参数调用时,此方法将节点信息打印到命令窗口。通过输出参数,该方法将节点信息设置为该参数。

h.nodeInfo;
节点信息1 Camera1 2平面3 _V2 4 Block 5 Terminal 6 _v3 7 Lighthouse 8 _v1 . txt

这个代码移动虚拟现实人物的摄像机角度来查看飞机。

集(h。VRFigure,“CameraDirection”(0.45 0 1));

使用addNode方法向对象添加另一个节点。默认情况下,每次添加或删除节点或路由时,或调用saveas方法时,Aerospace Toolbox将显示有关当前.wrl文件位置的消息。若要禁用此消息,请设置“ShowSaveWarning”属性在VirtualRealityAnimation对象。

h.ShowSaveWarning = 0;h.addNode (“山猫”(matlabroot' /工具箱/航空/ astdemos / chaseHelicopter.wrl”]);

另一个电话nodeInfo显示新添加的Node对象。

h.nodeInfo
节点信息1 Camera1 2 Plane 3 _V2 4 Block 5 Terminal 6 _v3 7 Lighthouse 8 _v1 9 Lynx 10 Lynx_Inline

调整新增加的直升机停在跑道上。

[~, idxLynx] = find(strcmp(“山猫”h.nodeInfo));h.Nodes {idxLynx} .VRNode。翻译= [0 1.5 0];

这段代码设置了追击直升机的数据属性。的“TimeseriesSourceType”是默认的“Array6DoF”,因此不需要额外的属性更改。相同的坐标变换函数(vranimCustomTransform)用于此节点作为前一个节点。上一个调用nodeInfo返回节点索引(2)。

负载chaseDatah.Nodes {idxLynx}。TimeseriesSource = chaseData;h.Nodes {idxLynx}。CoordTransformFcn = @vranimCustomTransform;

创建新的观点

此代码使用addViewpoint方法创建一个名为“chaseView”的新视图。新的视点将出现在虚拟现实窗口的视点下拉菜单中,命名为“从直升机上观看”。另一个电话nodeInfo显示新添加的节点对象。该节点被创建为追逐直升机的子节点。

h.addViewpoint (h.Nodes {idxLynx} .VRNode,“孩子”“chaseView”从直升机的);

播放动画

方法对指定的时间序列数据运行模拟。

h.play ();

从直升机上播放动画

这段代码通过与视点的节点对象相关联的vrnode对象来设置视点的方向。在这种情况下,它将改变视点,在飞机上看直升机的左侧。

[~, idxChaseView] = find(strcmp(“chaseView”h.nodeInfo));h.Nodes {idxChaseView} .VRNode。方位= [0 1 0 convang(200,“度”rad的));集(h。VRFigure,“观点”从直升机的);

添加路由

这段代码调用addRoute方法中添加ROUTE命令,将平面位置连接到Camera1节点。这将允许“在飞机上飞行”视点按预期运行。

h.addRoute (“平面”“翻译”“Camera1”“翻译”);

从直升机的角度看这一场景

这段代码播放动画。

h.play ();

添加另一个身体

这段代码给现场增加了一架直升机。它还改变了另一个视角,可以同时看到现场的三具尸体。

集(h。VRFigure,“观点”“看到整个轨迹”);h.addNode (“Lynx1”(matlabroot' /工具箱/航空/ astdemos / chaseHelicopter.wrl”]);h.nodeInfo
节点信息1 Camera1 2 Plane 3 _V2 4 Block 5 Terminal 6 _v3 7 Lighthouse 8 _v1 9 Lynx 10 Lynx_Inline 11 chaseView 12 Lynx1 13 Lynx1_Inline . linx

调整新增加的直升机位于跑道上方。

[~, idxLynx1] = find(strcmp(“Lynx1”h.nodeInfo));h.Nodes {idxLynx1} .VRNode。翻译= [0 1.3 0];

去除身体

此代码使用removeNode移走第二架直升机。removeNode接受节点名或节点索引(从nodeInfo).关联的内联节点也被删除了。

h.removeNode (“Lynx1”);h.nodeInfo
节点信息1 Camera1 2 Plane 3 _V2 4 Block 5 Terminal 6 _v3 7 Lighthouse 8 _v1 9 Lynx 10 Lynx_Inline 11 chaseView

回归原始世界

原始文件名存储在“VRWorldOldFilename”动画对象的属性。把原世界带大,定天下“VRWorldFilename”更改为原始名称并重新初始化它。

h.VRWorldFilename = h.VRWorldOldFilename {1};h.initialize ();

关闭并删除世界

关闭,删除

h.delete ();