Virtual flight is a homepage which introduces FlightGear Flight Simulator.

AI機



   

●AI機のプロペラを回してみる

【コメント】

 別な箇所でAI機を飛ばしてもプロペラは止まったままと述べましたが、既存の機体を借用してAI機とした場合にデフォルトのままでは、という条件がついての話。プロペラの止まった飛行機が悠然と飛行し続けている様は、無気味この上ないものです。いずれ回転しているようにみせてやりたい思っていたところ、ようやく巡ってきた機会に、このメモを残したものです。
 きっかけとなったのは、エンジンが高速回転すると、プロペラもスピナーも消えてなくなってしまうM.C.72が、CVS版では高速回転するプロペラが再現されているのを知ったこと。

 たいていレシプロ機の場合の3Dモデルには、低速時に回転するプロペラとともに、高速時用に高速回転しているかのように見せかけるパーツが用意されています。当該機体のxmlファイルでは、エンジンの回転数がある値を超えれば高速用のパーツを表示し、ある値に満たない場合はプロペラそのものを表示させるように記述されています。これがうまく利用できれば‥・。
 AI機の場合、一定速度で旋回飛行するような場合と速度を上げながら空港から離陸するようなFlight Planにもとづく場合との2つのAIシナリオが考えられます。

 一定速度のケースでは、高速回転さえ表現できればよいわけですが、AI機のエンジンの回転数って? 0ならプロペラは回らないはず。しかもここでのエンジンの回転数は、AI機のものなのでしょうか? ままよとばかりに、xmlファイル中のプロペラに関する<animation>タグ中の<select>の条件式を<value>の値はそのままに<grater-than>と<less-than>をそれぞれ逆にしてやりました。別名で書き換えたこのxmlファイル名を、AIシナリオにパス指定して書き込んだ上、AIシナリオを実行するように指定しFlightGearを実行させたところ、プロペラは高速回転しているかのようにとりあえずは再現できました。

 もう一方の、速度の変化と合わせてプロペラの回転の様子も変えてやらなければならないケースでは、こんないい加減なことでは済みそうにありません。そこで、Flight Planではポイントごとに速度などを指定していることから、本末転倒の感はあるもののこれを条件に使えないかと考えました。
 しかし、条件式の<property>にAI機の速度を扱うものが存在するのでしょうか? AIシナリオで使うために用意した機体のxmlファイルに記述する<animation>タグ中の<select>の条件式の<property>に、velocities/true-airspeed-ktと/instrumentation/airspeed-indicator/indicated-speed-ktとを試してみました。<value>に目的の速度を与えることで、いずれも低速、中速、高速の使い分けができました。ただし、明らかに後者はFlightGear起動時に指定した航空機の速度に依存したもの、他方前者はどうやらAI機の速度を反映してくれているようです。

 ところでまだ問題は低~中速時。プロペラは表示されてもそれ自身を回転させれていません。もっとスマートなやり方があるのかもしれないのですが、ここでも<animation>の<spin>の<property>にvelocities/true-airspeed-ktを使用。そして<factor>の値に何を与えてよいか理解できぬままに適当な数値を与えてすませました。それでも、作成したこの機体のxmlファイル名を、AIシナリオにパス指定して書き込み、これを実行させたところ、低~中速時にAI機はプロペラを回転させています。とりあえずは目的が達成できたといえます。なお、前者の場合でもAIシナリオにて速度を与える箇所がありますから、後者で作成したxmlファイルがそのまま使えることはいうまでもありません。

 AIシナリオで使うためのxmlファイルを、既存のファイルから内容を少し書き換えただけの別名ファイルにし、これ1つを当該機体のデレクトリに保存するだけ、というのがここでのミソ。

※最近のバージョンのFlightGearではFlight Planはなぜか動かないようです。

【実際】

〔AIシナリオ & Flight Plan〕

・具体例は省略

※最近のバージョンのFlightGearではFlight Planはなぜか動かないようです。

〔AI機に既存の機体を流用する場合〕

