メインコンテンツ

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

Aero.Animation オブジェクトを使用したシミュレーションと実際の飛行データ

アニメーションオブジェクトの作成と設定

このトピックでは、シミュレーションと実際の飛行データの重ね合わせ の例を紹介します。

これらの関数は、アニメーション オブジェクトを作成し、オブジェクトを構成します。

  1. アニメーションオブジェクトを作成します。

    h = Aero.Animation;
  2. アニメーション オブジェクトを構成して、1 秒あたりのフレーム数 (FramesPerSecond) プロパティを設定します。この設定は、図ウィンドウにフレームが表示される速度を制御します。

    h.FramesPerSecond = 10;
  3. アニメーション オブジェクトを構成して、1 秒あたりのアニメーション データの秒数を時間スケーリング (TimeScaling) プロパティで設定します。

    h.TimeScaling = 5;

    FramesPerSecondTimeScaling プロパティの組み合わせによって、シミュレーションの時間ステップが決まります。これらの設定により、時間ステップは約 0.5 秒になります。

  4. アニメーション オブジェクトのボディを作成して読み込みます。この例では、これらのボディを使用して、シミュレートされた飛行軌道と実際の飛行軌道を操作および表示します。最初のボディはオレンジ色で、シミュレートされたデータを表します。2 番目のボディは青色で、実際の飛行データを表します。

    idx1 = h.createBody('pa24-250_orange.ac','Ac3d');
    idx2 = h.createBody('pa24-250_blue.ac','Ac3d');

    どちらのボディもAC3D形式のファイルです。AC3D は、アニメーション オブジェクトがサポートするいくつかのファイル形式の 1 つです。FlightGear は同じファイル形式を使用します。アニメーション オブジェクトは、AC3D 形式のボディを読み取り、アニメーション オブジェクト内のジオメトリ オブジェクトにパッチとして保存します。

飛行軌跡の記録データの読み込み

この一連のコマンドは、記録された飛行軌跡データを読み込みます。

  • simdata – 6DoF 配列として設定されたシミュレートされた飛行軌道データが含まれています。

  • fltdata – カスタム形式で設定された実際の飛行軌跡データが含まれます。このカスタム形式のデータにアクセスするには、例では本体オブジェクトの TimeSeriesSourceType パラメータを Custom に設定し、カスタム読み取り関数を指定する必要があります。

  1. 飛行軌跡データを読み込みます。

    load simdata
    load fltdata
  2. 2つのボディの時系列データを設定します。

    h.Bodies{1}.TimeSeriesSource = simdata;
    h.Bodies{2}.TimeSeriesSource = fltdata;
  3. 2 番目のボディの時系列をカスタムとして識別します。

    h.Bodies{2}.TimeSeriesSourceType = 'Custom';
  4. 2 番目のボディの fltdata のデータにアクセスするためのカスタム読み取り関数を指定します。この例では、例のフォルダー内にカスタム読み取り関数が提供されています。

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

フィギュアウィンドウにボディジオメトリを表示する

このコマンドは、アニメーション オブジェクトの図オブジェクトを作成します。

h.show();

アニメーションファイルの記録

アニメーション オブジェクトを使用した飛行軌跡の再生の記録を有効にします。

h.VideoRecord = 'on';
h.VideoQuality = 50;
h.VideoCompression = 'Motion JPEG AVI'
h.VideoFilename = 'astMotion_JPEG';

アニメーション シーケンスを保存したい任意の時点でアニメーション記録を有効にします。

メモ

ビデオ圧縮タイプを選択するときは、対応するビューア ソフトウェアが必要になることに注意してください。たとえば、AVI 形式を作成する場合、ファイルを表示するには Windows Media® Player などのビューアが必要です。

アニメーションオブジェクトを使用して飛行軌跡を再生する で説明されているようにアニメーションを再生すると、astMotion_JPEG に再生の記録が含まれます。

アニメーションオブジェクトを使用して飛行軌跡を再生する

このコマンドは、時系列データの継続時間にわたってアニメーション本体を再生します。この再生では、シミュレートされた飛行データと実際の飛行データの違いが表示されます。

h.play();

Figure window showing superimposed bodies.

Video プロパティを使用して録音を保存した場合、ファイルの表示方法については 記録されたアニメーションファイルの表示 を参照してください。

記録されたアニメーションファイルの表示

表示するアニメーション ファイルがない場合は、アニメーションファイルの記録 を参照してください。

  1. 表示するアニメーション ファイルが含まれているフォルダーを開きます。

  2. 任意のアプリケーションでアニメーション ファイルを表示します。

    アニメーション ファイルがまだ実行されていない場合は、アプリケーションから今すぐ開始してください。

  3. 他の h.play コマンドによってアニメーション ファイルのコンテンツが上書きされるのを防ぐには、コンテンツに満足したら録画を無効にします。

    h.VideoRecord = 'off';

カメラの操作

このコマンド シリーズでは、2 つのボディ上のカメラを操作してアニメーションを再表示する方法を示します。カメラ オブジェクトの PositionFcn プロパティは、アニメーション内のボディに対するカメラの位置を制御します。アニメーションオブジェクトを使用して飛行軌跡を再生する では、カメラ オブジェクトは PositionFcn プロパティにデフォルト値を使用します。このコマンド シリーズの例では、ボディの位置に基づいて静的な位置を使用するカスタム PositionFcn 関数を参照します。ダイナミクスは関係ありません。

