メインコンテンツまでスキップ

機体 物理挙動 設定

警告

この節を始める前に、(機体 3Dモデル・同期設定)を必ず終わらせてください。
もしくは、FDMi - Exampleパッケージ中に含まれるサンプル例を開いて確認して下さい。

注記

この章で説明している内容の根底は、航空力学の知識を要するものです。
(FDMiは物理挙動になるべく忠実にすることで、”パラメータ調節”の簡素化を目指しています。その代償として物理的に正しく設定しないとうまく飛びません。)
現時点の本項では「設定したけど飛ばない!」「チューニングの仕方がわからない!」への対処法は記載できていません。 上手くいかない場合は、現状は製作者(本ページフッターに記載)までお問い合わせいただければ幸いです。

機体のチューニングの参考文献として、以下が非常に参考になります。是非ご活用ください。(随時追加予定/以下は別頁分離予定)

mtk_birdman https://mtkbirdman.com

日本語資料の中で特にわかりやすい。

UIUC Applied Aerodynamics Group https://m-selig.ae.illinois.edu

ヒント

サンプル機に同様の設定を施してあります。お手元に用意して、参考にしてください。
以下の記事内容は、まず文字は見ず、記事中の図とサンプルをみることをお勧めします。

概要

この章では、FDMiにおける物理挙動の設定方法を説明します。

流れとしては以下の通りです。

  1. タイヤ
  2. 位置・大気・風速(ADIRU)
  3. エンジン
  4. 主翼
  5. 尾翼
  6. 機体重量・重心・モーメント
  7. 胴体抵抗
  8. 操縦系

以下の設定は、基本Vehicle/Physics以下に行います。
Vehicle/Physicsには、FDMiObjectActivatorIsPilotを配置してあります。 これにより、機体の同期オーナーが、機内にいるときのみ物理演算が行われるようになります。

1. タイヤ

まず、機体を支える”タイヤ”をセットアップします。
タイヤ自体はUnity標準のWheelColliderを使用します。追加で、タイヤに関する制御を行うFDMiWheelを設定します。

ヒント

WheelColliderは、(内部実装が4輪前提?なのか)4つ丁度配置すると計算が良い感じになります。 ほとんどの機体の場合、前輪に2つ、主脚に2つにすればよいはずです。

FDMiWheelWheelColliderは、サンプル例を参考に、以下の通り設定します。

FDMiWheel

WheelCollider

  • WheelMass
    • ばね下の動きを示します。タイヤ+サスペンションの重みとして、少し重めに設定してください。
  • WheelDampingRate
    • タイヤの慣性です。タイヤの抵抗はここで調整してください。
  • ForceAppPointDistance
    • タイヤが力を伝える位置です。タイヤの接地面より上なら基本的に問題ないらしい?
  • Suspension Spring
    • 機体を地面にたたきつけて、いい感じの値を割り出してください。
      • 「Play(上側再生ボタン)」⇒「機体の椅子に座った状態で一時停止」⇒「Rigidbodyのコンポーネントを上側に移動」で、機体を地面から浮かせられます
    • おおむね、機体重量に比例するはずです。

FDMiWheel

  • TillerInput
    • タイヤを左右に傾ける入力です
    • タイヤの角度はrotateAngle * TillerInput.data(°)、右向き正で計算します
  • BrakeInput
    • タイヤのブレーキ入力です
    • WheelColliderのBrakeTorqueとして、brakePressure*brakePressure.dataを代入します
  • ParkBrakeInput
    • パーキングブレーキの入力です
    • WheelColliderのBrakeTorqueとして、parkBrakePressure*ParkBrakeInput.dataを代入します
  • Retract
    • 脚の格納です
    • retractDirectionの方向に、retractCurve(Retract.data)分Transformを移動させます
  • absKi,absTgt
    • タイヤのABS機能の設定値です。十分大きな値が入っていれば、基本無問題です。
  • preLoadTorque
    • タイヤに少しだけ前進方向のトルクを与えます。かならず正方向に微小な値を入力してください。
    • これが0のとき、機体は前進できません。

2. 位置・大気・風速(ADIRU)

機体自身の置かれている状況を計算します。ここで計算されたデータを基に、FDMiは空気力の計算を行います。

※※ TODO (ADIRUの概念図) ※※