・ここでの例では、c310u3aをAI機として扱うことにします。
・既存の/Aircraft/c310u3a/Models/c310u3a.xmlをコピーしAIシナリオで使うためにc310u3a_AI.xmlという別名を与えます。 ・c310u3a_AI.xmlファイルの元のファイルからの変更点は以下の通り。

 <?xml version="1.0" ?>
 <PropertyList>
       (略)
  <!-- Object Selection -->
  <animation>
  <type>select</type>
  <object-name>LeftPropellerDisk</object-name>
  <object-name>RightPropellerDisk</object-name>
  <condition>
   <greater-than>
    <!-- <property>engines/engine[0]/rpm</property>
    <value>1000</value> -->
    <property>velocities/true-airspeed-kt</property>
    <value>60</value>
  ←ここは速度 Flight Planに見合う数値を与えます
   </greater-than>
  </condition>
  </animation>
  <!-- <animation>
  <type>select</type>
  <object-name>RightPropellerDisk</object-name>
  <condition>
   <greater-than>
    <property>engines/engine[1]/rpm</property>
    <value>1000</value>
   </greater-than>
  </condition>
  </animation> -->
  <animation>
  <type>select</type>
  <object-name>LeftPropeller</object-name>
  <object-name>RightPropeller</object-name>
  <condition>
   <less-than>
    <!-- <property>engines/engine[0]/rpm</property>
    <value>1500</value> -->
    <property>velocities/true-airspeed-kt</property>
    <value>150</value>
  ←ここは速度 Flight Planに見合う数値を与えます
   </less-than>
  </condition>
  </animation>
  <!-- <animation>
  <type>select</type>
  <object-name>RightPropeller</object-name>
  <condition>
   <less-than>
    <property>engines/engine[1]/rpm</property>
    <value>1500</value>
   </less-than>
  </condition>
  </animation> -->
       (略)

  <!-- Object Movement -->
       (略)
  <animation>
   <type>spin</type>
   <object-name>LeftPropeller</object-name>
   <!-- <property>engines/engine[0]/rpm</property>-->
   <property>velocities/true-airspeed-kt</property>
   <factor>-1</factor>
   <center>
    <x-m>0.99</x-m>
    <y-m>-1.90</y-m>
    <z-m>0.04</z-m>
   </center>
   <axis>
    <x>1</x>
    <y>0</y>
    <z>0</z>
   </axis>
  </animation>
  <animation>
   <type>spin</type>
   <object-name>RightPropeller</object-name>
   <!-- <property>engines/engine[1]/rpm</property>-->
   <property>velocities/true-airspeed-kt</property>
   <factor>-1</factor>
   <center>
    <x-m>0.99</x-m>
    <y-m>1.90</y-m>
    <z-m>0.04</z-m>
   </center>
   <axis>
    <x>1</x>
    <y>0</y>
    <z>0</z>
   </axis>
       (略)

  </animation>


[2008/11/30][2012/12/01更新][2018/04/23刷新][2018/10/10更新]


   

●AI機の車輪を飛行中は消す、地上では出す

