Virtual flight is a homepage which introduces FlightGear Flight Simulator.

スモーク



   

●飛行機雲やスモークを再現

【コメント】

 FlightGearを最初にホームページでとりあげた頃には、FlightGearの機体で飛行機雲をつくることができたものは、少なかったように思います。リアリティのために、737-300より移植をしたものですが、今ではどうでしょう?
 Ver.1.9.0版以降、今日のFlightGearでは、飛行機雲もスモークもいずれも再現にはparticle systemが使われています。歴史的使命を終えた従来の飛行機雲発生についての記述は削除し、ここではパーティクルシステムによるスモークの再現についてのみ記述することにします。

 particle systemは、スモークの発生だけでなく、dust、sprayなどの再現も可能。以下は、me262にならって他の機体―p-kikka(もともとは旧バージョンのme262)でも排気ガスを再現してみた記録です。

 参考にしたme262では、驚いたことに、smoke.pngは存在するものの、3Dモデルーsmoke.acはみつけられません。どうやらそこが従来のスモークを超える良さの所以なのかも知れません。逆に言えば、acファイルが存在しないため、submodelsを記述してスモークを発生させるわけにはいかないということ。このことは、Ver.1.0.0上でsubmodelsを用いて再現させていたミサイルのスモークの発生を、どう実現するかにかかわる個人的に大問題です。ですが、起動時に指定する機体のxml(ここではp-kikka.xml)ファイルから、スモークのxmlファイル(ここではtrailL.xmlやtrailR.xml)を呼び出しスモークを発生させていることで、従来の方法ではできなかったリアルなミサイルのスモークや、AI機のスモークの発生が可能になっています(別項参照)。

 さてモデルにしたme262では黒い飛行機雲様の排気ガスが発生させますが、きれいな青空には似つかわしくありません。薄い白い排気ガスで、Ver.1.9.0では再現できなくなった排気ガスによる大気の揺らぎの再現のかわりにしたいと考え、trailL.xmlやtrailR.xmlファイル中のparticlesystemの記述をいろいろ変えてみました。

 色は<color>で、サイズは<size>で、いずれもstartとendがあって変化させられます。発生するスモークの間隔は<particles-per-sec>で、スモークの寿命は<life-sec>の値を変えてやります。他に、スモークを発生させる条件を指定した<condituion>があります。参考にしたme262で、エンジンの状態―何を示すのかよくわからないーが一定値以上、高度が一定値以下の場合に発生するように記述されていたのを、そのまま使いました(注参照)。

 なお、排気ガスを発生させたり止めたりできるよう、eとshift+Eキーにこの役割を担わせることにしました。baseやsetなどの関連するxmlファイルに<key>を記述します。同時にtrailL.xmlやtrailR.xmlファイルを呼び出す機体のxmlファイルに<condition>を記述します。ここでは-set.xmlファイルで指定したcontrols/smokeを<property>に使いました。思えば、スモークの発生を指定する<condition>は、呼び出されるxmlファイル中でも、呼び出す側の機体のxmlファイル中でも、どちらでもよいということ。ただし、マルチプレイヤーの相手機にスモークをひかせる場合は、不都合があるようです。

 

smoke
↑ここでの方法を応用してアクロバチックなスモークを発生させてみた


注記)スモークの発生条件は、エンジンが一定動きだし、ある程度の高度に達するまでを条件に、排気ガスを再現するようにしているようです。と言うことは、一定高度以上を条件に白いスモークを出すように記述したxmlファイルを別に用意すれば、ある高度に達したら排気ガスに変わって今度は飛行機雲が再現できることになります。

【実際】

[必要ファイルのコピー]

 Me262の新バージョンから、smoke.png、trailL.xml、trailR.xmlをコピーしてきて、Aircraft/p-kikka/Models/effects/下に置きます。

[機体のxmlファイルへの記述の追加]

 ここではp-kikka.xmlに次の記述を追加します。ただし2つあるうちの左エンジンの例のみ示します。赤色の部分はme262.xmlとの相違点。

 <model>
  <path>Aircraft/p-kikka/Models/effects/trailL.xml</path>
   <condition>  ←以下6行はスモークを表示させたくない時のキー操作用(なくても可)
    <equals>
     <property>controls/smoke</property>
     <value>1</value>
    </equals>
   </condition>

  <offsets>
   <x-m>0.478</x-m>  ←以下3行は左エンジン噴射口の位置を指定
   <y-m>-1.860</y-m>  ←右エンジンでは符号が逆に
   <z-m>-0.693</z-m>
   <roll-deg>0.000</roll-deg>
   <pitch-deg>0.000</pitch-deg>
   <heading-deg>0.000</heading-deg>
  </offsets>
 </model>


