Rigid Chips リファレンスマニュアル モデルデータ SCRIPT考察3-2


目次へ戻る

■SCRIPT考察3-2 「飛行機の製作:自動ギアアップ/ダウン」


◆考え方


ここでは、飛行機の地面からの距離に応じて、自動的にギアアップ/ダウンを行うスクリプトについて紹介します。
チップの地面からの距離は、基本的に関数_H()を使うことで取得することが出来ます。
そこで、_H()で得られた数値が0以上であればギアダウンを行い、マイナス値であれば(鉛直下方10m以内に地面がない場合)ギアアップを行うようにします。


◆実装


//plane
val{
	pitch(default=0,min=-10,max=10,step=1,disp=1)
	roll(default=0,min=-10,max=10,step=1,disp=1)
	yaw(default=0,min=-10,max=10,step=1,disp=1)
	jet(default=0,min=0,max=50000,step=0,disp=1)
gear_angle(default=80,min=80,max=170,step=0,disp=1)
} key{ 0:pitch(step=-1) 1:pitch(step= 1) 2:roll(step= 0.5) 3:roll(step=-0.5) 4:yaw(step=-1) 6:yaw(step= 1) 5:jet(step= 50000) 8:jet(step=-50000) } body{ core(){ n:frame(angle=-20){ n:jet(angle=110,power=jet,effect=1){} } w:chip(){ w:trim(angle=roll){ w:chip(){} } } e:chip(){ e:trim(angle=roll){ e:chip(){} } } s:chip(){ s:chip(){ s:chip(){ w:chip(angle=-90){ s:chip(angle=-yaw){} } e:chip(angle=-90){ s:chip(angle=yaw){} } s:chip(){ w:trim(angle=pitch){} e:trim(angle=-pitch){} } } } } w:frame(angle=10){ w:wheel(angle=gear_angle){} } e:frame(angle=10){ e:wheel(angle=gear_angle){} } } } Lua{
function auto_gear() if(_H(0)>=0) then GEAR_ANGLE=GEAR_ANGLE-5 -- ギアダウン else GEAR_ANGLE=GEAR_ANGLE+5 -- ギアアップ end end
function main()
auto_gear()
-- 表示 out(0,"Up/Down:Pitch, Left/Right:Roll, Z/C:Yaw, X:Jet-On, D:Jet-Off") out(1,"x=",_X(0),", y=",_Y(0),", z=",_Z(0)) out(2,"ax=",math.deg(_AX(0)),", ay=",math.deg(_AY(0)),", ez=",math.deg(_EZ(0))) out(3,"vx=",_VX(0),", vy=",_VY(0),", vz=",_VZ(0)) out(4,"wx=",_WX(0),", wy=",_WY(0),", wz=",_WZ(0)) end }
関数_H()を使うことに気が付けば、実装はさほど難しくなく、上記の通り、比較的単純なスクリプトで実現できます。
注意しなければいけないポイントとしては、関数_H()の動作くらいでしょうか。
ギアアップしたときにWHEELが回転しているのが鬱陶しいので、ギアアップ中はWHEELにブレーキをかけておくスクリプトを、おまけで掲載しておきます。
//plane
val{
	pitch(default=0,min=-10,max=10,step=1,disp=1)
	roll(default=0,min=-10,max=10,step=1,disp=1)
	yaw(default=0,min=-10,max=10,step=1,disp=1)
	jet(default=0,min=0,max=50000,step=0,disp=1)
	gear_angle(default=80,min=80,max=170,step=0,disp=1)
gear_brake(default=0,min=0,max=200,step=0,disp=1)
} key{ 0:pitch(step=-1) 1:pitch(step= 1) 2:roll(step= 0.5) 3:roll(step=-0.5) 4:yaw(step=-1) 6:yaw(step= 1) 5:jet(step= 50000) 8:jet(step=-50000) } body{ core(){ n:frame(angle=-20){ n:jet(angle=110,power=jet,effect=1){} } w:chip(){ w:trim(angle=roll){ w:chip(){} } } e:chip(){ e:trim(angle=roll){ e:chip(){} } } s:chip(){ s:chip(){ s:chip(){ w:chip(angle=-90){ s:chip(angle=-yaw){} } e:chip(angle=-90){ s:chip(angle=yaw){} } s:chip(){ w:trim(angle=pitch){} e:trim(angle=-pitch){} } } } } w:frame(angle=10){ w:wheel(angle=gear_angle,brake=gear_brake){} } e:frame(angle=10){ e:wheel(angle=gear_angle,brake=gear_brake){} } } } Lua{ function gear_updown() if(_H(0)>=0) then GEAR_ANGLE=GEAR_ANGLE-5 -- ギアダウン
GEAR_BRAKE=0
else GEAR_ANGLE=GEAR_ANGLE+5 -- ギアアップ
GEAR_BRAKE=GEAR_BRAKE+10
end end function main() gear_updown() -- 表示 out(0,"Up/Down:Pitch, Left/Right:Roll, Z/C:Yaw, X:Jet-On, D:Jet-Off") out(1,"x=",_X(0),", y=",_Y(0),", z=",_Z(0)) out(2,"ax=",math.deg(_AX(0)),", ay=",math.deg(_AY(0)),", ez=",math.deg(_EZ(0))) out(3,"vx=",_VX(0),", vy=",_VY(0),", vz=",_VZ(0)) out(4,"wx=",_WX(0),", wy=",_WY(0),", wz=",_WZ(0)) end }

目次へ戻る