【コメント】

 AI機のプロペラは、低速、中速、高速での回転をまがりなりにも再現できるようになりましたが、既成のAI機では車輪が離陸後も出っ放し、逆に既存の機体を借りてAI機とした場合には、はじめから車輪がない、というのも解決すべき問題です。Flight Planには車輪の出し入れに関係しそうな<gear-down>タグが存在するのですが、働きがよくわかりません。

 この際、AI機のプロペラに用いた方法をあてはめ、AIシナリオで使うxmlファイルの作成にあたっては書き換えをできるだけ少なくし、このファイル1つあれば足りるようにしたい。なお、本来なら車輪を出したり引っ込めたりの様子をアニメーションで再現できればよいのでしょうが、既成のAI機にはその機能がないこと、その機能をもつ既存の機体を流用してAI機とする場合も実現するには荷が重そうなので、AI機にそこまでする必要があるのかを言い訳に見送ることにしました。よってここでは、車輪の出し入れの動作は伴わず、降ろしているか格納しているかだけの対処となりますので、プロペラ同様に単純な条件式を与えれば済むはずです。

 Flight Planではポイントごとに速度だけでなく高度も指定しています。どちらも条件に使えそうですが、高度を使う場合は空港の場所の海抜が異なりますから、設定をいちいちあらためる必要がでてきそうなので、一般的にあてはまるように速度を採用することにしました。したがってここでも<property>にvelocities/true-airspeed-ktを用い、<value>に速度を与えた<select>の<animation>タグを、AIシナリオで使うのに用意した機体のxmlファイルに記述。結果、Flight Planでの離陸では、滑走時には車輪が表示され、離陸後は消すことができました。ただし、車輪を無理矢理表示させるようにしたので、Flight Planのxmlファイル中のタグはfalseにしておかないとならないでしょう。

 ちなみに、高度についても<property>にposition/altitude-ftを用いてみたところ、期待通りの動きをしてくれているようです。ただしここで述べた2つの方法は、<type>aircraftのAIシナリオでは通用しますが、同じAIシナリオでも<type>ballisticでは通用しません。

 既成のAI機にこうした機能があらかじめ用意されていないのには、何か理由がそれなりにありそうですが、他に方法が用意されていたとしても、ここでは独自に作成したファイル以外に何もさわってはいないので、不都合がおこることはなさそうに思えます。もとい、Flight Planのxmlファイルも修正が必要でした。それでも、条件に高度ではなく速度を用いたことで、汎用性をもたせることができたと思われます。
 なお、変更はなるべく少なくしたいといいながら、ファイルの修正が2つになったばかりか、複数の車輪を一括して扱っている既成のAI機の場合は<select>の<animation>タグを記述するだけでよいですが、AI機に既存の機体を流用する場合は、さらに出し入れの動作を記述したものである<rotate>の<animation>タグについても前輪や左右の車輪などごとに、格納ドアも含めるとそれ以上の箇所についてそれぞれ一箇所の数値だけではありますが変更が必要になりました。

 ここではフライトプランに指定された速度を利用して、一定速度を上回れば車輪の描画をやめることを条件にすることで、AI機の車輪を滑走中は表示し、離陸後は表示しないようし、車輪の出し入れを擬似的に再現するようにしています。したがって車輪だけならよいのですが、同時に車輪格納ドアの開閉も同様にした場合は、車輪を降ろしていない時すなわち飛行中は車輪格納ドアが表示されず、穴があいているかのようになります。車輪とカバーが一体のレシプロ戦闘機のような場合でなければ、格納ドアは閉じたまま、車輪だけ出し入れの方が見栄えがよいかもしれません。
 なお、下記の【実際】の項では、c310u3aをAI機として車輪の出し入れを擬似的に再現するxmlファイルの例を示しましたが、こちらは車輪の出し入れに<offset-deg>タグを使用しています。<offset-deg>タグで数値を0にすることで、車輪を降ろした状態を指定しました。しかし、機体によりますが、<interpolation>タグを用いるケースが多く見受けられます。この場合は、おそらく最初の<entry>タグ中の<ind>の後の<dep>を最後の<entry>タグ中の<dep>の数値に書き換えることで、車輪を出しっぱなしにすることができるでしょう。

※最近のバージョンのFlightGearではFlight Planはなぜか動かないようです。


【実際】

〔AIシナリオ & Flight Plan〕

・具体例は省略。ただし、Flight Planのxmlファイル中の<gear-down>タグの記述は、falseにしておかなければなりません。

※最近のバージョンのFlightGearではFlight Planはなぜか動かないようです。

〔AI機に既存の機体を流用する場合―<offset-deg>タグの例〕