[trailL.xmlの例]

 ここでは左側エンジンの例のみ示しますす。赤色の部分は、me262のそれとの違い。

 <?xml version="1.0" ?>
 <PropertyList>
  <particlesystem>
   <name>smoke</name>
   <offsets>
    <x-m>0.0</x-m>
    <y-m>0.0</y-m>
    <z-m>0.0</z-m>
    <roll-deg>0.000</roll-deg>
    <pitch-deg>0.000</pitch-deg>
    <heading-deg>0.000</heading-deg>
   </offsets>
   <texture>smoke.png</texture>
   <emissive type="bool">false</emissive>  ←trueでスモークが光ります
   <lighting type="bool">false</lighting>
   <condition>  ←以下12行では、スモークを生成させる条件を設定
    <and>
     <greater-than>
      <property>/engines/engine[0]/n1</property>   ←右エンジンだとここはengine[1]となる
      <value>50</value>  ←エンジンの何かの値が50以上、かつ
     </greater-than>
     <less-than>
      <property>position/altitude-agl-ft</property>
      <value>12000</value>  ←高度が12000ft以下
     </less-than>
    </and>
   </condition>
   <attach>world</attach>
   <placer>
    <type>point</type>
   </placer>
   <shooter>
    <theta-min-deg>-1.5</theta-min-deg>
    <theta-max-deg>1.5</theta-max-deg>
    <phi-min-deg>-1.5</phi-min-deg>
    <phi-max-deg>1.5</phi-max-deg>
    <speed-mps>
     <value>0</value>
     <spread>0</spread>  ←スモークの生成位置がアバウトになるようです
    </speed-mps>
    <rotation-speed>
     <x-min-deg-sec>0</x-min-deg-sec>
     <y-min-deg-sec>0</y-min-deg-sec>
     <z-min-deg-sec>0</z-min-deg-sec>
     <x-max-deg-sec>0</x-max-deg-sec>
     <y-max-deg-sec>0</y-max-deg-sec>
     <z-max-deg-sec>0</z-max-deg-sec>
    </rotation-speed>
   </shooter>
   <counter>
    <particles-per-sec>
     <value>35</value>
     <spread>0</spread>  ←スモークの生成位置がアバウトになるようです
    </particles-per-sec>
   </counter>
   <align>billboard</align>
   <particle>
    <start>  ←以下の11行では、スモークの生成時の色や濃さ、大きさを指定しています
     <color>
      <red><value>0.3</red>
      <green><value>0.3</value></green>
      <blue><value>0.3</value></blue>
      <alpha><value>0.1</value></alpha>
     </color>
     <size>
      <value>0.25</value>
     </size>
    </start>
    <end>  ←以下の11行では、スモークの消滅時の色や濃さ、大きさを指定しています
     <color>
      <red><value>0.9</value></red>
      <green><value>0.9</value></green>
      <blue><value>0.9</value></blue>
      <alpha><value>0.1</value></alpha>
     </color>
     <size>
      <value>2</value>
     </size>
    </end>
    <life-sec>
     <value>3</value>  ←大きいほどスモークの寿命は長くなり、飛行機雲のように尾を引くことに
    </life-sec>
    <mass-kg>0.5</mass-kg>  ←値が大きければスモークは立ちのぼります
    <radius-m>0.5</radius-m>
   </particle>
   <program>
    <fluid>air</fluid>
    <gravity type="bool">true</gravity>
    <wind typ="bool">true</wind>
   </program>
  </particlesystem>
 </PropertyList>


[2009/02/11][2009/04/21更新][2012/12/01更新][2018/04/23刷新]


   

●ミサイルにロケットエンジンの光とスモークを(パーティクルシステムを使わず)

