// Plane Ver4 x7 val{ pitch_1(default=0,min=-5,max=5,step=0,disp=0) roll_1(default=0,min=-5,max=5,step=0,disp=0) rolls_1(default=90,min=85,max=95,step=0,disp=0) yaw_1(default=0,min=-5,max=5,step=0,disp=0) jet_1(default=0,min=-50000,max=50000,step=0,disp=0) shot_1(default=0,min=0,max=5000,step=0,disp=0) col_1(default=#ffffff,disp=0) dmp_1(default=1,disp=0) spr_1(default=1,disp=0) pitch_2(default=0,min=-5,max=5,step=0,disp=0) roll_2(default=0,min=-5,max=5,step=0,disp=0) rolls_2(default=90,min=85,max=95,step=0,disp=0) yaw_2(default=0,min=-5,max=5,step=1,disp=0) jet_2(default=0,min=-50000,max=50000,step=0,disp=0) shot_2(default=0,min=0,max=5000,step=0,disp=0) col_2(default=#0000ff,disp=0) dmp_2(default=1,disp=0) spr_2(default=1,disp=0) pitch_3(default=0,min=-5,max=5,step=0,disp=0) roll_3(default=0,min=-5,max=5,step=0,disp=0) rolls_3(default=90,min=85,max=95,step=0,disp=0) yaw_3(default=0,min=-5,max=5,step=1,disp=0) jet_3(default=0,min=-50000,max=50000,step=0,disp=0) shot_3(default=0,min=0,max=5000,step=0,disp=0) col_3(default=#00ff00,disp=0) dmp_3(default=1,disp=0) spr_3(default=1,disp=0) pitch_4(default=0,min=-5,max=5,step=0,disp=0) roll_4(default=0,min=-5,max=5,step=0,disp=0) rolls_4(default=90,min=85,max=95,step=0,disp=0) yaw_4(default=0,min=-5,max=5,step=1,disp=0) jet_4(default=0,min=-50000,max=50000,step=0,disp=0) shot_4(default=0,min=0,max=5000,step=0,disp=0) col_4(default=#00ffff,disp=0) dmp_4(default=1,disp=0) spr_4(default=1,disp=0) pitch_5(default=0,min=-5,max=5,step=0,disp=0) roll_5(default=0,min=-5,max=5,step=0,disp=0) rolls_5(default=90,min=85,max=95,step=0,disp=0) yaw_5(default=0,min=-5,max=5,step=1,disp=0) jet_5(default=0,min=-50000,max=50000,step=0,disp=0) shot_5(default=0,min=0,max=5000,step=0,disp=0) col_5(default=#ff0000,disp=0) dmp_5(default=1,disp=0) spr_5(default=1,disp=0) pitch_6(default=0,min=-5,max=5,step=0,disp=0) roll_6(default=0,min=-5,max=5,step=0,disp=0) rolls_6(default=90,min=85,max=95,step=0,disp=0) yaw_6(default=0,min=-5,max=5,step=1,disp=0) jet_6(default=0,min=-50000,max=50000,step=0,disp=0) shot_6(default=0,min=0,max=5000,step=0,disp=0) col_6(default=#ff00ff,disp=0) dmp_6(default=1,disp=0) spr_6(default=1,disp=0) pitch_7(default=0,min=-5,max=5,step=0,disp=0) roll_7(default=0,min=-5,max=5,step=0,disp=0) rolls_7(default=90,min=85,max=95,step=0,disp=0) yaw_7(default=0,min=-5,max=5,step=1,disp=0) jet_7(default=0,min=-50000,max=50000,step=0,disp=0) shot_7(default=0,min=0,max=5000,step=0,disp=0) col_7(default=#ffff00,disp=0) dmp_7(default=1,disp=0) spr_7(default=1,disp=0) } /////////////////////////////////////////////////////////////////////////////// key{ } /////////////////////////////////////////////////////////////////////////////// body{ core(name=c_1,color=col_1){ n:arm(angle=pitch_1,option=5000,power=shot_1,spring=spr_1,damper=dmp_1,color=col_1){ w:trim(angle=roll_1,spring=spr_1,damper=dmp_1,color=col_1){ e:trimf(angle=rolls_1,option=1,spring=spr_1,damper=dmp_1,color=col_1){ n:jet(angle=180,power=jet_1,effect=1,spring=spr_1,damper=dmp_1,color=col_1){ } } } e:trim(angle=roll_1,spring=spr_1,damper=dmp_1,color=col_1){ } } n:trim(angle=90,spring=spr_1,damper=dmp_1,color=col_1){ s:chip(angle=yaw_1,spring=spr_1,damper=dmp_1,color=col_1){ } } //---------------------------------------------------------------------------// n:chip(name=c_2,color=col_2){ n:arm(angle=pitch_2,option=5000,power=shot_2,spring=spr_2,damper=dmp_2,color=col_2){ w:trim(angle=roll_2,spring=spr_2,damper=dmp_2,color=col_2){ e:trimf(angle=rolls_2,option=1,spring=spr_2,damper=dmp_2,color=col_2){ n:jet(angle=180,power=jet_2,effect=1,spring=spr_2,damper=dmp_2,color=col_2){ } } } e:trim(angle=roll_2,spring=spr_2,damper=dmp_2,color=col_2){ } } n:trim(angle=90,spring=spr_2,damper=dmp_2,color=col_2){ s:chip(angle=yaw_2,spring=spr_2,damper=dmp_2,color=col_2){ } } } //---------------------------------------------------------------------------// n:chip(name=c_3,color=col_3){ n:arm(angle=pitch_3,option=5000,power=shot_3,spring=spr_3,damper=dmp_3,color=col_3){ w:trim(angle=roll_3,spring=spr_3,damper=dmp_3,color=col_3){ e:trimf(angle=rolls_3,option=1,spring=spr_3,damper=dmp_3,color=col_3){ n:jet(angle=180,power=jet_3,effect=1,spring=spr_3,damper=dmp_3,color=col_3){ } } } e:trim(angle=roll_3,spring=spr_3,damper=dmp_3,color=col_3){ } } n:trim(angle=90,spring=spr_3,damper=dmp_3,color=col_3){ s:chip(angle=yaw_3,spring=spr_3,damper=dmp_3,color=col_3){ } } } //---------------------------------------------------------------------------// n:chip(name=c_4,color=col_4){ n:arm(angle=pitch_4,option=5000,power=shot_4,spring=spr_4,damper=dmp_4,color=col_4){ w:trim(angle=roll_4,spring=spr_4,damper=dmp_4,color=col_4){ e:trimf(angle=rolls_4,option=1,spring=spr_4,damper=dmp_4,color=col_4){ n:jet(angle=180,power=jet_4,effect=1,spring=spr_4,damper=dmp_4,color=col_4){ } } } e:trim(angle=roll_4,spring=spr_4,damper=dmp_4,color=col_4){ } } n:trim(angle=90,spring=spr_4,damper=dmp_4,color=col_4){ s:chip(angle=yaw_4,spring=spr_4,damper=dmp_4,color=col_4){ } } } //---------------------------------------------------------------------------// n:chip(name=c_5,color=col_5){ n:arm(angle=pitch_5,option=5000,power=shot_5,spring=spr_5,damper=dmp_5,color=col_5){ w:trim(angle=roll_5,spring=spr_5,damper=dmp_5,color=col_5){ e:trimf(angle=rolls_5,option=1,spring=spr_5,damper=dmp_5,color=col_5){ n:jet(angle=180,power=jet_5,effect=1,spring=spr_5,damper=dmp_5,color=col_5){ } } } e:trim(angle=roll_5,spring=spr_5,damper=dmp_5,color=col_5){ } } n:trim(angle=90,spring=spr_5,damper=dmp_5,color=col_5){ s:chip(angle=yaw_5,spring=spr_5,damper=dmp_5,color=col_5){ } } } //---------------------------------------------------------------------------// n:chip(name=c_6,color=col_6){ n:arm(angle=pitch_6,option=5000,power=shot_6,spring=spr_6,damper=dmp_6,color=col_6){ w:trim(angle=roll_6,spring=spr_6,damper=dmp_6,color=col_6){ e:trimf(angle=rolls_6,option=1,spring=spr_6,damper=dmp_6,color=col_6){ n:jet(angle=180,power=jet_6,effect=1,spring=spr_6,damper=dmp_6,color=col_6){ } } } e:trim(angle=roll_6,spring=spr_6,damper=dmp_6,color=col_6){ } } n:trim(angle=90,spring=spr_6,damper=dmp_6,color=col_6){ s:chip(angle=yaw_6,spring=spr_6,damper=dmp_6,color=col_6){ } } } //---------------------------------------------------------------------------// n:chip(name=c_7,color=col_7){ n:arm(angle=pitch_7,option=5000,power=shot_7,spring=spr_7,damper=dmp_7,color=col_7){ w:trim(angle=roll_7,spring=spr_7,damper=dmp_7,color=col_7){ e:trimf(angle=rolls_7,option=1,spring=spr_7,damper=dmp_7,color=col_7){ n:jet(angle=180,power=jet_7,effect=1,spring=spr_7,damper=dmp_7,color=col_7){ } } } e:trim(angle=roll_7,spring=spr_7,damper=dmp_7,color=col_7){ } } n:trim(angle=90,spring=spr_7,damper=dmp_7,color=col_7){ s:chip(angle=yaw_7,spring=spr_7,damper=dmp_7,color=col_7){ } } } //---------------------------------------------------------------------------// } } /////////////////////////////////////////////////////////////////////////////// Lua{ baseh=_Y(0) c_1=1 c_2=c_1+8 c_3=c_2+8 c_4=c_3+8 c_5=c_4+8 c_6=c_5+8 c_7=c_6+8 tgtx={};tgty={};tgtz={} tgtx[c_1]=0;tgty[c_1]=0;tgtz[c_1]=0 tgtx[c_2]=0;tgty[c_2]=0;tgtz[c_2]=0 tgtx[c_3]=0;tgty[c_3]=0;tgtz[c_3]=0 tgtx[c_4]=0;tgty[c_4]=0;tgtz[c_4]=0 tgtx[c_5]=0;tgty[c_5]=0;tgtz[c_5]=0 tgtx[c_6]=0;tgty[c_6]=0;tgtz[c_6]=0 tgtx[c_7]=0;tgty[c_7]=0;tgtz[c_7]=0 -- リミッタ ------------------------------------------------------------------- function limiter(p,l) return math.min(l,math.max(-l,p)) end -- GETWVEC -------------------------------------------------------------------- function getwvec(lx,ly,lz,cn) local wx=_XX(cn)*lx+_YX(cn)*ly+_ZX(cn)*lz local wy=_XY(cn)*lx+_YY(cn)*ly+_ZY(cn)*lz local wz=_XZ(cn)*lx+_YZ(cn)*ly+_ZZ(cn)*lz return wx,wy,wz end -- GETLVEC -------------------------------------------------------------------- function getlvec(wx,wy,wz,cn) local lx=_XX(cn)*wx+_XY(cn)*wy+_XZ(cn)*wz local ly=_YX(cn)*wx+_YY(cn)*wy+_YZ(cn)*wz local lz=_ZX(cn)*wx+_ZY(cn)*wy+_ZZ(cn)*wz return lx,ly,lz end -- 飛行目標座標設定 ----------------------------------------------------------- function target_set(cn) local lx=tgtx[cn]-_X(cn) local ly=tgty[cn]-_Y(cn) local lz=tgtz[cn]-_Z(cn) local dst=math.sqrt(lx^2+ly^2+lz^2) if(cn==c_1)and(dst<50) then tgtx[cn]=math.random(2400)-1200 tgty[cn]=math.random(400)+200+baseh tgtz[cn]=math.random(2400)-1200 elseif(cn==c_2) then tgtx[cn]=_X(c_1)+vx+4 tgty[cn]=_Y(c_1)+vy tgtz[cn]=_Z(c_1)+vz elseif(cn==c_3) then tgtx[cn]=_X(c_1)+vx-4 tgty[cn]=_Y(c_1)+vy tgtz[cn]=_Z(c_1)+vz elseif(cn==c_4) then tgtx[cn]=_X(c_1)+vx tgty[cn]=_Y(c_1)+vy tgtz[cn]=_Z(c_1)+vz+4 elseif(cn==c_5) then tgtx[cn]=_X(c_1)+vx tgty[cn]=_Y(c_1)+vy tgtz[cn]=_Z(c_1)+vz-4 elseif(cn==c_6) then tgtx[cn]=_X(c_1)+vx tgty[cn]=_Y(c_1)+vy+3 tgtz[cn]=_Z(c_1)+vz elseif(cn==c_7) then tgtx[cn]=_X(c_1)+vx tgty[cn]=_Y(c_1)+vy-3 tgtz[cn]=_Z(c_1)+vz end lx=tgtx[cn]-_X(cn) ly=tgty[cn]-_Y(cn) lz=tgtz[cn]-_Z(cn) dst=math.sqrt(lx^2+ly^2+lz^2) ly=ly+1 -- 誤差修正 return lx,ly,lz,dst end -- 飛行機制御 ----------------------------------------------------------------- function plane_ctrl(cn,jet,pitch,roll,yaw) local lx,ly,lz,dst=target_set(cn) lx,ly,lz=getlvec(lx,ly,lz,cn) local rx,ry,rz,r,c local h=_H(cn) if(h>=0) then -- 地面が接近したら上昇回避 rx=(_AX(cn)-0.6) rz=(_EZ(cn)+_WZ(cn)*0.5) ry=_WY(cn)*0.5 else -- ピッチ制御 rx=math.atan2(-ly,-lz*0.1)+_WX(cn)*0.5 -- ロール制御 r=math.sqrt(lx^2+ly^2) c=math.deg(math.atan2(r,-lz)) if(c<10) then rz=_EZ(cn)+_WZ(cn)*0.5 else rz=math.atan2(lx,ly)+_WZ(cn)*0.5 rx=math.min(0,rx) -- 大きく旋回するときはピッチダウンしない end -- ヨー制御 ry=math.atan2(lx,-lz*0.1)+_WY(cn) end local k=50000/(_VZ(cn)^2+1) pitch=pitch+limiter(rx*k-pitch,1) roll=roll+limiter(rz*k-roll,1) yaw=yaw+limiter(ry*k-yaw,1) if(cn==c_1) then jet=5000*(250+_VZ(cn)*3.6) else jet=5000*(250+(dst-13)/2+_VZ(cn)*3.6) end local shot=0 if(_KEY(5)>0) then shot=5000 end return jet,pitch,roll,yaw,shot end -- 表示 ----------------------------------------------------------------------- function display(cn) local vx,vy,vz=_VX(cn),_VY(cn),_VZ(cn) local vel=math.sqrt(vx^2+vy^2+vz^2) out(0,"FPS=",_FPS(),", Chips=",_CHIPS(),", Weight=",_WEIGHT(),"kg") out(1,"ChipNo.",cn,", Speed=",vel*3.6,"km/h") out(2,"X=",_X(cn),", Y=",_Y(cn),", Z=",_Z(cn),", H=",_H(cn)," [m]") out(3,"Vx=",vx,", Vy=",vy,", Vz=",vz," [m/s]") out(4,"Ax=",_AX(cn),", Ax=",_AY(cn),", Ez=",_EZ(cn)," [rad]") out(5,"Wx=",_WX(cn),", Wy=",_WY(cn),", Wz=",_WZ(cn)," [rad/s]") end -- メイン --------------------------------------------------------------------- gcheck=0 function main() if(_TICKS()<2) then local t local c_2s,c_3s,c_4s,c_5s,c_6s,c_7s=c_2-1,c_3-1,c_4-1,c_5-1,c_6-1,c_7-1 t=_SPLIT(c_2s) t=_SPLIT(c_3s) t=_SPLIT(c_4s) t=_SPLIT(c_5s) t=_SPLIT(c_6s) t=_SPLIT(c_7s) end if(dmode==1) then display(c_1) elseif(dmode==2) then display(c_2) elseif(dmode==3) then display(c_3) elseif(dmode==4) then display(c_4) elseif(dmode==5) then display(c_5) elseif(dmode==6) then display(c_4) elseif(dmode==7) then display(c_5) else dmode=0 out(0,"FPS=",_FPS()) out(1,"C : Change Display Mode") end if(_KEY(6)>0)and(key6==0) then dmode=math.mod(dmode+1,8) end key6=_KEY(6) vx,vy,vz=getwvec(_VX(c_1)*0.2,_VY(c_1)*0.2,_VZ(c_1)*0.2,c_1) JET_1,PITCH_1,ROLL_1,YAW_1,SHOT_1=plane_ctrl(c_1,JET_1,PITCH_1,ROLL_1,YAW_1) JET_2,PITCH_2,ROLL_2,YAW_2,SHOT_2=plane_ctrl(c_2,JET_2,PITCH_2,ROLL_2,YAW_2) JET_3,PITCH_3,ROLL_3,YAW_3,SHOT_3=plane_ctrl(c_3,JET_3,PITCH_3,ROLL_3,YAW_3) JET_4,PITCH_4,ROLL_4,YAW_4,SHOT_4=plane_ctrl(c_4,JET_4,PITCH_4,ROLL_4,YAW_4) JET_5,PITCH_5,ROLL_5,YAW_5,SHOT_5=plane_ctrl(c_5,JET_5,PITCH_5,ROLL_5,YAW_5) JET_6,PITCH_6,ROLL_6,YAW_6,SHOT_6=plane_ctrl(c_6,JET_6,PITCH_6,ROLL_6,YAW_6) JET_7,PITCH_7,ROLL_7,YAW_7,SHOT_7=plane_ctrl(c_7,JET_7,PITCH_7,ROLL_7,YAW_7) ROLLS_1=ROLL_1+90 ROLLS_2=ROLL_2+90 ROLLS_3=ROLL_3+90 ROLLS_4=ROLL_4+90 ROLLS_5=ROLL_5+90 ROLLS_6=ROLL_6+90 ROLLS_7=ROLL_7+90 end }