・ここでの例では、c310u3aをAI機として扱うことにします。
・既存の/Aircraft/c310u3a/Models/c310u3a.xmlをコピーしAIシナリオで使うためにc310u3a_AI.xmlという別名を与えます。
・c310u3a_AI.xmlファイルの元のファイルからの変更点は以下の通り。

 <?xml version="1.0" ?>
 <PropertyList>
       (略)
  <animation>
   <type>select</type>
   <object-name>NoseWheel</object-name>
   <object-name>NoseWheelGear</object-name>
   <object-name>NoseWheelFork</object-name>
   <object-name>FrontNoseWheelDoor</object-name>
   <object-name>LeftNoseWheelDoor</object-name>
   <object-name>RightNoseWheelDoor</object-name>
   <object-name>LeftWheel</object-name>
   <object-name>LeftGearFrame</object-name>
   <object-name>LeftGearDoor</object-name>
   <object-name>RightWheel</object-name>
   <object-name>RightGearFrame</object-name>
   <object-name>RightGearDoor</object-name>
   <condition>
    <less-than>
     <property>velocities/true-airspeed-kt</property>
     <value>80</value>
  ←ここは速度 脚をしまうタイミングの数値を与えます(注記参照)
    </less-than>
   </condition>
  </animation>

       (略)
  <animation>
   <type>rotate</type>
   <object-name>NoseWheel</object-name>
   <object-name>NoseWheelGear</object-name>
   <object-name>NoseWheelFork</object-name>
   <property>gear/gear[0]/position-norm</property>
   <factor>120</factor>
   <!-- <offset-deg>-120</offset-deg> -->
   <offset-deg>0</offset-deg>
   <min-deg>-90</min-deg>
   <max-deg>0</max-deg>
       (略)
  </animation>
  <animation>
   <type>rotate</type>
   <object-name>FrontNoseWheelDoor</object-name>
   <property>gear/gear[0]/position-norm</property>
   <factor>120</factor>
   <!-- <offset-deg>-120</offset-deg> -->
   <offset-deg>0</offset-deg>
   <min-deg>-90</min-deg>
   <max-deg>0</max-deg>
       (略)
  </animation>
  (以下、前輪左右の格納ドア、左右の車輪と各々のギアフレーム、格納ドアについては省略しますが、いずれも最初の<entry>タグ中の<ind>の後の<dep>を最後の<entry>タグ中の<dep>の数値に書き換えます)
       (略)
 </PropertyList>


〔AI機に既存の機体を流用する場合―<interpolation>タグの例〕

・ここでの例では、p-kikka(Me262を改造)をAI機として扱うことにします。
・既存の/Aircraft/p-kikka/Models/p-kikka.xmlをコピーしAIシナリオで使うためにp-kikka_ai2.xmlという別名を与えます。
・p-kikka_ai2.xmlファイルの元のファイルからの変更点は以下の通り。

 <?xml version="1.0" ?>
 <PropertyList>
       (略)
  <animation>
   <animation>
   <type>select
   <object-name>porteG1</object-name>
   <object-name>porteG2</object-name>
   <object-name>porteD1</object-name>
   <object-name>porteD2</object-name>
   <object-name>porteA1</object-name>
   <object-name>porteA2</object-name>
   <object-name>axeA</object-name>
   <object-name>axeB</object-name>
   <object-name>axeGH</object-name>
   <object-name>axeG</object-name>
   <object-name>axeDH</object-name>
   <object-name>axeD</object-name>
   <object-name>roueA</object-name>
   <object-name>roueG</object-name>
   <object-name>roueD</object-name>
   <condition>
    <less-than>
     <property>velocities/true-airspeed-kt</property>
     <value>80</value>
  ←ここは速度 脚をしまうタイミングの数値を与えます(注記参照)
    </less-than>
   </condition>
  </animation>

       (略)
  <animation>
   <type>rotate</type>
   <object-name>roueA</object-name>
   <object-name>axeA</object-name>
   <object-name>axeB</object-name>
   <property>gear/gear[0]/position-norm</property>
   <interpolation>
     <entry>
       <ind>0.0</ind>
       <!-- <dep>-102.0</dep> -->
       <dep>0.0</dep>
     
</entry>
     <entry>
       <ind>1.0</ind>
       <dep>0.0</dep>
     </entry>
   </interpolation>
       (略)
  </animation>
  <animation>
   <type>rotate</type>
   <object-name>roueG</object-name>
   <object-name>axeGH</object-name>
   <object-name>axeG</object-name>
   <property>gear/gear[1]/position-norm</property>
   <interpolation>
     <entry>
       <ind>0.0</ind>
       <!-- <dep>80.0</dep> -->
       <dep>0.0</dep>
     
</entry>
     <entry>
       <ind>1.0</ind>
       <dep>0.0</dep>
     </entry>
   </interpolation>
       (略)
  </animation>
  (以下、残りの車輪と各々のギアフレーム、格納ドアについては省略しますが、いずれも<offset-deg>タグの値を0にします)
       (略)
 </PropertyList>