ここで取り扱うデータは、一般的な航空機のADIRU(Air Data/ Inertial Reference Unit)に相当するものになります。 ただし、実機におけるADIRUは「センシングしたデータから、機体の状況を把握する」ものなのに対し、FDMiのそれは「機体の状況に関するデータを”生成”する」ものであることに注意してください。

ここでは、サンプル機のDatabus/Vehicle/Avionics/ADIRUを流用する形とします。 ただし、ADIRUはFDMiObjectActivateInZoneの子にして、機内のみで動作させるようにします。 (新しい機体を作成するときは、Databus/Vehicle/Avionicsを丸ごと、新機体のDatabus/Vehicleの下に置きます)
※下図の項目は設定をサンプル機そのままにして導入してください ADIRU

次に、Databus/Adaptersを設定します。これは、機体外で設定された、大気(地面の気圧・気温・風速)を機体に適用するものです。(機体の外にあるFDMiDataの情報を、機内に接続します。) Databus/Adapters/FDMiStackを、新機体にコピーしてください。 DataAdapter

3. エンジン

エンジンを設定します。 今回は、ジェットエンジンを設定します。 まず、エンジンの出力はFDMiSimpleJetEngineZ軸方向に働きます。位置・角度を調整してください。

基本的には、サンプル機のジェットエンジンをチューニングする形とさせて下さい。

※※ TODO (N1,N2の概念図) ※※

また、エンジン始動時は、以下の形になりますので、適当な値を入れてください。

  1. AirSW.data=1の状態だと、N2maxAirN2に向かい、秒間N2Airdt増加する。このときスロットル操作は影響なし
  2. N2 >= N2FuelThresholdの状態で、FuelSW.data=1とすると、スロットル操作が有効になる
  3. AirSW > maxAirN2の状態になると、AirSWは0になる
  4. FuelSW=0でスロットル操作無効、N2は0に向け減少する
危険

複数のエンジンを取り付ける際は、FDMiDataBusTerminalの、☑のついた項目のglobal Nameをかぶらせないよう設定してください。
これに関して、エラーは発生しないので、気を付けて実装してください。

4. 主翼

次に、主翼を設定します。サンプル機のDatabus/Vehicle/Physics/Wing/mainFoilを参考にしてください。 ※ パイロットのみが計算を担当するよう、FDMiObjectActivateIsPilotの子に配置してください。通常Databus/Vehicle/Physicsの子に配置します。

  1. 翼の区間を、ある程度分割しつつFDMiWingSectionで定義してください。
  • 翼前縁をtransformの位置、翼後縁を、chordLengthで伸びる線の先端で定義してください
  • FDMiWingSection
  1. 二つのFDMiWingSectionに挟まれた位置に、FDMiwingを配置します
  • このとき、FDMiwingHierarchy上側左側FDMiWingSectionHierarchy下側右側のFDMiWingSectionが来るように配置します。
  • 配置したら、SectionLSectionRの横 Meybe ボタンを押します。
  • 次にSetup Thisボタンを押します。
  • ここまでで、Y軸が翼の上側に来ていることを確認します。
  • FDMiWing
  1. 以下の翼特性を入力します
  • Cl_Alpha,Cd_Alpha: 翼の迎角(空気の流れと翼の角度差)に応じた揚力/抗力の出方をチューニングします。
  • Cl_Mach,Cd_Mach:翼のマッハ数に応じた揚力/抗力の出方をチューニングします。サンプル機の値でまず試します。
  • affected wing : 現在バグがあるので、埋めなくて大丈夫です。(Maybeを押して埋めても影響小。放置で良い)
  1. 1~3を繰り返し、翼の形を作成します。
  2. 最後に、上部FDMi/Setup Allを押します。
危険

FDMiwingのコンポーネントが増加した際には、必ずFDMi/Setup Allを実行してください。
翼が機体に登録されず、Exceptionが発生します。

ヒント

Cl-Alpha, Cd-Alphaは特にこだわりなき場合、サンプル機の数字で良いと思います。 ただし、戦闘機やアクロバット機のときは、主翼も尾翼の値で設定してあげます。

ヒント

そのままだとほとんどの機体が翼端失速を起こすので、翼の左右の端のFDMiWingSectionに、ねじり下げ(Z軸が少し下を向くくらい?)を設定してください。
この挙動はバグで、修正予定です。(本来affected wingで計算する箇所だった)

5. 尾翼

次に、尾翼を設定します。主翼と同様に、尾翼の形を設定します。

ヒント

垂直尾翼のSectionL,SectionRの上下関係は、どちらでも大丈夫です。

