//heli val{ brake(default=1000,min=0,max=1000,step=0) pow (default=0,min=0,max= 100000,step=0) powa(default=0,min=0,max=1000000,step=0) powb(default=0,min=0,max=1000000,step=0) powf(default=0,min=0,max=1,step=0,disp=0) updown(default=0,min=-45,max=45,step=0) updownc(default=0,min=-45,max=45,step=0) height(default=0,min=-10000,max=10000,step=0) yaw (default=0,min=-360,max=360,step=0) yawc(default=0,min=-360,max=360,step=0) pitch (default=0,min=-45,max=45,step=0) pitchc(default=0,min=-45,max=45,step=0) roll (default=0,min=-45,max=45,step=0) rollc (default=0,min=-45,max=45,step=0) ra0(default=0,min=-45,max=45,step=0,disp=0) ra1(default=0,min=-45,max=45,step=0,disp=0) ra2(default=0,min=-45,max=45,step=0,disp=0) ra3(default=0,min=-45,max=45,step=0,disp=0) rb0(default=0,min=-45,max=45,step=0,disp=0) rb1(default=0,min=-45,max=45,step=0,disp=0) rb2(default=0,min=-45,max=45,step=0,disp=0) rb3(default=0,min=-45,max=45,step=0,disp=0) rangle(default=45,min=0,max=90,step=0,disp=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) hflag(default=0,min=0,max=1,step=0,disp=0) sflag(default=0,min=0,max=1000,step=0,disp=0) auto(default=0,min=0,max=1,step=0,disp=0) auto1(default=0,min=0,max=1,step=0,disp=0) col(default=0,min=0,max=16777215,step=0,disp=0) } key{ 0:pitchc(step=1) 1:pitchc(step=-1) 2:rollc(step=-1) 3:rollc(step=1) 4:yawc(step=-2) 6:yawc(step=2) 5:updownc(step=1) 8:updownc(step=-1) } body{ core(){ n:frame(angle=90){ s:wheel(angle=90,power=powa,brake=brake,name=ra){ n:trim(angle=-ra0){ n:chip(){ n:chip(){ } } } w:trim(angle=-ra1){ w:chip(){ w:chip(){ } } } s:trim(angle=-ra2){ s:chip(){ s:chip(){ } } } e:trim(angle=-ra3){ e:chip(){ e:chip(){ } } } } s:wheel(angle=90,power=-powb,brake=brake,name=rb){ n:trim(angle=rb0){ n:chip(){ n:chip(){ } } } w:trim(angle=rb1){ w:chip(){ w:chip(){ } } } s:trim(angle=rb2){ s:chip(){ s:chip(){ } } } e:trim(angle=rb3){ e:chip(){ e:chip(){ } } } } n:frame(){ w:chip(angle=-rangle,color=#0000FF){ } e:chip(angle=-rangle,color=#0000FF){ } } } s:frame(angle=90){ s:frame(){ w:chip(angle=-rangle,color=#FF0000){ } e:chip(angle=-rangle,color=#FF0000){ } } s:cowl(angle=90,option=5,color=col,name=foot){ } } } } script{ t=_rnd() // 時間表示 // sec=_mod(_ticks()/30,60) hmin=_int(_ticks()/86400)+_mod(_int(_ticks()/1800),60)/100 // _az()の補正 // azs=_y(0)-_y(foot) az=_az(0) if(azs<0){az=_sgn(az)*_pi()-az} aza=_az(ra) if(azs<0){aza=_sgn(aza)*_pi()-aza} azb=_az(rb) if(azs<0){azb=_sgn(azb)*_pi()-azb} // autoフラグ if(_key(7)>0){auto=1-auto1} if(_key(7)=0){auto1=auto} // 手動制御ならジャンプ col=0 if(_mod(sec,2)<1){col=255} if(auto=0){ yaw=yawc-_todeg(_ay(0)) goto manual } // ターゲット座標の更新 if(sec=0)|(dst<50)|(tgt_y<10){ tgt_x=_int(_rnd()*1000-500) tgt_y=_int(_rnd()*450+50) tgt_z=_int(_rnd()*1000-500) } if(_h(0)>=0)&(hflag=0){ tgt_y=_y(0)+_int(_rnd()*150+50) hflag=1 } if(_h(0)<0){ hflag=0 } lx=tgt_x-_x(0) ly=tgt_y-_y(0) lz=tgt_z-_z(0) dst=_len3(lx,ly,lz) // 色変え t=_int(dst)/10+10 col=0 if(_mod(sec,t)=30)|(_abs(_wy(0))>=30){ pitchc=0 } label manual // 出力制御 // if(_key(9)>0){pow=100000*(1-powf)} if(_key(9)=0){powf=_sgn(pow)} if(pow=0){ updown=0 height=_y(0) yawc=_ay(0) brake=brake+100 } if(pow>0){brake=0} // 上昇下降制御 // if(_key(5)=0)&(_key(8)=0){ updown=updown-4*((_vy(0)*_cos(az)-_vx(0)*_sin(az))*_cos(_ax(0))-_vz(0)*_sin(_ax(0))+(_y(0)-height)*_cos(az)*_cos(_ax(0))) updownc=updown } if(_key(5)>0)|(_key(8)>0){ updownc=updownc*((_key(5)>0)*(updownc>=0)+(_key(8)>0)*(updownc<=0)) updown=updownc height=_y(0) } // ヨー制御 // label loop2 if(_abs(yaw)>180){ yaw=yaw-_sgn(yaw)*360 goto loop2 } yaw=0.4*(0.5-1/(1+_exp(yaw*0.1))) powa=pow*(1-yaw) powb=pow*(1+yaw) // ピッチ&ロール制御 // // 水平に戻す if(_key(4)>0)&(_key(6)>0){ pitchc=0 rollc=0 } // 前後左右の組み合わせで傾け過ぎないようにする p=_torad(pitchc) r=_torad(rollc) x=_sin(r) y=_abs(_cos(r)*_cos(p)) z=_cos(r)*_sin(p) a=_len2(x,z) if(y=a){ p=pitchc r=rollc } pitch=(_todeg(_ax(0))+p)/2 roll=(_todeg(az)+r)/2 // サイクリックピッチ // // コアを基準としたローカル平面上のL(0,0,-100)のグローバル座標G(bx,by,bz)を求める z=-100 bz=z*_cos(_ax(0))*_cos(_ay(0)) by=-z*_sin(_ax(0)) bx=z*_cos(_ax(0))*_sin(_ay(0)) // グローバル座標G(bx,by,bz)のロータAを基準としたローカル平面上の座標を求める ly=by lz=-bz lx=-bx z=lz*_cos(_ay(ra))+lx*_sin(_ay(ra)) x=lx*_cos(_ay(ra))-lz*_sin(_ay(ra)) lz=-z lx=-x lz=-lz z=lz*_cos(_ax(ra))+ly*_sin(_ax(ra)) y=ly*_cos(_ax(ra))-lz*_sin(_ax(ra)) lz=-z ly=y y=ly*_cos(aza)+lx*_sin(aza) x=lx*_cos(aza)-ly*_sin(aza) ly=y lx=x // ロータAのローカルAy ay_ra=_atan2(lx,-lz) // グローバル座標G(bx,by,bz)のロータBを基準としたローカル平面上の座標を求める ly=by lz=-bz lx=-bx z=lz*_cos(_ay(rb))+lx*_sin(_ay(rb)) x=lx*_cos(_ay(rb))-lz*_sin(_ay(rb)) lz=-z lx=-x lz=-lz z=lz*_cos(_ax(rb))+ly*_sin(_ax(rb)) y=ly*_cos(_ax(rb))-lz*_sin(_ax(rb)) lz=-z ly=y y=ly*_cos(azb)+lx*_sin(azb) x=lx*_cos(azb)-ly*_sin(azb) ly=y lx=x // ロータBのローカルAy ay_rb=_atan2(lx,-lz) // アングルリミッタ updown=90*(0.5-1/(1+_exp(updown/20))) pitch=60*(0.5-1/(1+_exp(pitch/5))) roll=60*(0.5-1/(1+_exp(roll/5))) // ロータアングル最終値 pra0=pitch*_cos(ay_ra)+roll*_sin(ay_ra) pra1=pitch*_cos(ay_ra-_pi()/2)+roll*_sin(ay_ra-_pi()/2) prb0=pitch*_cos(ay_rb)+roll*_sin(ay_rb) prb1=pitch*_cos(ay_rb-_pi()/2)+roll*_sin(ay_rb-_pi()/2) ra0=updown-pra0 ra1=updown-pra1 ra2=updown+pra0 ra3=updown+pra1 rb0=updown-prb0 rb1=updown-prb1 rb2=updown+prb0 rb3=updown+prb1 // 翼角度 rangle=45+_abs(pitchc)-_abs(rollc) print 0,"Up/Down:Pitch, Left/Right:Roll, Z/C:Yaw, X/S:Up/Down, Z+C:Partial if(pow>0)&(auto>0){ print 1,"D:Engine[ON], A:Auto-Pilot[ON] } if(pow>0)&(auto=0){ print 1,"D:Engine[ON], A:Auto-Pilot[OFF] } if(pow=0)&(auto>0){ print 1,"D:Engine[OFF], A:Auto-Pilot[ON] } if(pow=0)&(auto=0){ print 1,"D:Engine[OFF], A:Auto-Pilot[OFF] } print 2,"Vel=",_vel(0),", Speed=",_vel(0)*3.6,", Distance=",dst print 3,"x=",_x(0),", y=",_y(0),", z=",_z(0) print 4,"ax=",_todeg(_ax(0)),", ay=",_todeg(_ay(0)),", az=",_todeg(_az(0)),", az=",_todeg(az),", azs=",_sgn(azs) print 5,"vx=",_vx(0),", vy=",_vy(0),", vz=",_vz(0) print 6,"wx=",_wx(0),", wy=",_wy(0),", wz=",_wz(0) if(sec<10){print 7,"Time=",hmin,".0",sec,", FPS=",_fps()} if(sec>=10){print 7,"Time=",hmin,".",sec,", FPS=",_fps()} }