注記)ここではフライトプランにもとづき、滑走、離陸していくAI機の車輪の出し入れを、フライトプランに指定された速度を利用して、一定速度を上回れば車輪の描画をやめることを条件にすることで、擬似的に再現するようにしたものです。単に駐機中の飛行機の車輪を表示するだけなら、フライトプランは不要であり、またここに示した<condition>の指定も不要です。

[2008/11/30][2009/11/29追加][2012/12/01更新][2018/04/23刷新][2018/10/10更新]


   

●波間に揺れるAI機

【コメント】

 AI機にこだわれば今一つ解決したいのが、波間に浮かぶ水上機の揺れの再現です。通常は水面に置いたAI機(速度は0とする)は、まるでコンクリート上にあるかのように微動だにせず、あまりにも不自然。しかし、都合のよいことに、先頃Tatさんが空母の揺れを再現するNasalプログラム(rocking_nimitz.nas)をつくって下さったので、これを流用することができます。

 空母よりは随分とスケールが小さい水上機では、揺れは大きくなるはずなので、プログラムのはじめの方で指定するpitchやrollの値は大きく、wind_thresholdの値は小さくします。
 次に、AIシナリオでに記述するについてですが、aircraftにするかshipにするかで同じプログラムであっても不思議なことに揺れが異なってきます。aircraftにすると、pitchに変化なく、rollの動きは波間に浮かぶにしてははげしすぎて似つかわしくありません。他方、shipにした場合は、pitch、rollともさもそれらしいゆっくりとした揺れが再現されます。

 ここで注意したいのは、このプログラムはいつも生きていて、他のAIシナリオを使用する場合にも影響が及ぶ点です。プログラムの後半に、pitchやrollの変化を適用するAIモデルを指定している箇所がありますが、元々のcarrier[0]に代えてaircraft[0]を指定してやると、AIシナリオ中の1番目のAI機が揺れだしてしまうことになり、もし地上に配置されたAI機であればおかしなことになるのはいうまでもありません。shipとて同じですが、aircraftに比べれば影響を受ける機会は少ないはず。ましてや船舶であれば、大きさの大小で揺れに違いはあっても、揺れていておかしくはないのだから、やはり解決策としても<type>はshipとするのがよさそうです。

 ちなみにship[0]を指定した時は、AIシナリオ中<type>shipの<entry>のうち最初に記述されたものの3Dモデルが指定されることになり、ship[1]とすれば2番目となります(以下同様)。なおAIシナリオを複数同時使用する場合は、起動時にコマンドライン入力を先にしたAIシナリオが優先されるように思います。

 おかげで、水上機だけでなく船も含めて、波浪に揺れる様が再現できました。Tatさんに感謝!

【実際】

〔rocking_ship.nasの作成〕

