//plane+heli*3 val{ pitch(default=0,min=-10,max=10,step=0) pitch1(default=0,min=-10,max=10,step=1,disp=0) roll(default=0,min=-10,max=10,step=0) roll1(default=0,min=-10,max=10,step=0.5,disp=0) yaw(default=0,min=-10,max=10,step=0) yaw1(default=0,min=-10,max=10,step=1,disp=0) jet(default=0,min=0,max=50000,step=0) jet1(default=0,min=0,max=50000,step=0,disp=0) abrake(default=0,min=0,max=90,step=0) abrake1(default=0,min=0,max=90,step=0,disp=0) gear(default=80,min=80,max=170,step=0,disp=0) gbrake(default=0,min=0,max=10,step=0,disp=0) height(default=0,min=-10000,max=10000,step=0) tgt_x(default=0,min=-100000,max=100000,step=0) tgt_y(default=0,min=-100000,max=100000,step=0) tgt_z(default=0,min=-100000,max=100000,step=0) dst(default=0,min=0,max=100000,step=0,disp=1) auto(default=0,min=0,max=1,step=0,disp=1) auto1(default=0,min=0,max=1,step=0,disp=0) bal(default=0,min=0,max=1,step=0,disp=1) bal1(default=0,min=0,max=1,step=0,disp=0) prt(default=0,min=0,max=1,step=0,disp=0) prt1(default=0,min=0,max=1,step=0,disp=0) bye(default=0,min=0,max=10,step=0,disp=0) cno(default=0,min=0,max=10,step=0,disp=0) rota_1(default=0,min=-1000,max=1000,step=0,disp=0) rotb_1(default=0,min=-1000,max=1000,step=0,disp=0) pow_1 (default=0,min=0,max=50,step=0,disp=0) powa_1 (default=0,min=0,max=50,step=0,disp=0) powb_1 (default=0,min=0,max=50,step=0,disp=0) powa0_1(default=0,min=0,max=50,step=0,disp=0) powb0_1(default=0,min=0,max=50,step=0,disp=0) powf_1(default=0,min=0,max=1,step=0,disp=0) updown_1(default=0,min=-30,max=30,step=0,disp=0) updownc_1(default=0,min=-30,max=30,step=0,disp=0) height_1(default=0,min=-10000,max=10000,step=0,disp=0) yaw_1 (default=0,min=-360,max=360,step=0,disp=0) yawc_1(default=0,min=-360,max=360,step=0,disp=0) pitch_1 (default=0,min=-45,max=45,step=0,disp=0) pitchc_1(default=0,min=-45,max=45,step=0,disp=0) roll_1 (default=0,min=-45,max=45,step=0,disp=0) ra0_1(default=90,min=45,max=135,step=0,disp=0) ra1_1(default=90,min=45,max=135,step=0,disp=0) rb0_1(default=90,min=45,max=135,step=0,disp=0) rb1_1(default=90,min=45,max=135,step=0,disp=0) rangle_1(default=45,min=0,max=90,step=0,disp=0) tgt_x_1(default=0,min=-1000,max=1000,step=0,disp=0) tgt_y_1(default=0,min=-1000,max=1000,step=0,disp=0) tgt_z_1(default=0,min=-1000,max=1000,step=0,disp=0) dst_1(default=0,min=0,max=100000,step=0,disp=0) hflag_1(default=0,min=0,max=1,step=0,disp=0) rota_2(default=0,min=-1000,max=1000,step=0,disp=0) rotb_2(default=0,min=-1000,max=1000,step=0,disp=0) pow_2 (default=0,min=0,max=50,step=0,disp=0) powa_2 (default=0,min=0,max=50,step=0,disp=0) powb_2 (default=0,min=0,max=50,step=0,disp=0) powa0_2(default=0,min=0,max=50,step=0,disp=0) powb0_2(default=0,min=0,max=50,step=0,disp=0) powf_2(default=0,min=0,max=1,step=0,disp=0) updown_2(default=0,min=-30,max=30,step=0,disp=0) updownc_2(default=0,min=-30,max=30,step=0,disp=0) height_2(default=0,min=-10000,max=10000,step=0,disp=0) yaw_2 (default=0,min=-360,max=360,step=0,disp=0) yawc_2(default=0,min=-360,max=360,step=0,disp=0) pitch_2 (default=0,min=-45,max=45,step=0,disp=0) pitchc_2(default=0,min=-45,max=45,step=0,disp=0) roll_2 (default=0,min=-45,max=45,step=0,disp=0) ra0_2(default=90,min=45,max=135,step=0,disp=0) ra1_2(default=90,min=45,max=135,step=0,disp=0) rb0_2(default=90,min=45,max=135,step=0,disp=0) rb1_2(default=90,min=45,max=135,step=0,disp=0) rangle_2(default=45,min=0,max=90,step=0,disp=0) tgt_x_2(default=0,min=-1000,max=1000,step=0,disp=0) tgt_y_2(default=0,min=-1000,max=1000,step=0,disp=0) tgt_z_2(default=0,min=-1000,max=1000,step=0,disp=0) dst_2(default=0,min=0,max=100000,step=0,disp=0) hflag_2(default=0,min=0,max=1,step=0,disp=0) rota_3(default=0,min=-1000,max=1000,step=0,disp=0) rotb_3(default=0,min=-1000,max=1000,step=0,disp=0) pow_3 (default=0,min=0,max=50,step=0,disp=0) powa_3 (default=0,min=0,max=50,step=0,disp=0) powb_3 (default=0,min=0,max=50,step=0,disp=0) powa0_3(default=0,min=0,max=50,step=0,disp=0) powb0_3(default=0,min=0,max=50,step=0,disp=0) powf_3(default=0,min=0,max=1,step=0,disp=0) updown_3(default=0,min=-30,max=30,step=0,disp=0) updownc_3(default=0,min=-30,max=30,step=0,disp=0) height_3(default=0,min=-10000,max=10000,step=0,disp=0) yaw_3 (default=0,min=-360,max=360,step=0,disp=0) yawc_3(default=0,min=-360,max=360,step=0,disp=0) pitch_3 (default=0,min=-45,max=45,step=0,disp=0) pitchc_3(default=0,min=-45,max=45,step=0,disp=0) roll_3 (default=0,min=-45,max=45,step=0,disp=0) ra0_3(default=90,min=45,max=135,step=0,disp=0) ra1_3(default=90,min=45,max=135,step=0,disp=0) rb0_3(default=90,min=45,max=135,step=0,disp=0) rb1_3(default=90,min=45,max=135,step=0,disp=0) rangle_3(default=45,min=0,max=90,step=0,disp=0) tgt_x_3(default=0,min=-1000,max=1000,step=0,disp=0) tgt_y_3(default=0,min=-1000,max=1000,step=0,disp=0) tgt_z_3(default=0,min=-1000,max=1000,step=0,disp=0) dst_3(default=0,min=0,max=100000,step=0,disp=0) hflag_3(default=0,min=0,max=1,step=0,disp=0) } key{ 0:pitch1(step=-1) 1:pitch1(step=1) 2:roll1(step=0.5) 3:roll1(step=-0.5) 4:yaw1(step=-1) 6:yaw1(step=1) 5:jet(step=10000) 9:jet(step=-10000) } body{ core(){ n:frame(angle=-20){ n:jet(angle=110,power=jet){ } n:frame(angle=-140){ n:cowl(angle=-20,option=0,name=roof){ } } } w:chip(){ w:trim(angle=roll){ w:chip(){ w:cowl(option=4){ } } } } e:chip(){ e:trim(angle=roll){ e:chip(){ e:cowl(option=3){ } } } } 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,brake=gbrake){ } } e:frame(angle=10){ e:wheel(angle=gear,brake=gbrake){ } } s:chip(angle=abrake){ } s:chip(angle=-abrake){ } // heli_1 start n:chip(name=c_1){ w:frame(angle=-120){ w:frame(angle=30){ w:trimf(angle=-rota_1){ n:trim(angle=-ra0_1){ n:chip(){ n:chip(){ n:chip(){ } } } } s:trim(angle=-ra1_1){ s:chip(){ s:chip(){ s:chip(){ } } } } } } } e:frame(angle=-120){ e:frame(angle=30){ e:trimf(angle=rotb_1){ n:trim(angle=rb0_1){ n:chip(){ n:chip(){ n:chip(){ } } } } s:trim(angle=rb1_1){ s:chip(){ s:chip(){ s:chip(){ } } } } } } } n:frame(angle=-90){ w:chip(angle=rangle_1){ } e:chip(angle=rangle_1){ } } s:frame(angle=-90){ w:chip(angle=rangle_1){ } e:chip(angle=rangle_1){ } s:cowl(angle=-90,option=5,name=roof_1,color=#0000FF){ } } } // heli_1 end // heli_2 start n:chip(name=c_2){ w:frame(angle=-120){ w:frame(angle=30){ w:trimf(angle=-rota_2){ n:trim(angle=-ra0_2){ n:chip(){ n:chip(){ n:chip(){ } } } } s:trim(angle=-ra1_2){ s:chip(){ s:chip(){ s:chip(){ } } } } } } } e:frame(angle=-120){ e:frame(angle=30){ e:trimf(angle=rotb_2){ n:trim(angle=rb0_2){ n:chip(){ n:chip(){ n:chip(){ } } } } s:trim(angle=rb1_2){ s:chip(){ s:chip(){ s:chip(){ } } } } } } } n:frame(angle=-90){ w:chip(angle=rangle_2){ } e:chip(angle=rangle_2){ } } s:frame(angle=-90){ w:chip(angle=rangle_2){ } e:chip(angle=rangle_2){ } s:cowl(angle=-90,option=5,name=roof_2,color=#FFFF00){ } } } // heli_2 end // heli_3 start n:chip(name=c_3){ w:frame(angle=-120){ w:frame(angle=30){ w:trimf(angle=-rota_3){ n:trim(angle=-ra0_3){ n:chip(){ n:chip(){ n:chip(){ } } } } s:trim(angle=-ra1_3){ s:chip(){ s:chip(){ s:chip(){ } } } } } } } e:frame(angle=-120){ e:frame(angle=30){ e:trimf(angle=rotb_3){ n:trim(angle=rb0_3){ n:chip(){ n:chip(){ n:chip(){ } } } } s:trim(angle=rb1_3){ s:chip(){ s:chip(){ s:chip(){ } } } } } } } n:frame(angle=-90){ w:chip(angle=rangle_3){ } e:chip(angle=rangle_3){ } } s:frame(angle=-90){ w:chip(angle=rangle_3){ } e:chip(angle=rangle_3){ } s:cowl(angle=-90,option=5,name=roof_3,color=#FF0000){ } } } // heli_3 end } } script{ if(bye=0){ t=_bye(c_1) t=_bye(c_2) t=_bye(c_3) bye=1 } // 時間表示 // sec=_mod(_ticks()/30,60) min=_mod(_int(_ticks()/1800),60) hour=_int(_ticks()/86400) t=_rnd() // _az(0)の補正 az=_az(0) azs=_y(roof)-_y(0) if(azs<0){az=_sgn(az)*_pi()-az} // autoフラグ if(_key(7)>0){auto=1-auto1} if(_key(7)=0){auto1=auto} // balフラグ if(_key(8)>0){bal=1-bal1} if(_key(8)=0){bal1=bal} // 手動制御ならジャンプ if(auto=0){goto manual} // ターゲット座標の更新 if(sec=0)|(dst<20)|(tgt_y<50){ tgt_x=_int(_rnd()*2000-1000) tgt_y=_int(_rnd()*150+50) tgt_z=_int(_rnd()*2000-1000) cno=_mod(cno+1,4) } if(cno=1){ tgt_x=_x(c_1) tgt_y=_y(c_1) tgt_z=_z(c_1) } if(cno=2){ tgt_x=_x(c_2) tgt_y=_y(c_2) tgt_z=_z(c_2) } if(cno=3){ tgt_x=_x(c_3) tgt_y=_y(c_3) tgt_z=_z(c_3) } // 相対座標(回転前)を求める lx=tgt_x-_x(0) ly=tgt_y-_y(0) lz=tgt_z-_z(0) dst=_len3(lx,ly,lz) // 自機を基準としたローカル平面上のターゲットローカル座標を求める // 自機のY軸回転を差し引く(-AYだけ回転させる) // lz=-lz // lx=-lx z=lz*_cos(_ay(0))+lx*_sin(_ay(0)) x=lx*_cos(_ay(0))-lz*_sin(_ay(0)) lz=z lx=x // 自機のX軸回転を差し引く(-AXだけ回転させる) // lz=-lz z=lz*_cos(_ax(0))-ly*_sin(_ax(0)) y=ly*_cos(_ax(0))+lz*_sin(_ax(0)) lz=z ly=y // 自機のZ軸回転を差し引く(-AZだけ回転させる) y=ly*_cos(az)+lx*_sin(az) x=lx*_cos(az)-ly*_sin(az) ly=y lx=x // 障害物回避 if(_ccd(32,32)=0){goto skip} if(_ccd(32,32)<>26527){goto kaihi} if(_ccd(4,4)<>26527){goto kaihi} if(_ccd(4,59)<>26527){goto kaihi} if(_ccd(59,4)<>26527){goto kaihi} if(_ccd(59,59)<>26527){goto kaihi} label skip // 高度が低い場合は上昇 if(_ccd(32,32)=0)&((_y(0)<20)|(_h(0)>=0)){ cp=30 goto joushou } cr=_atan2(lx,ly) cp=_atan2(ly,-lz)+_atan(_vy(0)/_vz(0)) if(cp<-_pi()){cp=cp+2*_pi()} if(cp>_pi()){cp=cp-2*_pi()} cy=_atan2(-lx,-lz) cpp=0 goto seigyo label kaihi // 回避ロール角を求める cr=0 if(_ccd(4,4)<>26527){cr=cr-135} if(_ccd(4,59)<>26527){cr=cr-45} if(_ccd(59,4)<>26527){cr=cr+135} if(_ccd(59,59)<>26527){cr=cr+45} cr=_torad(cr) if(cr=0){cr=-az} // 回避ピッチ角を求める cp=0 if(_abs(cr)<_pi()/2){cp=_pi()/8*_cos(cr)} if(_ccd(32,32)<>26527){cp=_pi()*_sgn(cp)} // 回避ヨー角を求める cy=_pi()*_sin(-cr) cpp=0 goto seigyo label joushou // ピッチ角=cp、ロール角=0で固定 cr=-az cp=_atan(_vy(0)/_vz(0))-_ax(0)+_torad(cp) if(cp<-_pi()){cp=cp+2*_pi()} if(cp>_pi()){cp=cp-2*_pi()} cy=0 cpp=0 goto seigyo label manual if(bal>0){ // 水平戻し cr=-az cp=_atan(_vy(0)/_vz(0))-_ax(0) if(cp<-_pi()){cp=cp+2*_pi()} if(cp>_pi()){cp=cp-2*_pi()} cy=0 // 無操作且つほぼ水平飛行の場合、現在高度を保存(更新しない) if(_abs(az)>0.1)|(_abs(_ax(0))>0.1){height=_y(0)} if(pitch1<>0)|(roll1<>0)|(yaw1<>0){height=_y(0)} // 目標高度のズレを補正 cpp=(height+2-_y(0))/10 } if(bal=0){ // こっちのIF文を後に書かないとcpp=0にならない。何故? cr=0 cp=0 cy=0 cpp=0 } label seigyo pitch2=2000*cp/(_abs(_vz(0))+1)+cpp roll2=100*cr/(_abs(_vz(0))+1) yaw2=1000*cy/(_abs(_vz(0))+1) p=pitch1+pitch2 r=roll1+roll2 y=yaw1+yaw2 p=p-pitch r=r-roll y=y-yaw if(_abs(p)>2){p=_sgn(p)*2} if(_abs(r)>4){r=_sgn(r)*4} if(_abs(y)>2){y=_sgn(y)*2} pitch=pitch+p roll=roll+r yaw=yaw+y // ギア if(_h(0)<0){ gear=gear+2 gbrake=100 } if(_h(0)>=0){ gear=gear-10 gbrake=0 } // リミッタ abrake1=0 if(auto=1){ t=80 // リミット速度 jet1=t*50000*(1-_vz(0)*_vz(0)/t/t) jet=jet1 abrake1=(-_vz(0)-t)*5*t } abrake=abrake+_sgn(abrake1-abrake) // heli_1 script ////////////////////////////////////////////////////////////// // _az(c_1)の補正 // az_1=_az(c_1) azs_1=_y(roof_1)-_y(c_1) if(azs_1<0){az_1=_sgn(az_1)*_pi()-az_1} // ターゲット座標の更新 if(sec=0)|(dst_1<50)|(tgt_y_1<10){ tgt_x_1=_int(_rnd()*1000-500) tgt_y_1=_int(_rnd()*150+50) tgt_z_1=_int(_rnd()*1000-500) } if(_h(c_1)>=0)&(hflag_1=0){ tgt_y_1=_y(c_1)+_int(_rnd()*150+50) hflag_1=1 } if(_h(c_1)<0){ hflag_1=0 } lx=tgt_x_1-_x(c_1) ly=tgt_y_1-_y(c_1) lz=tgt_z_1-_z(c_1) dst_1=_len3(lx,ly,lz) pow_1=30 height_1=_y(c_1)+ly if(_abs(ly)>=10){ pitchc_1=0 goto manual_1 } yawc_1=_todeg(_atan2(-lx,-lz)) yaw_1=yawc_1-_todeg(_ay(c_1)) if(yaw_1<-180){yaw_1=yaw_1+360} if(yaw_1>180){yaw_1=yaw_1-360} a=_abs(yaw_1) b=_abs(_wy(c_1)) if(a<30)&(b<40){ pitchc_1=pitchc_1+_sgn(dst_1-pitchc_1) } if(a>=30)|(b>=40){ pitchc_1=0 } label manual_1 // 上昇下降制御 // updown_1=updown_1-(_vy(c_1)*_cos(az_1)-_vx(c_1)*_sin(az_1))*_cos(_ax(c_1))+_vz(c_1)*_sin(_ax(c_1))-(_y(c_1)-height_1)*_cos(az_1) updownc_1=updown_1 // ヨー制御 // if(yawc_1<-180){yawc_1=yawc_1+360} if(yawc_1>180){yawc_1=yawc_1-360} yaw_1=yawc_1-_todeg(_ay(c_1)) if(yaw_1<-180){yaw_1=yaw_1+360} if(yaw_1>180){yaw_1=yaw_1-360} if(_abs(yaw_1)>5){yaw_1=_sgn(yaw_1)*5} yaw_1=yaw_1/10 if(_abs(yaw_1)>0.5){yaw_1=_sgn(yaw_1)*0.5} powa_1=pow_1*(1-yaw_1) powb_1=pow_1*(1+yaw_1) // ピッチ&ロール制御 // pitch_1=(_todeg(_ax(c_1))+pitchc_1)/2 roll_1=_todeg(az_1)/2 // ロータの回転制御 a=powa_1-powa0_1 if(_abs(a)>2){powa_1=powa0_1+_sgn(a)*2} rota_1=_mod(rota_1,360)+powa_1 powa0_1=powa_1 b=powb_1-powb0_1 if(_abs(b)>2){powb_1=powb0_1+_sgn(b)*2} rotb_1=_mod(rotb_1,360)+powb_1 powb0_1=powb_1 // サイクリックピッチ // // ロータのローカルAy回転角を求める ay_ra=_torad(rota_1) ay_rb=-_torad(rotb_1) // アングルリミッタ if(_abs(updown_1)>30){updown_1=_sgn(updown_1)*30} if(_abs(pitch_1)>45){pitch_1=_sgn(pitch_1)*45} if(_abs(roll_1)>45){roll_1=_sgn(roll_1)*45} // ロータアングル最終値 u=updown_1+90 pra=pitch_1*_cos(ay_ra)+roll_1*_sin(ay_ra) prb=pitch_1*_cos(ay_rb)+roll_1*_sin(ay_rb) ra0_1=u-pra ra1_1=u+pra rb0_1=u-prb rb1_1=u+prb // 翼角度 rangle_1=45+_abs(pitchc_1) // heli_2 script ////////////////////////////////////////////////////////////// // _az(c_2)の補正 // az_2=_az(c_2) azs_2=_y(roof_2)-_y(c_2) if(azs_2<0){az_2=_sgn(az_2)*_pi()-az_2} // ターゲット座標の更新 if(sec=0)|(dst_2<50)|(tgt_y_2<10){ tgt_x_2=_int(_rnd()*1000-500) tgt_y_2=_int(_rnd()*150+50) tgt_z_2=_int(_rnd()*1000-500) } if(_h(c_2)>=0)&(hflag_2=0){ tgt_y_2=_y(c_2)+_int(_rnd()*150+50) hflag_2=1 } if(_h(c_2)<0){ hflag_2=0 } lx=tgt_x_2-_x(c_2) ly=tgt_y_2-_y(c_2) lz=tgt_z_2-_z(c_2) dst_2=_len3(lx,ly,lz) pow_2=30 height_2=_y(c_2)+ly if(_abs(ly)>=10){ pitchc_2=0 goto manual_2 } yawc_2=_todeg(_atan2(-lx,-lz)) yaw_2=yawc_2-_todeg(_ay(c_2)) if(yaw_2<-180){yaw_2=yaw_2+360} if(yaw_2>180){yaw_2=yaw_2-360} a=_abs(yaw_2) b=_abs(_wy(c_2)) if(a<30)&(b<40){ pitchc_2=pitchc_2+_sgn(dst_2-pitchc_2) } if(a>=30)|(b>=40){ pitchc_2=0 } label manual_2 // 上昇下降制御 // updown_2=updown_2-(_vy(c_2)*_cos(az_2)-_vx(c_2)*_sin(az_2))*_cos(_ax(c_2))+_vz(c_2)*_sin(_ax(c_2))-(_y(c_2)-height_2)*_cos(az_2) updownc_2=updown_2 // ヨー制御 // if(yawc_2<-180){yawc_2=yawc_2+360} if(yawc_2>180){yawc_2=yawc_2-360} yaw_2=yawc_2-_todeg(_ay(c_2)) if(yaw_2<-180){yaw_2=yaw_2+360} if(yaw_2>180){yaw_2=yaw_2-360} if(_abs(yaw_2)>5){yaw_2=_sgn(yaw_2)*5} yaw_2=yaw_2/10 if(_abs(yaw_2)>0.5){yaw_2=_sgn(yaw_2)*0.5} powa_2=pow_2*(1-yaw_2) powb_2=pow_2*(1+yaw_2) // ピッチ&ロール制御 // pitch_2=(_todeg(_ax(c_2))+pitchc_2)/2 roll_2=_todeg(az_2)/2 // ロータの回転制御 a=powa_2-powa0_2 if(_abs(a)>2){powa_2=powa0_2+_sgn(a)*2} rota_2=_mod(rota_2,360)+powa_2 powa0_2=powa_2 b=powb_2-powb0_2 if(_abs(b)>2){powb_2=powb0_2+_sgn(b)*2} rotb_2=_mod(rotb_2,360)+powb_2 powb0_2=powb_2 // サイクリックピッチ // // ロータのローカルAy回転角を求める ay_ra=_torad(rota_2) ay_rb=-_torad(rotb_2) // アングルリミッタ if(_abs(updown_2)>30){updown_2=_sgn(updown_2)*30} if(_abs(pitch_2)>45){pitch_2=_sgn(pitch_2)*45} if(_abs(roll_2)>45){roll_2=_sgn(roll_2)*45} // ロータアングル最終値 u=updown_2+90 pra=pitch_2*_cos(ay_ra)+roll_2*_sin(ay_ra) prb=pitch_2*_cos(ay_rb)+roll_2*_sin(ay_rb) ra0_2=u-pra ra1_2=u+pra rb0_2=u-prb rb1_2=u+prb // 翼角度 rangle_2=45+_abs(pitchc_2) // heli_3 script ////////////////////////////////////////////////////////////// // _az(c_3)の補正 // az_3=_az(c_3) azs_3=_y(roof_3)-_y(c_3) if(azs_3<0){az_3=_sgn(az_3)*_pi()-az_3} // ターゲット座標の更新 if(sec=0)|(dst_3<50)|(tgt_y_3<10){ tgt_x_3=_int(_rnd()*1000-500) tgt_y_3=_int(_rnd()*150+50) tgt_z_3=_int(_rnd()*1000-500) } if(_h(c_3)>=0)&(hflag_3=0){ tgt_y_3=_y(c_3)+_int(_rnd()*150+50) hflag_3=1 } if(_h(c_3)<0){ hflag_3=0 } lx=tgt_x_3-_x(c_3) ly=tgt_y_3-_y(c_3) lz=tgt_z_3-_z(c_3) dst_3=_len3(lx,ly,lz) pow_3=30 height_3=_y(c_3)+ly if(_abs(ly)>=10){ pitchc_3=0 goto manual_3 } yawc_3=_todeg(_atan2(-lx,-lz)) yaw_3=yawc_3-_todeg(_ay(c_3)) if(yaw_3<-180){yaw_3=yaw_3+360} if(yaw_3>180){yaw_3=yaw_3-360} a=_abs(yaw_3) b=_abs(_wy(c_3)) if(a<30)&(b<40){ pitchc_3=pitchc_3+_sgn(dst_3-pitchc_3) } if(a>=30)|(b>=40){ pitchc_3=0 } label manual_3 // 上昇下降制御 // updown_3=updown_3-(_vy(c_3)*_cos(az_3)-_vx(c_3)*_sin(az_3))*_cos(_ax(c_3))+_vz(c_3)*_sin(_ax(c_3))-(_y(c_3)-height_3)*_cos(az_3) updownc_3=updown_3 // ヨー制御 // if(yawc_3<-180){yawc_3=yawc_3+360} if(yawc_3>180){yawc_3=yawc_3-360} yaw_3=yawc_3-_todeg(_ay(c_3)) if(yaw_3<-180){yaw_3=yaw_3+360} if(yaw_3>180){yaw_3=yaw_3-360} if(_abs(yaw_3)>5){yaw_3=_sgn(yaw_3)*5} yaw_3=yaw_3/10 if(_abs(yaw_3)>0.5){yaw_3=_sgn(yaw_3)*0.5} powa_3=pow_3*(1-yaw_3) powb_3=pow_3*(1+yaw_3) // ピッチ&ロール制御 // pitch_3=(_todeg(_ax(c_3))+pitchc_3)/2 roll_3=_todeg(az_3)/2 // ロータの回転制御 a=powa_3-powa0_3 if(_abs(a)>2){powa_3=powa0_3+_sgn(a)*2} rota_3=_mod(rota_3,360)+powa_3 powa0_3=powa_3 b=powb_3-powb0_3 if(_abs(b)>2){powb_3=powb0_3+_sgn(b)*2} rotb_3=_mod(rotb_3,360)+powb_3 powb0_3=powb_3 // サイクリックピッチ // // ロータのローカルAy回転角を求める ay_ra=_torad(rota_3) ay_rb=-_torad(rotb_3) // アングルリミッタ if(_abs(updown_3)>30){updown_3=_sgn(updown_3)*30} if(_abs(pitch_3)>45){pitch_3=_sgn(pitch_3)*45} if(_abs(roll_3)>45){roll_3=_sgn(roll_3)*45} // ロータアングル最終値 u=updown_3+90 pra=pitch_3*_cos(ay_ra)+roll_3*_sin(ay_ra) prb=pitch_3*_cos(ay_rb)+roll_3*_sin(ay_rb) ra0_3=u-pra ra1_3=u+pra rb0_3=u-prb rb1_3=u+prb // 翼角度 rangle_3=45+_abs(pitchc_3) // 表示 /////////////////////////////////////////////////////////////////////// print 0,"Up/Down:Pitch, Left/Right:Roll, Z/C:Yaw, X:Jet-On, D:Jet-Off print 1,"A:Auto-Pilot, S:Balance print 2,"Time=",hour,":",min,":",sec,", FPS=",_fps() // print 3,"Vel=",_vel(0),", Distance=",dst // print 4,"x=",_x(0),", y=",_y(0),", z=",_z(0) // print 5,"ax=",_todeg(_ax(0)),", ay=",_todeg(_ay(0)),", az=",_todeg(_az(0)),", az=",_todeg(az),", azs=",_sgn(azs) // print 5,"ax=",_ax(0),", ay=",_ay(0),", az=",_az(0),", az=",az,", azs=",_sgn(azs) // print 6,"vx=",_vx(0),", vy=",_vy(0),", vz=",_vz(0) // print 7,"lx=",lx,", ly=",ly,", lz=",lz // print 8,"cr=",cr,", cp=",cp,", cy=",cy // print 9,"CCD=",_ccd(32,32),", R=",_red(32,32),", G=",_green(32,32),", B=",_blue(32,32) }