【コメント】

 元々この項では、しつこくミサイルの話とりあげたことについて、飛行機本体はジェット噴射でエンジンの噴射口が白熱しまた飛行機雲をひくのに、発射したミサイルのロケットエンジンは光を放たずスモークをひかないというのは、どうにもつりあいがとれず気になって、と言い訳ではじまっていました。パーティクルシステムを使わないスモークの例でしたが、白熱光の再現かたがた、せっかくですから記録を残しておきます。

 まず、一つ目の問題はロケットエンジンの白熱光ですが、これは機体に飛行灯を灯す要領で光らせるにしても、発射されてから光らせなければなりません。少々強引な感じですが、光を灯す<animation>中の<condition>の設定で、何とかクリア。
 次いで、スモークについては、本体から分離され移動中のパーツにスモークを発生させることができるのかが問題となりますが、少々これは荷がかちすぎ、結局スモークの発生とミサイルの発射の記述が類似していることに着目して、ミサイルの発射に準じてスモークを発射させこれを繰り返させることで擬似的に実現することにしました。ただしこれだと、ミサイルの発射直後に機体の向きを変えるとこれに合わせてミサイルの航跡が変化してしまうので、目立たないようスモークは短くすぐ消えるようにしておく必要があります。
 困ったのは、ロケットエンジンを光らせるようにしてもスモークがこれを覆い隠してしまい、スモークを薄くすると今度はミサイルの航跡が目立たぬものになってしまうこと。他に解決策を講じる能力がないので、ここは我慢できる範囲で折り合いを着けるしかありませんでした。

 なお、生来のうっかり者のため、FlightGearの多数の機体の中には探せばひょっとすればスモークをひくミサイルを発射できる機体があるかもしれないことに気が付いていませんでした。今さらながらのことですが、そうした機体を参考にできればもっとましなものができたかもしれません。

contrail↑かなりリアルに見えるのですが‥・
次の項の画像と見比べてください

incandescence
発射されたミサイルにロケットエンジンの光↑


【実際】

〔前提〕

・ミサイルの搭載、発射に関しては、すでに「ミサイルを搭載-発射音つきで」の項で述べていますので、ここでは変更点、追加部分のみ記します。

〔ロケットエンジンの発光〕

・3DモデリングソフトBlenderを用い、ミサイルの3Dモデル(/p-kikka/models/missile.ac)の後部にノズルに見立てた円錐を新たにもうけ、これを光らせることにします。オブジェクト名はCone。
・ロケットエンジンを光らせるため、ミサイルのxmlファイルに記述を追加し、左右両翼のミサイルごとにxmlファイルをもうけます。下記は右翼のミサイルのxmlファイル(/p-kikka/models/missiler.xml)の例。

 <?xml version="1.0"?>
 <PropertyList>
  <path>missile.ac</path>
   <animation>
    <type>material</type>
    <object-name>Cone</object-name>
     <condition>
     <greater-than>
     <property>/controls/armament/station[2]/missiles</property>
     <value>0</value>
     </greater-than>
     </condition>
    <emission>
     <red>1</red>
     <green>1</green>
     <blue>1</blue>
    </emission>
   </animation>

 </PropertyList>


〔スモーク〕

・スモークについては、OV-10から/OV10/Models/USAFE/ExternalSystems以下をコピーして借用。
・上に述べた理由で、OV-10オリジナルのスモークの画像(puff.rgb)を特に外側に行くほど薄めに(透過度を高く)作り直し、都合でpuff2.rgbとあらためました。puff.acもpuff2.acに。
・OV10オリジナルのsmoke.xmlを以下の記述だけ残し大幅に削除し、ここではmissile_smoke.xmlとしました。

 <?xml version="1.0"?>
 <PropertyList>
  <path>puff2.ac</path>
  <animation>
   <type>billboard</type>
   <spherical>true</spherical>
  </animation>
 </PropertyList>


・/p-kikka/submodels.xmlに以下の記述を追加(右翼のミサイル用)。
 追記)<buoyancy>が有効に使えることがわかり、これを加えてミサイルの飛距離を延ばし、関係箇所を修正したのが矢印の部分。

 <?xml version="1.0" ?>
 <PropertyList>
     (略)
  <submodel>
   <name>rocket-smoke1</name>
   <model>Aircraft/p-kikka/Models/ExternalSystems/EngineSmoke/missile_smoke.xml</model>
   <trigger>controls/armament/station[2]/missiles</trigger>
    <speed>8301000</speed>
  ←500に.すぐに落下することがなくなったので
    <repeat>true</repeat>
    <delay>0.01</delay>
    <count>16</count>
  ←10に.<life>を増やしたので機体の向きの変化の影響を抑えます
    <x-offset>-1.4225</x-offset>
    <y-offset>11.1046</y-offset>
    <z-offset>-1.775</z-offset>
    <yaw-offset>0</yaw-offset>
    <pitch-offset>1</pitch-offset>
  ←0に.すぐに落下することがなくなったので
    <eda>0.000001</eda>
    <buoyancy>32</buoyancy>
  ←<buoyancy>を追加し、スモークも飛距離を延ばします
    <wind>false</wind>
    <life>1</life>
  ←5に.飛距離が延びたのにスモークがついていかないので
  </submodel>

     (略)
 </PropertyList>


[2008/09/01][2008/09/21追加][2012/12/01更新][2018/04/23刷新]


   

