メインコンテンツ

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

仮想現実アニメーションオブジェクトで航空機の離陸を可視化する

この例では、仮想現実アニメーション オブジェクトを使用して、航空機の離陸とヘリコプターの追跡を可視化する方法を示します。この例では、Aero.VirtualRealityAnimation オブジェクトを使用して、asttkoff.wrl ファイルに基づいて仮想現実アニメーションを設定できます。このシーンは、航空機の離陸をシミュレートします。この例では、シミュレーションに追跡機体と、新しい機体に関連付けられた追跡視点を追加します。

注: この例はMATLAB Onlineではサポートされていません。

アニメーションオブジェクトを作成する

このコードは、Aero.VirtualRealityAnimation オブジェクトのインスタンスを作成します。

h = Aero.VirtualRealityAnimation;

アニメーションオブジェクトのプロパティを設定する

このコードは、1 秒あたりのフレーム数と、1 秒あたりのアニメーション データの秒数を設定します。'FramesPerSecond' は、図ウィンドウに表示されるフレームの速度を制御します。'TimeScaling' は、1 秒あたりのアニメーション データの秒数です。

'TimeScaling' および 'FramesPerSecond' プロパティは、シミュレーションの時間ステップを決定します。この例の設定では、時間ステップは約 0.5 秒になります。方程式は次のようになります。

(1/FramesPerSecond)*TimeScaling + 1 秒未満の精度を処理するための追加の項。

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

このコードは、仮想現実アニメーションで使用される .wrl ファイルを設定します。

h.VRWorldFilename = "asttkoff.wrl";

バーチャルリアリティアニメーションオブジェクトの初期化

initialize メソッドは、アニメーション オブジェクトの 'VRWorldFilename' フィールドに記述されたアニメーション ワールドを読み込みます。ワールドを解析するときに、DEF 名を持つ既存のノードに対してノード オブジェクトが作成されます。initialize メソッドは Simulink 3D Animation ビューアも開きます。

h.initialize();

Figure VR Plane Take-Off contains objects of type hgjavacomponent, uimenu, uipanel, uitoolbar.

追加のノード情報を設定する

このコードは、シミュレーションの時系列データを設定します。takeoffData.mat には、ログに記録されたシミュレートされたデータが含まれます。takeoffData は、デフォルトのデータ形式の 1 つである 'StructureWithTime' として設定されます。

load takeoffData
[~, idxPlane] = find(strcmp('Plane', h.nodeInfo));
h.Nodes{idxPlane}.TimeseriesSource = takeoffData;
h.Nodes{idxPlane}.TimeseriesSourceType = 'StructureWithTime';

座標変換関数の設定

仮想現実アニメーション オブジェクトは、航空宇宙ボディ座標での位置と回転を想定しています。入力データが異なる場合は、仮想世界内の周囲のオブジェクトと位置および回転データを正しく合わせるために、座標変換関数を作成する必要があります。このコードは、仮想現実アニメーションの座標変換関数を設定します。

この特定のケースでは、入力変換座標が [x1,y1,z1] の場合、次のように調整する必要があります: [X,Y,Z] = -[y1,x1,z1]。

カスタム変換関数は、ファイル vranimCustomTransform.m で確認できます。

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

追跡ヘリコプターを追加

このコードは、アニメーション オブジェクトに追跡ヘリコプターを追加する方法を示しています。

nodeInfo メソッドを使用すると、現在仮想現実アニメーション オブジェクト内にあるすべてのノードを表示できます。出力引数なしで呼び出されると、このメソッドはノード情報をコマンド ウィンドウに出力します。出力引数を指定すると、メソッドはその引数にノード情報を設定します。

h.nodeInfo;
Node Information
1	Camera1
2	Plane
3	_V2
4	Block
5	Terminal
6	_v3
7	Lighthouse
8	_v1

このコードは、仮想現実フィギュアのカメラ角度を動かして航空機を視認できるようにします。

set(h.VRFigure,'CameraDirection',[0.45 0 -1]);

オブジェクトに別のノードを追加するには、addNode メソッドを使用します。デフォルトでは、ノードまたはルートを追加または削除するたび、または saveas メソッドを呼び出すたびに、Aerospace Toolbox は現在の .wrl ファイルの場所に関するメッセージを表示します。このメッセージを無効にするには、VirtualRealityAnimation オブジェクトの 'ShowSaveWarning' プロパティを設定します。

h.ShowSaveWarning = 0;
h.addNode('Lynx',fullfile(pwd,"chaseHelicopter.wrl"));

