virt_flyのブログ -164ページ目

virt_flyのブログ

フライトシミュレーターソフトのFlightGearで仮想飛行を楽しむブログです。

イメージ 1

 

とりあえずまたミサイルが飛ぶようになった北爆シナリオ


  動かなくなった北爆シナリオのSAMにかえて、とりあえず今回Nasalで打ち上げられるようになったミサイルを、使ってみることにしました。

  シーナリーのタイルに書き込むのからすれば、かなり面倒ですが、しかたありません。ミサイルとランチャー、サイトの関連装置を含め、AIシナリオを記述します。
  もちろん、Vietnam-War-intercept-2.xmlに書き足すのですが、多少大変なので、発射するミサイル数は以前のものより減らしちゃいました。

  なお、ミサイルや関連装置など3Dオブジェクトは、今回はシーナリーの中には置かず、/AI/Aircraft中にもうけたnewSA-2ディレクトリに置くようにしました。目玉のNasalファイル(rocket_launch.nas.xml)もここに置きます。
 

イメージ 2


  曲がりなりにも動いていますが…。書き換えるとなぜか動かなくなる部分があって(^_^?)

  プログラム的にはお粗末で、ミサイルの1段目の切り離しのアーキテクチュアは、高度を基準にするといういい加減なことをしているのに加え、目標高度に到達したミサイルを消滅させるのに、selectを用い非表示にすることにしました。が、これでは、HUDでターゲットをマークする機能をもった機体で見ると、消滅したはずのミサイルのマークがいつまでも表示されたままになりますm(_ _)m
  いずれにしても、フレキシブルじゃないので、条件が変わると色々設定をいじらなければならなくなって大変そうなところも問題のプログラムです。

  テスト版だとして公開したものか、悩みます。別にミサイルが飛ばないだけで他に変わりは何もなく、従来の北爆シナリオのままでも、MiG機と米軍機との空戦は楽しめるのですから。

イメージ 1
↑今回の設定で、画像のように、ミサイルの発射に時間差をもうけることも可能になります。

 

ロケットの発射までに間をもうけよう

 

  さて、これまでにAIロケットをNasalプログラムにて、他に悪影響を及ぼすこともなく、打ち上げることができるようにしてきました。

  ただ、このままだとFlightGearを起動したら、すでにAIロケットが自動的に発射されてしまっています。AIシナリオを使うことなどを思えば、コントロールとはいわずとも、せめて発射のタイミングくらいはこちらで設定したいものです。

  結果的には、rocket_launch.nas.xmlにて、/sim/time/elapsed-secを用いているのを利用し、起動後の一定秒数の間は位置変化を0にして初期位置座標のままに置いておくことで、発射までの時間稼ぎにかえ、記述も整理しました。

【rocket_launch.nas.xmlの修正】

  赤字で示した部分が、今回変更した箇所です。secの数値を変えることでAIロケットの発射までの間を変更できます。
 

<?xml version="1.0"?>