尾翼の考え方ですが、2通りあります。どちらでも構いません。

  • 尾翼が「全体の舵の何%か」⇒「尾翼全体が何°回ったことに相当するか」で計算
  • 尾翼舵面と固定部を分けて、舵面のみ回転させる

ここで、尾翼の舵を設定します。 尾翼舵は、Transformを回転させて行います。以下のどちらでも構いません。

  • 機体のボーンに連動させる
  • FDMiWingの親にコンポーネントを配置し、回転させる

今回は後者で設定を行います。 サンプル機の通り、FDMiwingの親にTransformを設定し、FDMiwingの回転軸に合わせるように配置します。

Rudder

6. 機体重量・重心・モーメント

ここで、機体重量・重心・モーメントを設定します。 サンプル機の通り、FDMiFuselageDatabus/Vehicle/Physics/fuselageに配置します。 ※ パイロットのみが計算を担当するよう、FDMiObjectActivateIsPilotの子に配置してください。通常Databus/Vehicle/Physicsの子に配置します。

機体重量

FDMiFuselageOverride Massを有効化(☑)すると、Rigidbody.MassをMass.dataの値に上書きします。

慣性モーメント

機体の”回転の重さ”です。
FDMiFuselageOverride Inertiaを有効化(☑)すると、Rigidbody.inertiaTensorをInertiaTensor.dataの値に上書きします。
ここは、詳しくない場合は無効化してください。その場合、Unityのコライダーの大きさで、回転の重さを調整してください。

ヒント

慣性モーメントは、現実にある類似機の代表値を入れて、操舵が重たい場合は減らしていく形で調整してください。 (Cessna 172, B737, F-16あたりの値で試すことをお勧めします)

重心

FDMiFuselageOverride Cogを有効化(☑)すると、Rigidbody.centerOfMassをCoG.dataの値に上書きします。 CoGVector3の値を設定します。Transformをずらして、いい感じになった所のRigidbodyの位置からの距離を、CoG.dataに入れます。

CoG

注記

基本的に、重心は以下の制約を満たして下さい。

  • 前後のギアの中間のどこか
  • 翼の生えている位置の、中ほどから前半あたり

操縦特性が重たい時は重心を後ろより、軽いときは前よりにしてみてください。 重心位置と翼の配置が正しければそれなりに飛ぶはずです。

7. 胴体抵抗

胴体抵抗の設定を行います。 FDMiDragBodyDatabus/Vehicle/Physics/bodyDragに配置します。 ※ パイロットのみが計算を担当するよう、FDMiObjectActivateIsPilotの子に配置してください。通常Databus/Vehicle/Physicsの子に配置します。

  • D,Lを調節し、機体と、黄色いカプセルコライダーの大きさが大体同じになるように調節してください。
  • Transformの中心位置は重心付近に配置します。

FDMiDragBody

注記

現状、胴体抵抗の計算が間違っています。調整は適当程度で済ませてください。

8. 操縦系

最後に、操縦系の設定を行います。 操縦系は、以下のように伝達します。

  1. パイロットの入力やオートパイロットが操舵量を出力します。
  2. 操舵量をFDMiFloatMixer等で混ぜ合わせ、各舵の操舵量(通常 -1~1)を作成します。
  3. 翼に操舵量に対する効果を適用します。

※※ TODO (操縦系の概念図) ※※

操縦量の混ぜ合わせ

操縦量の混ぜ合わせはDatabus/Vehicle/Controlで行います。 FDMiFloatMixerを設定します。

FloatMixer_Pitch

ヒント

ここで作成したFDMiFloatの値を、舵面のアニメーションに適用することを推奨します。

操縦系の翼への適用

操縦系の適用は、2種類に分けて考えます

  • 翼の角度変化(Transformの回転で達成)
  • 翼への効果(Cl,Cdへの単純倍)

※ パイロットのみが計算を担当するよう、FDMiObjectActivateIsPilotの子に配置してください。通常Databus/Vehicle/Physicsの子に配置します。
今回はDatabus/Vehicle/Physics/Actuatorに配置しています。

翼の角度変化

FDMiTransformRotationDriverを用い、翼のTransformを回転させます。 multiplierに、操舵量に対する舵の回転量を入力します。

FDMiTransformRotationDriver

翼への効果

FDMiWingExtendActuatorを用います。 Multiplyに、操舵量に対する揚力/抗力の増加倍数を入力します。

FDMiWingExtendActuator