メモ

カスタム PositionFcn 関数は、例のフォルダーにあります。

  1. カメラ PositionFcn をカスタム関数 staticCameraPosition に設定します。

    h.Camera.PositionFcn = @staticCameraPosition;
  2. アニメーションをもう一度実行します。

    h.play();

体の移動と位置変更

この一連のコマンドは、ボディを移動および再配置する方法を示しています。

  1. 開始時間を0に設定します。

    t = 0;
  2. 時系列データに基づいて、ボディを開始位置に移動します。Aero.Animation オブジェクトの updateBodies メソッドを使用します。

    h.updateBodies(t);
  3. 前のセクションで設定したカスタム PositionFcn 関数を使用してカメラの位置を更新します。Aero.Animation オブジェクトの updateCamera メソッドを使用します。

    h.updateCamera(t);
  4. まず現在のボディの位置を取得し、次にボディを分離して、ボディの位置を変更します。

    1. 両方のボディのオブジェクトから現在のボディの位置と回転を取得します。

      pos1 = h.Bodies{1}.Position;
      rot1 = h.Bodies{1}.Rotation;
      pos2 = h.Bodies{2}.Position;
      rot2 = h.Bodies{2}.Rotation;
    2. ボディを新しい位置に移動して分離し、再配置します。

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

Figure window showing separated bodies.

最初のボディに透明性を生み出す

この一連のコマンドは、ボディに透明部分を作成してアタッチする方法を示しています。アニメーション オブジェクトは、ボディ ジオメトリをパッチとして保存します。この例では、これらのパッチの透明度プロパティを操作します (Patch のプロパティ を参照)。

メモ

透明度を使用すると、ソフトウェア OpenGL® レンダリングを使用するプラットフォームではアニメーションの速度が低下する可能性があります (opengl を参照)。

  1. ボディパッチのプロパティを変更します。最初のボディのパッチ ハンドルを取得するには、Aero.Body PatchHandles プロパティを使用します。

    patchHandles2 = h.Bodies{1}.PatchHandles;

  2. 透明度に必要な面とエッジのアルファ値を設定します。

    desiredFaceTransparency = .3;
    desiredEdgeTransparency = 1;
  3. 現在の面とエッジのアルファ データを取得し、すべての値を必要なアルファ値に変更します。図では、最初のボディが透明になっています。

    for k = 1:size(patchHandles2,1)
        tempFaceAlpha = get(patchHandles2(k),'FaceVertexAlphaData');
        tempEdgeAlpha = get(patchHandles2(k),'EdgeAlpha');
    	   set(patchHandles2(k),...
            'FaceVertexAlphaData',repmat(desiredFaceTransparency,size(tempFaceAlpha)));
        set(patchHandles2(k),...
            'EdgeAlpha',repmat(desiredEdgeTransparency,size(tempEdgeAlpha)));
    end

Figure window showing separated bodies where the topmost body has transparency.

2番目のボディの色を変更する

この一連のコマンドは、ボディの色を変更する方法を示しています。アニメーション オブジェクトは、ボディ ジオメトリをパッチとして保存します。この例では、これらのパッチの FaceVertexColorData プロパティを操作します。

  1. ボディパッチのプロパティを変更します。最初のボディのパッチ ハンドルを取得するには、Aero.Body PatchHandles プロパティを使用します。

    patchHandles3 = h.Bodies{2}.PatchHandles;

  2. パッチの色を赤に設定します。

    desiredColor = [1 0 0];
  3. 現在の面の色とデータを取得し、新しいパッチの色である赤を面に伝播します。

    • if 条件により、ウィンドウに色を付けることができなくなります。

    • name プロパティはボディ ジオメトリ データ (h.Bodies{2}.Geometry.FaceVertexColorData(k).name) に格納されます。

    • このコードは、patchHandles3 内のインデックスのみを、ボディ ジオメトリ データ内のウィンドウ以外の対応するインデックスに変更します。

      メモ

      name プロパティにアクセスして車両の色付けする部分を決定できない場合は、別の方法を使用して車両を選択的に色付けする必要があります。

    for k = 1:size(patchHandles3,1)
        tempFaceColor = get(patchHandles3(k),'FaceVertexCData');
        tempName = h.Bodies{2}.Geometry.FaceVertexColorData(k).name;
        if isempty(strfind(tempName,'Windshield')) &&...
           isempty(strfind(tempName,'front-windows')) &&...
           isempty(strfind(tempName,'rear-windows'))
        set(patchHandles3(k),...
            'FaceVertexCData',repmat(desiredColor,[size(tempFaceColor,1),1]));
        end
    end

2体目の着陸装置をオフにする

このコマンド シリーズは、着陸装置に関連付けられているすべての車両パーツの表示をオフにすることで、2 番目のボディの着陸装置をオフにする方法を示しています。

メモ

patchHandles3 ベクトルのインデックスは、name プロパティから決定されます。name プロパティにアクセスしてインデックスを決定できない場合は、ジオメトリ部分に対応するインデックスを決定する別の方法を使用する必要があります。

for k = [1:8,11:14,52:57]
    set(patchHandles3(k),'Visible','off')
end

参考

| | |