<PropertyList>
   <load><![CDATA[

    var rocket_speed = 70;
    var rocket_pitch =30;
    var rocket_dir =70;

     #print ("rocket_speed:" , rocket_speed);
     #print ("rocket_pitch:" , rocket_pitch);

    var vertical_change =math.sin(rocket_pitch*math.pi / 180.0)*rocket_speed;
     var horizontal_change =math.cos(rocket_pitch*math.pi / 180.0)*rocket_speed;
     #print ("vertical_change:" , vertical_change);
     #print ("horizontal_change:" , horizontal_change);
     #print ("rocket_dir:" , rocket_dir);
    var latche = math.cos(rocket_dir*math.pi / 180.0)*horizontal_change;
    var lonche = math.sin(rocket_dir*math.pi / 180.0)*horizontal_change;

   var rocket_launch = func {
    var sec = getprop("/sim/time/elapsed-sec");
    var property_alt=getprop("/ai/models/tanker[0]/position/altitude-ft");
    if (property_alt==nil){
    var oldalt=0;
    }else{
    var oldalt=getprop("/ai/models/tanker[0]/position/altitude-ft");
    }
    var property_lat=getprop("/ai/models/tanker[0]/position/latitude-deg");
    if (property_lat==nil){
    var oldlat=0;
    }else{
    var oldlat=getprop("/ai/models/tanker[0]/position/latitude-deg");
    }
    var property_lon=getprop("/ai/models/tanker[0]/position/longitude-deg");
    if (property_lon==nil){
    var oldlon=0;
    }else{
    var oldlon=getprop("/ai/models/tanker[0]/position/longitude-deg");
    }

    if (sec <40){   ここの数値で発射までの間を設定している
    var newalt = 0+oldalt;
    var newlat = 0+oldlat;
    var newlon = 0+oldlon;
    }else{
    var newalt = vertical_change*3.2808+oldalt;
    var newlat = latche*360.0/40000000+oldlat;
    var newlon = lonche*360.0/(math.cos(newlat*math.pi / 180.0)*40000000)+oldlon;
    }

     #print("speed:",speed," newalt:" , newalt," newlat:" , newlat," newlon:" , newlon);
   interpolate("/ai/models/tanker[0]/position/altitude-ft", newalt, 1);
   interpolate("/ai/models/tanker[0]/position/latitude-deg", newlat, 1);
   interpolate("/ai/models/tanker[0]/position/longitude-deg", newlon, 1);
   settimer(func { rocket_launch(); }, 0.1 );
}
_setlistener("/sim/signals/fdm-initialized", func { rocket_launch(); });

   ]]></load>
</PropertyList>



【SA-2.xmlの修正】

  発射まで間を持たせたことで、しばらく発射台の上にとどまるロケット(ミサイル)のエンジンは、まだ点火されていませんからスモークがでていては困ります。何らかの条件設定により、スモークを発生させないように、ロケットのxmlも修正が必要です。
  他によい方法が思い当たらないので、高度を条件にすることにしました。そのためAIシナリオで配置したロケットの位置を高さで上回れば、発射されたとみなしてスモークを発生させることにしたものです。
 

<?xml version="1.0"?>
<PropertyList>
<path>/Models/SA-2org.ac</path>
<?xml version="1.0"?>
<PropertyList>
<path>/Models/SA-2org.ac</path>
    <offsets>
      <x-m> 0 </x-m>
      <y-m> 0.0 </y-m>
      <z-m> 0 </z-m>
      <roll-deg>    0.000 </roll-deg>
      <pitch-deg>   22.000 </pitch-deg>
      <heading-deg> 0.000 </heading-deg>
    </offsets>
  <model>
    <path>rocket_smoke.xml</path>
       <condition>
       <greater-than>
       <property>/ai/models/tanker[0]/position/altitude-ft</property>
        <value>22</value>

        </greater-than>
        </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>   30.000 </pitch-deg>
      <heading-deg> 0.000 </heading-deg>
    </offsets>
  </model>

  <nasal include="rocket_launch.nas.xml"/>

</PropertyList>


  ここまでくれば、Bombable用に自作したベトナム戦争を舞台とする北爆シナリオを、完動するようにつくりなおせるかも。

イメージ 1
↑Nasalプログラムはxmlに書き出すことで、それを読み出すAIオブジェクトにのみ、その働きが及ぶのを限定することができます。なお、Nasalプログラム中で複数の設定を記述すれば、画像の様に複数のミサイルの発射も可能です。

 

-nas.xmlで問題回避

 

  一応、Nasalを用いてAIロケットを打ち上げることができましたので、nasファイルが他のAI機に(今回はtanker)にまで影響を及ぼさないように、対策を考えることにしましょう。

  FGルート直下のNasalディレクトリに置かれたNasalプログラムは常に機能し、他のシツエーションの場合にあっても、AI機など該当するものがあれば、影響が及びます。
  今回の例で言えば、ミサイルの<type>をtankerにしましたから、給油機を扱うAIシナリオでは、あらぬ方向へ給油機が吹っ飛んで行くんじゃないでしょうか。

  それを避けるには、NasalプログラムをNasalディレクトリに置かない方法を考えるべきかと試行錯誤。そして、-nas.xmlファイルに行き当たりました。

  Nasalプログラムを記述したxmlファイルですから、常に機能するわけでなく、当該AI機なりtankerのxmlファイルで指定しておいて、はじめて機能するもの。他のAIシナリオには、併用でもしない限り影響は及びません。p(^_^)q

  以下に、-nas.xmlとAIミサイルのxmlを例として示します。

 【rocket_launch.nas.xml】 

  なお、一点だけ注意事項があります。AIシナリオに配置を記述した当該ミサイルが何番目のAI機(tanker)かで、rocket_launch.nas.xml中に指定するAI機(tanker)のナンバーを変えてやらねばなりません。これを間違うととんでもない機体がすっ飛んで行くことになります。
  ここの例では、AIシナリオの一番目に記述したtankerを当該ミサイルとすることを前提にして、”0”の数字(赤字で示す部分)を振っています。もし2番目なら”1”、3番目なら”2”…。
 

