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
}
目次へ戻る