//heli val{ powa_1(default=0,min=0,max=1000000,step=0) powb_1(default=0,min=0,max=1000000,step=0) powf_1(default=0,min=0,max=1,step=0,disp=0) updownc_1(default=0,min=-45,max=45,step=0) yawc_1(default=0,min=-360,max=360,step=0) pitchc_1(default=0,min=-45,max=45,step=0) rollc_1(default=0,min=-45,max=45,step=0) ra0_1(default=0,min=-45,max=45,step=0,disp=0) ra1_1(default=0,min=-45,max=45,step=0,disp=0) ra2_1(default=0,min=-45,max=45,step=0,disp=0) ra3_1(default=0,min=-45,max=45,step=0,disp=0) rb0_1(default=0,min=-45,max=45,step=0,disp=0) rb1_1(default=0,min=-45,max=45,step=0,disp=0) rb2_1(default=0,min=-45,max=45,step=0,disp=0) rb3_1(default=0,min=-45,max=45,step=0,disp=0) brake_1(default=1000,min=0,max=1000,step=0) rangle_1(default=45,min=0,max=90,step=0,disp=0) col_1(default=0,min=0,max=16777215,step=0,disp=0) } key{ 0:pitchc_1(step=1) 1:pitchc_1(step=-1) 2:rollc_1(step=-1) 3:rollc_1(step=1) 4:yawc_1(step=-2) 6:yawc_1(step=2) 5:updownc_1(step=1) 8:updownc_1(step=-1) } body{ core(name=C_1){ //0 n:frame(angle=90){ s:wheel(angle=90,power=powa_1,brake=brake,name=RA_1){ //2 3 n:trim(angle=-ra0_1){ n:chip(){ n:chip(){ } } } w:trim(angle=-ra1_1){ w:chip(){ w:chip(){ } } } s:trim(angle=-ra2_1){ s:chip(){ s:chip(){ } } } e:trim(angle=-ra3_1){ e:chip(){ e:chip(){ } } } } s:wheel(angle=90,power=-powb_1,brake=brake,name=RB_1){ //16 17 n:trim(angle=rb0_1){ n:chip(){ n:chip(){ } } } w:trim(angle=rb1_1){ w:chip(){ w:chip(){ } } } s:trim(angle=rb2_1){ s:chip(){ s:chip(){ } } } e:trim(angle=rb3_1){ e:chip(){ e:chip(){ } } } } n:frame(){ w:chip(angle=-rangle_1,color=#0000FF){ } e:chip(angle=-rangle_1,color=#0000FF){ } } } s:frame(angle=90){ s:frame(){ w:chip(angle=-rangle_1,color=#FF0000){ } e:chip(angle=-rangle_1,color=#FF0000){ } } s:cowl(angle=90,option=5,color=col_1,name=FOOT_1){ // 37 } } } } Lua{ -- グローバル変数 key={} keyt={} height={} updown={} hflag={} sflag={} tgt_x={} tgt_y={} tgt_z={} dst={} -- グローバル変数初期化 function gval_init(i) height[i]=0 updown[i]=0 hflag[i]=0 sflag[i]=0 tgt_x[i]=0 tgt_y[i]=0 tgt_z[i]=0 dst[i]=0 end -- 時間(表示用フォーマット) function time() t=_TICKS() s=math.mod(t/30,60) hm=math.mod(math.floor(t/1800),60)/100 hm=hm+math.floor(t/86400) return hm,s end -- _SGN(x) function sgn(x) if x>0 then r=1 elseif x<0 then r=-1 else r=0 end return r end -- 角度補正(DEGREE) function hosei_deg(deg) while math.abs(deg)>180 do deg=deg-sgn(deg)*360 end return deg end -- 角度補正(RADIAN) function hosei_rad(rad) while math.abs(rad)>math.pi do rad=rad-sgn(rad)*math.pi*2 end return rad end -- _AZ()の補正 yu:通常上にあるChipの_Y, yd:通常下にあるChipの_Y function az_cal(az,yu,yd) s=sgn(yu-yd) if s>=0 then r=az else r=sgn(az)*math.pi-az end return r,s end -- _keyトグル function keytgl(n) -- 変数初期化 if key[n]==nil then key[n],keyt[n]=0,0 end -- トグル k=_KEY(n) if(k>0)and(key[n]==0) then keyt[n]=1-keyt[n] key[n]=1 elseif k==0 then key[n]=0 end return keyt[n] end -- グローバル座標G(gx,gy,gz)のチップnを基準としたローカル平面上の座標を求める function getlpos(gx,gy,gz,n,m) aza=az_cal(_AZ(n),_Y(n),_Y(m)) ly=gy lz=-gz lx=-gx z=lz*math.cos(_AY(n))+lx*math.sin(_AY(n)) x=lx*math.cos(_AY(n))-lz*math.sin(_AY(n)) lz=-z lx=-x lz=-lz z=lz*math.cos(_AX(n))+ly*math.sin(_AX(n)) y=ly*math.cos(_AX(n))-lz*math.sin(_AX(n)) lz=-z ly=y y=ly*math.cos(aza)+lx*math.sin(aza) x=lx*math.cos(aza)-ly*math.sin(aza) ly=y lx=x r=math.atan2(lx,-lz) return r end -- 自動制御 function auto_control(n,pitchc,rollc,col) -- ターゲット座標の更新 if(sec==0)or(dst[n]<50)or(tgt_y[n]<10) then tgt_x[n]=math.floor(math.random()*200-100) tgt_y[n]=math.floor(math.random()*50+50) tgt_z[n]=math.floor(math.random()*270-135) end if(_H(n)>=0)and(_H(n)<5)and(hflag[n]==0) then tgt_y[n]=math.floor(_Y(n)+math.random()*45) hflag[n]=1 elseif _H(n)<0 then hflag[n]=0 end lx=tgt_x[n]-_X(n) ly=tgt_y[n]-_Y(n) lz=tgt_z[n]-_Z(n) dst[n]=math.sqrt(lx*lx+ly*ly+lz*lz) height[n]=tgt_y[n] -- 色変え t=math.floor(dst[n]/10)+10 if math.mod(sec,t)-20) then pitchc=pitchc+sgn(math.deg(math.atan2(-lz,ly))-pitchc) else pitchc=pitchc*0.9 end return pow,yaw,pitchc,rollc,col end function seigyo(n,pitchc,rollc,yawc,updownc,brake) -- az補正 az,azs=az_cal(_AZ(n),_Y(n),_Y(n+37)) -- 周期点滅 if math.mod(sec,2)<1 then col=255 else col=0 end -- 自動制御 if(auto==0)and(n==0) then if keytgl(9)>0 then pow=100000 else pow=0 end yaw=yawc-math.deg(_AY(n)) else pow,yaw,pitchc,rollc,col=auto_control(n,pitchc,rollc,col) end -- 出力制御 if pow==0 then height[n]=_Y(n) updown[n]=0 yawc=_AY(n) brake=brake+100 else brake=0 end -- 上昇下降制御 if(n==0)and(_KEY(5)==0)and(_KEY(8)==0) then t=-4*((_VY(n)*math.cos(az)-_VX(n)*math.sin(az))*math.cos(_AX(n))-_VZ(n)*math.sin(_AX(n))+(_Y(n)-height[n])*math.cos(az)*math.cos(_AX(n))) if(math.abs(t)<5) then updown[n]=updown[n]+t else updown[n]=updown[n]+sgn(t)*5 end updownc=updown[n] else if((_KEY(5)>0)and(updownc<=0))or((_KEY(8)>0)and(updownc>0)) then updownc=0 end updown[n]=updownc height[n]=_Y(n) end -- ヨー制御 yaw=hosei_deg(yaw) yaw=0.4*(0.5-1/(1+math.exp(yaw*0.1))) powa=pow*(1-yaw) powb=pow*(1+yaw) -- ピッチ&ロール制御 -- 水平に戻す(パーシャル) if(n==0)and(_KEY(4)>0)and(_KEY(6)>0) then pitchc=0 rollc=0 end -- 前後左右の組み合わせで傾け過ぎないようにする p=math.rad(pitchc) r=math.rad(rollc) x=math.sin(r) y=math.abs(math.cos(r)*math.cos(p)) z=math.cos(r)*math.sin(p) a=math.sqrt(x*x+z*z) if y0)and(auto>0) then out(1,"D:Engine[ON], A:Auto-Pilot[ON]") elseif(pow>0)and(auto==0) then out(1,"D:Engine[ON], A:Auto-Pilot[OFF]") elseif(pow==0)and(auto>0) then out(1,"D:Engine[OFF], A:Auto-Pilot[ON]") else out(1,"D:Engine[OFF], A:Auto-Pilot[OFF]") end vel=math.sqrt(_VX(0)*_VX(0)+_VY(0)*_VY(0)+_VZ(0)*_VZ(0)) out(2,"Vel=",vel,", Speed=",vel*3.6,", Distance=",dst[0]) out(3,"x=",_X(0),", y=",_Y(0),", z=",_Z(0)) out(4,"ax=",math.deg(_AX(0)),", ay=",math.deg(_AY(0)),", az=",math.deg(_AZ(0)),", az=",math.deg(az),", azs=",azs) out(5,"vx=",_VX(0),", vy=",_VY(0),", vz=",_VZ(0)) out(6,"wx=",_WX(0),", wy=",_WY(0),", wz=",_WZ(0)) out(7,"tgt_x=",tgt_x[0],", tgt_y=",tgt_y[0],", tgt_z=",tgt_z[0]) if sec<10 then out(8,"Time=",hmin,",0",sec,", FPS=",_FPS()) elseif sec>=10 then out(8,"Time=",hmin,",",sec,", FPS=",_FPS()) end end }