<?xml version="1.0"?>

<PropertyList>
  <load><![CDATA[
    var rocket_speed = 70;
    var rocket_pitch =30;
    var rocket_dir =70;

      #print ("rocket_speed:" , rocket_speed);
      #print ("rocket_pitch:" , rocket_pitch);

     var vertical_change =math.sin(rocket_pitch*math.pi / 180.0)*rocket_speed;
     var horizontal_change =math.cos(rocket_pitch*math.pi / 180.0)*rocket_speed;
      #print ("vertical_change:" , vertical_change);
      #print ("horizontal_change:" , horizontal_change);
      #print ("rocket_dir:" , rocket_dir);
     var latche = math.cos(rocket_dir*math.pi / 180.0)*horizontal_change;
     var lonche = math.sin(rocket_dir*math.pi / 180.0)*horizontal_change;

var rocket_launch = func {
     var sec = getprop("/sim/time/elapsed-sec");
     var property_alt=getprop("/ai/models/tanker[0]/position/altitude-ft");
     if (property_alt==nil){
      var oldalt=0;
     }else{
      var oldalt=getprop("/ai/models/tanker[0]/position/altitude-ft");
     }
     var newalt = vertical_change*3.2808+oldalt;
     var property_lat=getprop("/ai/models/tanker[0]/position/latitude-deg");
     if (property_lat==nil){
      var oldlat=0;
     }else{
      var oldlat=getprop("/ai/models/tanker[0]/position/latitude-deg");
     }
     var newlat = latche*360.0/40000000+oldlat;
     var property_lon=getprop("/ai/models/tanker[0]/position/longitude-deg");
     if (property_lon==nil){
      var oldlon=0;
     }else{
      var oldlon=getprop("/ai/models/tanker[0]/position/longitude-deg");
     }
    var newlon = lonche*360.0/(math.cos(newlat*math.pi / 180.0)*40000000)+oldlon;
     #print ("newalt:" , newalt," newlat:" , newlat," newlon:" , newlon);
     interpolate("/ai/models/tanker[0]/position/altitude-ft", newalt, 1);
     interpolate("/ai/models/tanker[0]/position/latitude-deg", newlat, 1);
     interpolate("/ai/models/tanker[0]/position/longitude-deg", newlon, 1);
   settimer(func { rocket_launch(); }, 0.1 );
   } 

_setlistener("/sim/signals/fdm-initialized", func { rocket_launch(); });
]]></load>

</PropertyList>


【SA-2.xml】

  以下に示すAIミサイルのxmlファイルは、スモークを曳くだけのシンプルなもの。末尾の赤字で示す部分に-nas.xmlの指定を付け加えています。
 

<?xml version="1.0"?>
<PropertyList>
<path>/Models/SA-2.ac</path>
   <offsets>
    <x-m> 0 </x-m>
     <y-m> 0.0 </y-m>
     <z-m> 0 </z-m>
     <roll-deg> 0.000 </roll-deg>
     <pitch-deg> 30.000 </pitch-deg>
     <heading-deg> 0.000 </heading-deg>
   </offsets>
   <model>
   <path>rocket_smoke.xml</path>
    <offsets>
     <x-m> 7.0 </x-m>
     <y-m> -0.0 </y-m>
     <z-m> -0.0 </z-m>
     <roll-deg> 0.000 </roll-deg>
     <pitch-deg> 30.000 </pitch-deg>
     <heading-deg> 0.000 </heading-deg>
   </offsets>
   </model>

  <nasal include="rocket_launch.nas.xml"/>

</PropertyList>