Figure VR Plane Take-Off contains objects of type hgjavacomponent, uimenu, uipanel, uitoolbar.

nodeInfo をもう一度呼び出すと、新しく追加された Node オブジェクトが表示されます。

h.nodeInfo
Node Information
1	Camera1
2	Plane
3	_V2
4	Block
5	Terminal
6	_v3
7	Lighthouse
8	_v1
9	Lynx
10	Lynx_Inline

新しく追加されたヘリコプターを滑走路に着陸するように調整します。

[~, idxLynx] = find(strcmp('Lynx',h.nodeInfo));
h.Nodes{idxLynx}.VRNode.translation = [0 1.5 0];

このコードは追跡ヘリコプターのデータ プロパティを設定します。'TimeseriesSourceType' はデフォルトの 'Array6DoF' なので、追加のプロパティ変更は必要ありません。このノードには、前のノードと同じ座標変換関数 (vranimCustomTransform) が使用されます。前回のnodeInfoの呼び出しではノードインデックス(2)が返されました。

load chaseData
h.Nodes{idxLynx}.TimeseriesSource = chaseData;
h.Nodes{idxLynx}.CoordTransformFcn = @vranimCustomTransform;

新しい視点を作成

このコードは、addViewpoint メソッドを使用して、「chaseView」という名前の新しいビューポイントを作成します。新しい視点は、仮想現実ウィンドウの視点プルダウン メニューに「ヘリコプターからのビュー」として表示されます。nodeInfo をもう一度呼び出すと、新しく追加されたノード オブジェクトが表示されます。ノードは追跡ヘリコプターの子として作成されます。

h.addViewpoint(h.Nodes{idxLynx}.VRNode,'children','chaseView','View From Helicopter');

Figure VR Plane Take-Off contains objects of type hgjavacomponent, uimenu, uipanel, uitoolbar.

アニメーションを再生

play メソッドは、指定された時系列データのシミュレーションを実行します。

h.play();

待機

オブジェクトを変更する前に、アニメーションの再生が停止するまで待ちます。

h.wait();

ヘリコプターからのアニメーションを再生

このコードは、視点のノード オブジェクトに関連付けられた vrnode オブジェクトを介して視点の方向を設定します。この場合、視点が変わり、ヘリコプターの左側から飛行機を見るようになります。

[~, idxChaseView] = find(strcmp('chaseView',h.nodeInfo));
h.Nodes{idxChaseView}.VRNode.orientation = [0 1 0 convang(200,'deg','rad')];  
set(h.VRFigure,'Viewpoint','View From Helicopter');

Figure VR Plane Take-Off contains objects of type hgjavacomponent, uimenu, uipanel, uitoolbar.

ルートを追加

このコードは、addRoute メソッドを呼び出して、平面の位置を Camera1 ノードに接続するための ROUTE コマンドを追加します。これにより、「Ride on the Plane」の視点が意図したとおりに機能するようになります。

h.addRoute('Plane','translation','Camera1','translation');

Figure VR Plane Take-Off contains objects of type hgjavacomponent, uimenu, uipanel, uitoolbar.

このコードはアニメーションを再生します。

h.play();
h.wait();

別のボディを追加

このコードはシーンに別のヘリコプターを追加します。また、別の視点に変更して、シーン内の三体を一度に表示することもできます。

set(h.VRFigure,'Viewpoint','See Whole Trajectory');
h.addNode('Lynx1',"chaseHelicopter.wrl");

Figure VR Plane Take-Off contains objects of type hgjavacomponent, uimenu, uipanel, uitoolbar.

h.nodeInfo
Node Information
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

新しく追加されたヘリコプターを滑走路の上に配置するように調整します。

[~, idxLynx1] = find(strcmp('Lynx1',h.nodeInfo));
h.Nodes{idxLynx1}.VRNode.translation = [0 1.3 0];

ボディを削除

このコードは removeNode メソッドを使用して 2 番目のヘリコプターを削除します。removeNode は、ノード名またはノード インデックス (nodeInfo から取得) のいずれかを取得します。関連するインライン ノードも削除されます。

h.removeNode('Lynx1');

Figure VR Plane Take-Off contains objects of type hgjavacomponent, uimenu, uipanel, uitoolbar.

h.nodeInfo
Node Information
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();

Figure VR Plane Take-Off contains objects of type hgjavacomponent, uimenu, uipanel, uitoolbar.

ワールドを閉じて削除

閉じるにはdelete

h.delete();

参考

| |

トピック