
↑今回の設定で、画像のように、ミサイルの発射に時間差をもうけることも可能になります。
ロケットの発射までに間をもうけよう
さて、これまでに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用に自作したベトナム戦争を舞台とする北爆シナリオを、完動するようにつくりなおせるかも。