・元となるrocking_nimitz.nasを日本語のサイト(http://flightgear.jpn.org/wiki)のNasalスクリプト集からダウンロードします。
・このnasファイルをrocking_ship.nasと名称を変え、後述するような修正の上、$ FG_ROOT/Nasal下に置きます。
・それだけで以後<type>shipの<entry>をもつAIシナリオが実行されたら、そこで指定された3Dモデルはさも波浪にさらされたかのように揺れるようになります。

〔AIシナリオの記述〕

・波間に揺れる様子を再現したい3Dモデルについて、<entry>を記述します。その際、<type>は航空機であってもここではshipを指定します。
・他に<type>がshipの<entry>が存在するなら、それらのどれよりも前に当該の<entry>を先頭に置きます。
・他、略。

〔rocking_nimitz.nasからrocking_ship.nasへの変更点〕

・変数に代入する値 元のままでもよいですがlimit_pitch=1、limit_roll=3と少し大きくし、max_pitch、max_rollはそれに準じました。wind_threshold=1としましたが、空母と違い風の影響を受けやすくなるよう値を小さくしたもの。pitch_cycle、roll_cicleについては値を変えなくてもよさそう。
・関数部分で使われているrock_nimitzは、rock_shipに変更(3箇所)。
・AIモデルにcarrierを指定しているinterpolateの行では、/ai/models/carrier[0]/orientation~に代えて/ai/models/ship[0]/orientation~とshipを指定します(2箇所)。

[2008/12/14][2012/12/01更新][2018/04/23刷新]


   

●Nasalで漂うAI水上機

【コメント】

 AI水上機が波間に揺られだすと、今度はどうにも漂わせたくなってきます。
 とは言っても、風が機体に及ぼす影響についての力学的な知識は持ち合わせておらず、本来ならインターネットで検索してそれらしい数式などを見つければよいのでしょうが、それは今後の課題として(^_^!)、ここでは勉強のためにNasalプログラム(ここではdrifting_ship.nasと名付ける)に挑戦することに主眼をおきました。したがってアーキテクチュアもいたって単純で、風の力に合わせて機体を適当に流されるようにし、流される方向も風下としただけのものです。すなわち、風向きの180度反対を風下として、sin、cosで新たな経度・緯度を与えるようにしました。ただ、sinやcos、πのまま記述したのではエラーをおこしてしまい、他のnasファイルで使用例を探す必要がありました。そういえば別種のプログラムを何かいじった際は、πはpiとしなければならなかったのを思い出しました。

 なお、機体の向きは風見鶏のように風の向きにしたがって変化するものと考えられますが、ここではNasalではなく機体のxmlファイルで対処することにしました。ただしまだよくわからず、無理矢理最初に風上に機首を向けるだけの暫定的なプログラムに終わっています。
 ちなみに検証のため、同じ機体を通常の機体として起動した場合とAI機としてAIシナリオを実行した場合とを、--wind=DIR@SPEEDオプションを使って比較してみました。流される方向やその速さは似通わせることができたように思いますが、やはり挙動にはかなり違いがあります。ひょっとすれば、Nasalへの無理解からとんでもない思い違いをしでかしている可能性もあります。

 作成したNasalファイルの使い方は、波間に揺れるAI機の項で述べたrocking_ship.nas同様に$ FG_ROOT/Nasal下に置くだけ。漂わせたい3DモデルについてのAiシナリオの記述に関しては、先の項のrocking_ship.nasとやはり同様です。<entry>に記述する<type>は航空機であってもshipを指定します。

 相当にいい加減ですが、それでもそれらしく波間を漂っていく様子が再現できました。

 

Sailboat & M.C.72
↑癒されますねえ


【実際】

〔$FG_ROOT/Nasal下に置くdrifing_ship.nas〕

  var wind_threshold = 20;
  var latche=1;
  var lonche=1;

  var calc_drift = func {
    var wind_speed = getprop("/environment/wind-speed-kt");
    if (wind_speed > wind_threshold) {
     wind_speed = wind_threshold;
    }
    var wind_dir = getprop("/environment/wind-from-heading-deg");
    var drift_dir=wind_dir+180;
    if (drift_dir>=360){
     drift_dir -=360;
    }
    latche = math.cos(drift_dir*math.pi / 180.0)*(wind_speed / 500000);
    lonche = math.sin(drift_dir*math.pi / 180.0)*(wind_speed / 500000);
  }

  var drift_ship = func {
    calc_drift();
    var sec = getprop("/sim/time/elapsed-sec");
    var property=getprop("/ai/models/ship[0]/position/latitude-deg");
    if (property==nil){
     var oldlat=0;
    }else{
     var oldlat=getprop("/ai/models/ship[0]/position/latitude-deg");
    }
    property=getprop("/ai/models/ship[0]/position/longitude-deg");
    if (property==nil){
     var oldlon=0;
    }else{
     var oldlon=getprop("/ai/models/ship[0]/position/longitude-deg");
    }
    var newlat = latche+oldlat;
    var newlon = lonche+oldlon;
    interpolate("/ai/models/ship[0]/position/latitude-deg", newlat, 1);
    interpolate("/ai/models/ship[0]/position/longitude-deg", newlon, 1);
    settimer(func { drift_ship(); }, 1 );
  }

  _setlistener("/sim/signals/fdm-initialized", func { drift_ship(); });


〔AIシナリオの記述〕

・波間に漂う様子を再現したい3Dモデルについて、<entry>を記述します。その際、<type>は航空機であってもここではshipを指定します。
・他に<type>がshipの<entry>が存在するなら、それらのどれよりも前に当該の<entry>を先頭に置きます。
・<entryに記述する機体のxmlファイルは、元々のものとは別に風上に機首を向けるように書き改めた専用のxmlファイルの名前を指定します。ここの例ではMacchi-Castoldi-MC72を機体とするmc72-drift.xml。

〔暫定版のmc72-drift.xml〕

・元のmc72.xmlへ次のような記述を追加しました。windsock.xmlを参考にしましたが、よくわけがわかった上で記述したものではありませんので、たぶんに問題あるものと思われます。

 <?xml version="1.0" ?>
 <PropertyList>
       (略)
  <animation>
    <type>rotate</type>
    <property>/environment/wind-from-heading-deg</property>
    <offset-deg>30</offset-deg>
    <factor>-1</factor>
    <axis>
     <x>0.0</x>
     <y>0.0</y>
     <z>1.0</z>
    </axis>
    <center>
     <x-m>0.0</x-m>
     <y-m>0.0</y-m>
     <z-m>0.0</z-m>
    </center>
  </animation>


 </PropertyList>


[2008/12/19][2012/12/01更新][2018/04/23刷新]


   

●AI機にスモーク

【コメント】

 particle systemを使うことで、ミサイル自身にスモークを引かせることができるようになったことから、もしかしてAI機にもスモークを引かせることができるのではと思い立ちました。
 あたり! スモーク発生の条件を一切記述しないことで、AI機に無条件でスモークを発生させることができました。

 そこでメモリをムダにしないために実機でもAI機でもスモーク用ファイルを共用できるようにならないか考えてみました。
 実機とAI機とではスモーク発生の条件が異なります。AI機ではエンジンが生きているわけでなくいわば魔法で飛ばされているようなものですから、スモークの発生条件にエンジンの状態は使えません。動いていない時に排気を発生させないためには、AI機のプロペラを回す場合のように、ここでも条件にはvelocities/true-airspeed-ktを用いるべきかと考えました。それならtrailL.xmlやtrailR.xmlを共用することにして、そこからスモーク発生の条件を指定した記述を排除し、条件は実機、AI機それぞれの起動ファイルに記述すればと考えたのです 。
 残念ながらこれは失敗。というのもマルチプレイヤーでの相手側機にスモークを発生させようとしても、起動ファイルに発生の条件を記述したのでは働きません。また、元々のtrailL.xmlやtrailR.xmlのままでは、マルチプレイヤーの相手機にスモークは発生させられません。

 結局、実機、AI機、マルチプレイヤーでファイルを共用する考えは放棄するしかなく、また実機とマルチプレイヤーではスモーク用のtrailL.xmlやtrailR.xmlを違えるわけにはいかないので、これらの元々のスモーク発生条件にさらにマルチプレイヤー用の設定を加え、AI機には別途スモークの発生の条件を削除したファイルを作成するしかなさそうです。これで問題がすべてなくなるわけではありませんが。

【実際】

〔前提〕

 機体はp-kikkaを用います。

〔trailL.xmlやtrailR.xml〕

 実機とマルチプレーヤー時の機体でスモークを発生させるために、元もとの発生のand条件設定を残すとともに新たにマルチプレイヤー用にこのand条件の片方のエンジンの条件の方をvelocities/true-airspeed-ktを用いたものにかえた設定をもうけ、先のand条件とor条件でくくったものをtrailL.xml、trailR.xmlとしました。

〔AI機のためのスモーク発生用ファイル〕

 trailL.xmlやtrailR.xmlに替えて、ファイル中のスモークの発生条件にかかわる<condition>タグの部分を全部削除したAI機のためのスモーク発生用xmlファイルを用意しました。

〔実機の起動ファイル〕

 実機の起動ファイル、ここではp-kikka.xml中でスモーク発生用のxmlファイルを呼び出し実行する部分の<condition>―「スモークを発生させる」の項で、スモークを表示させたくない時のキー操作用にすでにもうけている―は、一切削除します。

〔AI機のxml〕

 実機の起動ファイルをコピーしてAI機用に起動ファイル―ここではp-kikka-ai.xmlをもうけます。AI機用の起動ファイル中のスモークのxmlファイルを呼び出し実行する部分の<condition>にはvelocities/true-airspeed-ktを用います。

[2009/02/14][2009/04/21更新][2018/04/23刷新]

「仮想飛行」(virtual flight) by virt_fly