●ミサイルのロケットエンジンにスモークを(パーティクルシステムを使って)

【コメント】

 FlightGear Ver.1.0.0上のp-kikka(me262改)では、submodelsでミサイルの発射を実現し、同じくsubmodelsでスモークを発射することで、擬似的にミサイルのスモークを再現していました。しかし、Ver.1.9.0上ではミサイルは発射できても、スモークはacファイルの存在しないparticle systemをsubmodelsで使えません。

 しかし、エンジンの排気ガスは、起動時に指定する機体のxmlファイル(いわゆる3Dモデル設定ファイル、ここではp-kikka.xml)からスモークのxmlファイル(trailL.xmlやtrailR.xml)を呼び出し、スモークを発生させており、これに見習ってミサイルのxmlファイル中にスモークのxmlファイル―ここではtrailL.xmlやtrailR.xmlに準じてrocket_smoke.xmlを用意―を呼び出し実行させるように記述してみたところ、無事、ミサイル自身にスモークを発生させて飛ばすことができました。ここは従来のスモークの再現方法では実現できなかった、particle systemならではのあなどれないところ。擬似的にスモークを引かせていたver.1.0.0上では、ミサイル発射直後に機体の向きを変えると、ミサイルの航跡はおかしく曲がってしまっていたものですが、ミサイル自身がスモークを発生できるようになって、リアルできれいな航跡が実現できました。

 なお、ミサイルは発射ボタンが押されてはじめてロケットモーターがスモークを発生するわけですから、ミサイルのxmlファイル中でrocket_smoke.xmlを呼び出し実行させる項に、ミサイル発射の<property>/controls/armament/station[n]/missilesを条件とした<condition>を記述しました。

 

smoke
↑よりリアル! 前出の画像とは明らかな違い


【実際】

〔前提〕

 ミサイルの搭載、発射に関しては、すでに「ミサイルを搭載-発射音つきで」の項で述べていますので、必要とあらばそちらを参照ください。
 また、パーティクルシステムを使わずにミサイルのスモークを再現する方法は、前項に述べたとおりです。ここではパーティクルシステムを使って再現するにあたって、前項からの変更点を記述することにします。

〔submodels.xml〕

 ミサイルの発射を記述したsubmodels.xml中の擬似的にミサイルのスモークを発生させる部分―前項に示したsubmodels.xml中の記述―を全面的に削除します。
 発射に関する部分は、そのまま残し利用します。

〔ミサイルのxmlファイル〕

 ミサイルのxmlファイル、ここでは従来のmissilel.xmlとmissiler.xmlを一部変更して使用します。変更点は、particlesystem を記述した新たなスモークのxmlファイル、ここではrocket_smoke.xmlをパス指定し、発射ボタンが押されたら実行するという条件設定と実行位置の記述の追加です。以下にmissilel.xmlへの追加部分を赤色で示します。

 <?xml version="1.0"?>
 <PropertyList>
  <path>missile.ac</path>
      <略>
   <model>
    <path>Aircraft/p-kikka/Models/effects/rocket_smoke.xml</path>
    <condition>
     <equals>
      <property>/controls/armament/station[3]/missiles</property>
      <value type="bool">1</value>
     </equals>
    </condition>
    <offsets>
     <x-m>0.0</x-m>
     <y-m>-0.0</y-m>
     <z-m>-0.0</z-m>
     <roll-deg>0.000</roll-deg>
     <pitch-deg>0.000</pitch-deg>
     <heading-deg>0.000</heading-deg>
    </offsets>
   </model>


〔rocket_smoke.xml〕

 rocket_smoke.xmlは、「パーティクルシステムでスモーク」の項で紹介したパーティクルシステムを記述したtrailL.xmlファイルを基本としたもの.条件設定についてはミサイル発射ボタンが押されたらスモークを発生するというのが唯一の条件であり、すでに外部のミサイルxmlファイル中で設定済みのため、当初は条件設定を不要と見なして<condition>タグの部分を全部削除していました。その後、ミサイルを発射するとAI機のミサイルもみな一斉にスモークを吐きはじめることがわかり、修正が必要になりました。良い方法が見つからないため、rocket_smoke.xml中に誤った条件を記述することで強引に回避していますが、とても正しい方法とはいえないので紹介することはしないでおきます。

 なお、他にrocket_smoke.xmlファイルをいじるとすれば、色や大きさなど。rocket_smoke.xmlとsmoke.pngは/Aircraft/p-kikka/Models/effect/ディレクトリ下におきます。

[2009/02/11][2009/03/30更新][2012/12/01更新][2018/04/23刷新]

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