//heli val{ rota_1(default=0,min=-1000,max=1000,step=0) rotb_1(default=0,min=-1000,max=1000,step=0) pow_1 (default=0,min=0,max=50,step=0) powa_1 (default=0,min=0,max=50,step=0) powb_1 (default=0,min=0,max=50,step=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=-45,max=45,step=0) updownc_1(default=0,min=-45,max=45,step=0) height_1(default=0,min=-10000,max=10000,step=0) yaw_1 (default=0,min=-360,max=360,step=0) yawc_1(default=0,min=-360,max=360,step=0) pitch_1 (default=0,min=-45,max=45,step=0) pitchc_1(default=0,min=-45,max=45,step=0) roll_1 (default=0,min=-45,max=45,step=0) rollc_1 (default=0,min=-45,max=45,step=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) col_1(default=16777215,min=0,max=16777215,step=0,disp=0) tgt_x_1(default=0,min=-100000,max=100000,step=0) tgt_y_1(default=0,min=-100000,max=100000,step=0) tgt_z_1(default=0,min=-100000,max=100000,step=0) dst_1(default=0,min=0,max=100000,step=0,disp=1) hflag_1(default=0,min=0,max=1,step=0,disp=0) sflag_1(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) } 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,color=col_1){ w:frame(angle=-120,color=col_1){ w:frame(angle=30,color=col_1){ w:trimf(angle=-rota_1,color=col_1){ n:trim(angle=-ra0_1,color=col_1){n:chip(color=col_1){n:chip(color=col_1){n:chip(color=col_1){}}}} s:trim(angle=-ra1_1,color=col_1){s:chip(color=col_1){s:chip(color=col_1){s:chip(color=col_1){}}}} } w:trimf(angle=rotb_1,color=col_1){ n:trim(angle=rb0_1,color=col_1){n:chip(color=col_1){n:chip(color=col_1){n:chip(color=col_1){}}}} s:trim(angle=rb1_1,color=col_1){s:chip(color=col_1){s:chip(color=col_1){s:chip(color=col_1){}}}} } } } e:frame(angle=-120,color=col_1){} n:frame(angle=-90,color=col_1){w:chip(angle=rangle_1,color=col_1){}e:chip(angle=rangle_1,color=col_1){}} s:frame(angle=-90,color=col_1){w:chip(angle=rangle_1,color=col_1){}e:chip(angle=rangle_1,color=col_1){}s:cowl(angle=-90,option=5,name=roof_1,color=col_1){}} } } script{ t=_rnd() // 時間表示 // sec=_mod(_ticks()/30,60) hmin=_int(_ticks()/86400)+_mod(_int(_ticks()/1800),60)/100 // _az(c_1)の補正 // az_1=_az(c_1) azs=_y(roof_1)-_y(c_1) if(azs<0){az_1=_sgn(az_1)*_pi()-az_1} // autoフラグ if(_key(7)>0){auto=1-auto1} if(_key(7)=0){auto1=auto} // 手動制御ならジャンプ if(auto=0){ yaw_1=yawc_1-_todeg(_ay(c_1)) goto manual_1 } // ターゲット座標の更新 if(sec=0)|(dst_1<50)|(tgt_y_1<10){ tgt_x_1=_int(_rnd()*1000-500) tgt_y_1=_int(_rnd()*450+50) tgt_z_1=_int(_rnd()*1000-500) // 色変え col_1=_int(_rnd()*256)*65536+_int(_rnd()*256)*256+_int(_rnd()*256) } 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) // 接触時出力0 pow_1=30 sflag_1=_mod(sflag_1+1,100) if(azs<0)&(sflag_1<50){pow_1=0} height_1=_y(c_1)+ly rollc_1=0 // 自機のY軸回転を差し引く(-AYだけ回転させる) z=lz*_cos(_ay(c_1))+lx*_sin(_ay(c_1)) x=lx*_cos(_ay(c_1))-lz*_sin(_ay(c_1)) lz=z lx=x yaw_1=_todeg(_atan2(-lx,-lz)) if(_abs(yaw_1)<30)&(_abs(_wy(c_1))<30){ pitchc_1=pitchc_1+_sgn(_todeg(_atan2(-lz,ly))-pitchc_1) } if(_abs(yaw_1)>45)|(_abs(_wy(c_1))>45){ pitchc_1=0 } label manual_1 // 出力制御 // if(_key(9)>0){pow_1=30*(1-powf_1)} if(_key(9)=0){powf_1=_sgn(pow_1)} if(pow_1=0){ updown_1=0 height_1=_y(c_1) yawc_1=_ay(c_1) } // 上昇下降制御 // if(_key(5)=0)&(_key(8)=0){ updown_1=updown_1-4*((_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)*_cos(_ax(c_1))) updownc_1=updown_1 } if(_key(5)>0)|(_key(8)>0){ updownc_1=updownc_1*((_key(5)>0)*(updownc_1>=0)+(_key(8)>0)*(updownc_1<=0)) updown_1=updownc_1 height_1=_y(c_1) } // ヨー制御 // label loop2_1 if(_abs(yaw_1)>180){ yaw_1=yaw_1-_sgn(yaw_1)*360 goto loop2_1 } yaw_1=0.5-1/(1+_exp(yaw_1*0.5)) powa_1=pow_1*(1-yaw_1) powb_1=pow_1*(1+yaw_1) // ピッチ&ロール制御 // // 水平に戻す if(_key(4)>0)&(_key(6)>0){ pitchc_1=0 rollc_1=0 } // 前後左右の組み合わせで傾け過ぎないようにする p=_torad(pitchc_1) r=_torad(rollc_1) x=_sin(r) y=_abs(_cos(r)*_cos(p)) z=_cos(r)*_sin(p) a=_len2(x,z) if(y=a){ p=pitchc_1 r=rollc_1 } pitch_1=(_todeg(_ax(c_1))+p)/2 roll_1=(_todeg(az_1)+r)/2 // ロータの回転制御 a=powa_1-powa0_1 if(_abs(a)>2){powa_1=powa0_1+_sgn(a)*2} rota_1=_mod(rota_1,360) rota_1=rota_1+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) rotb_1=rotb_1+powb_1 powb0_1=powb_1 // サイクリックピッチ // // ロータのローカルAy回転角を求める ay_ra=_torad(rota_1) ay_rb=-_torad(rotb_1) // アングルリミッタ updown_1=90*(0.5-1/(1+_exp(updown_1/20))) pitch_1=60*(0.5-1/(1+_exp(pitch_1/5))) roll_1=60*(0.5-1/(1+_exp(roll_1/5))) // ロータアングル最終値 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)-_abs(rollc_1) print 0,"Up/Down:Pitch, Left/Right:Roll, Z/C:Yaw, X/S:Up/Down, Z+C:Partial if(pow_1>0)&(auto>0){ print 1,"D:Engine[ON], A:Auto-Pilot[ON] } if(pow_1>0)&(auto=0){ print 1,"D:Engine[ON], A:Auto-Pilot[OFF] } if(pow_1=0)&(auto>0){ print 1,"D:Engine[OFF], A:Auto-Pilot[ON] } if(pow_1=0)&(auto=0){ print 1,"D:Engine[OFF], A:Auto-Pilot[OFF] } print 2,"Vel=",_vel(c_1),", Speed=",_vel(c_1)*3.6,", Distance=",dst_1 print 3,"x=",_x(c_1),", y=",_y(c_1),", z=",_z(c_1) print 4,"ax=",_todeg(_ax(c_1)),", ay=",_todeg(_ay(c_1)),", az=",_todeg(_az(c_1)),", az=",_todeg(az_1),", azs=",_sgn(azs) print 5,"vx=",_vx(c_1),", vy=",_vy(c_1),", vz=",_vz(c_1) print 6,"wx=",_wx(c_1),", wy=",_wy(c_1),", wz=",_wz(c_1) if(sec<10){print 7,"Time=",hmin,".0",sec,", FPS=",_fps()} if(sec>=10){print 7,"Time=",hmin,".",sec,", FPS=",_fps()} }