// R.R val{ steerl(default=0,min=-45,max=45,step=5,disp=0) steerr(default=0,min=-45,max=45,step=5,disp=0) brkfl(default=0,min=0,max=1000,step=1000,disp=1) brkfr(default=0,min=0,max=1000,step=1000,disp=1) brkrl(default=0,min=0,max=1000,step=1000,disp=1) brkrr(default=0,min=0,max=1000,step=1000,disp=1) pow(default=0,min=-10000,max=250000,step=1000000,disp=1) powfl(default=0,min=-40000,max=500000,step=0,disp=1) powfr(default=0,min=-40000,max=500000,step=0,disp=1) powrl(default=0,min=-20000,max=250000,step=0,disp=1) powrr(default=0,min=-20000,max=250000,step=0,disp=1) trqfl(default=1,min=0,max=1,step=0,disp=1) trqfr(default=1,min=0,max=1,step=0,disp=1) trqrl(default=1,min=0,max=1,step=0,disp=1) trqrr(default=1,min=0,max=1,step=0,disp=1) dmpf(default=0.2,disp=0) sprf(default=0.2,disp=0) dmpr(default=0.3,disp=0) sprr(default=0.3,disp=0) dmp(default=0.5,disp=0) spr(default=0.5,disp=0) col(default=#99ccff,disp=0) } key{ 0:pow(step= 1100) 1:pow(step=-1000) 4:brkfl(step=50),brkfr(step=50),brkrl(step=50),brkrr(step=50) 5:pow(step= 1100) 6:pow(step=-1000) } body{ core(color=col){ w:frame(angle=5,spring=spr,damper=dmp,color=col){ w:chip(angle=-95,spring=spr,damper=dmp,color=col){ n:chip(angle=steerl,spring=spr,damper=dmp,color=col){} s:chip(angle=25,spring=spr,damper=dmp,color=col){} n:rudderf(angle=12,spring=sprf,damper=dmpf,color=col){ n:trim(angle=90,spring=spr,damper=dmp,color=col){ s:chip(angle=14,spring=spr,damper=dmp,color=col){} } n:wheel(name=nwfl,angle=steerl,power=powfl,effect=2.5,spring=spr,damper=dmp,color=col,brake=brkfl){} } s:rudder(angle=-12,spring=sprr,damper=dmpr,color=col){ s:rudder(angle=31,spring=spr,damper=dmp,color=col){ e:chip(angle=-100,spring=spr,damper=dmp,color=col){} } s:wheel(name=nwrl,angle=0,power=powrl,effect=3,spring=spr,damper=dmp,color=col,brake=brkrl){} } } } e:frame(angle=5,spring=spr,damper=dmp,color=col){ e:chip(angle=-95,spring=spr,damper=dmp,color=col){ n:chip(angle=steerr,spring=spr,damper=dmp,color=col){} s:chip(angle=25,spring=spr,damper=dmp,color=col){} n:rudderf(angle=-12,spring=sprf,damper=dmpf,color=col){ n:trim(angle=-90,spring=spr,damper=dmp,color=col){ s:chip(angle=14,spring=spr,damper=dmp,color=col){} } n:wheel(name=nwfr,angle=steerr,power=-powfr,effect=2.5,spring=spr,damper=dmp,color=col,brake=brkfr){} } s:rudder(angle=12,spring=sprr,damper=dmpr,color=col){ s:rudder(angle=-31,spring=spr,damper=dmp,color=col){ w:chip(angle=-100,spring=spr,damper=dmp,color=col){} } s:wheel(name=nwrr,angle=0,power=-powrr,effect=3,spring=spr,damper=dmp,color=col,brake=brkrr){} } } } } } Lua{ tgn=0 tgx,tgy,tgz={},{},{} tgs={} restart_num=1 tgx[tgn],tgy[tgn],tgz[tgn]= -0.59, 51.50, -127.77; tgs[tgn]=100; tgn=tgn+1 -- 0000 tgx[tgn],tgy[tgn],tgz[tgn]= 132.26, 51.45, -386.27; tgs[tgn]=100; tgn=tgn+1 -- 0001 tgx[tgn],tgy[tgn],tgz[tgn]= 135.95, 51.50, -440.53; tgs[tgn]=100; tgn=tgn+1 -- 0002 tgx[tgn],tgy[tgn],tgz[tgn]= 112.67, 51.50, -486.03; tgs[tgn]=100; tgn=tgn+1 -- 0003 tgx[tgn],tgy[tgn],tgz[tgn]= 60.11, 51.50, -525.93; tgs[tgn]=100; tgn=tgn+1 -- 0004 tgx[tgn],tgy[tgn],tgz[tgn]= -29.19, 51.50, -573.54; tgs[tgn]= 40; tgn=tgn+1 -- 0005 tgx[tgn],tgy[tgn],tgz[tgn]= -53.00, 51.50, -570.76; tgs[tgn]=100; tgn=tgn+1 -- 0006 tgx[tgn],tgy[tgn],tgz[tgn]= -84.03, 51.51, -508.15; tgs[tgn]=100; tgn=tgn+1 -- 0007 tgx[tgn],tgy[tgn],tgz[tgn]= -98.63, 52.70, -471.95; tgs[tgn]=100; tgn=tgn+1 -- 0008 tgx[tgn],tgy[tgn],tgz[tgn]= -116.71, 53.88, -452.83; tgs[tgn]=100; tgn=tgn+1 -- 0009 tgx[tgn],tgy[tgn],tgz[tgn]= -257.06, 54.35, -411.16; tgs[tgn]=100; tgn=tgn+1 -- 0010 tgx[tgn],tgy[tgn],tgz[tgn]= -299.62, 55.54, -415.28; tgs[tgn]=100; tgn=tgn+1 -- 0011 tgx[tgn],tgy[tgn],tgz[tgn]= -398.89, 62.09, -510.72; tgs[tgn]=100; tgn=tgn+1 -- 0012 tgx[tgn],tgy[tgn],tgz[tgn]= -436.36, 61.47, -531.12; tgs[tgn]=100; tgn=tgn+1 -- 0013 tgx[tgn],tgy[tgn],tgz[tgn]= -514.21, 55.68, -536.71; tgs[tgn]=100; tgn=tgn+1 -- 0014 tgx[tgn],tgy[tgn],tgz[tgn]= -538.40, 52.49, -518.83; tgs[tgn]=100; tgn=tgn+1 -- 0015 tgx[tgn],tgy[tgn],tgz[tgn]= -546.25, 51.50, -475.25; tgs[tgn]=100; tgn=tgn+1 -- 0016 tgx[tgn],tgy[tgn],tgz[tgn]= -541.96, 51.50, -366.68; tgs[tgn]=100; tgn=tgn+1 -- 0017 tgx[tgn],tgy[tgn],tgz[tgn]= -563.70, 51.50, -299.01; tgs[tgn]=100; tgn=tgn+1 -- 0018 tgx[tgn],tgy[tgn],tgz[tgn]= -558.94, 51.82, -203.56; tgs[tgn]=100; tgn=tgn+1 -- 0019 tgx[tgn],tgy[tgn],tgz[tgn]= -549.45, 53.69, -136.47; tgs[tgn]= 1; tgn=tgn+1 -- 0020 tgx[tgn],tgy[tgn],tgz[tgn]= -523.92, 53.70, -124.27; tgs[tgn]= 3; tgn=tgn+1 -- 0021 tgx[tgn],tgy[tgn],tgz[tgn]= -509.74, 53.74, -136.89; tgs[tgn]=100; tgn=tgn+1 -- 0022 tgx[tgn],tgy[tgn],tgz[tgn]= -497.66, 53.88, -147.86; tgs[tgn]=100; tgn=tgn+1 -- 0023 tgx[tgn],tgy[tgn],tgz[tgn]= -445.24, 55.02, -246.43; tgs[tgn]=100; tgn=tgn+1 -- 0024 tgx[tgn],tgy[tgn],tgz[tgn]= -414.24, 55.09, -271.38; tgs[tgn]=100; tgn=tgn+1 -- 0025 tgx[tgn],tgy[tgn],tgz[tgn]= -335.84, 55.49, -279.77; tgs[tgn]=100; tgn=tgn+1 -- 0026 tgx[tgn],tgy[tgn],tgz[tgn]= -185.56, 51.59, -288.28; tgs[tgn]=100; tgn=tgn+1 -- 0027 tgx[tgn],tgy[tgn],tgz[tgn]= -142.60, 51.50, -281.04; tgs[tgn]=100; tgn=tgn+1 -- 0028 tgx[tgn],tgy[tgn],tgz[tgn]= -110.54, 51.50, -256.66; tgs[tgn]=100; tgn=tgn+1 -- 0029 tgx[tgn],tgy[tgn],tgz[tgn]= -102.03, 51.50, -222.11; tgs[tgn]=100; tgn=tgn+1 -- 0030 tgx[tgn],tgy[tgn],tgz[tgn]= -138.57, 51.50, -135.00; tgs[tgn]=100; tgn=tgn+1 -- 0031 tgx[tgn],tgy[tgn],tgz[tgn]= -322.57, 51.56, -71.33; tgs[tgn]=100; tgn=tgn+1 -- 0032 tgx[tgn],tgy[tgn],tgz[tgn]= -379.79, 52.85, -68.03; tgs[tgn]=100; tgn=tgn+1 -- 0033 tgx[tgn],tgy[tgn],tgz[tgn]= -499.40, 57.79, 0.68; tgs[tgn]=100; tgn=tgn+1 -- 0034 tgx[tgn],tgy[tgn],tgz[tgn]= -513.21, 57.88, 28.06; tgs[tgn]=100; tgn=tgn+1 -- 0035 tgx[tgn],tgy[tgn],tgz[tgn]= -521.27, 56.95, 122.75; tgs[tgn]=100; tgn=tgn+1 -- 0036 tgx[tgn],tgy[tgn],tgz[tgn]= -576.54, 58.70, 239.63; tgs[tgn]=100; tgn=tgn+1 -- 0037 tgx[tgn],tgy[tgn],tgz[tgn]= -572.33, 58.70, 280.08; tgs[tgn]= 50; tgn=tgn+1 -- 0038 tgx[tgn],tgy[tgn],tgz[tgn]= -539.29, 58.67, 301.50; tgs[tgn]= 20; tgn=tgn+1 -- 0039 tgx[tgn],tgy[tgn],tgz[tgn]= -497.78, 57.03, 297.10; tgs[tgn]= 20; tgn=tgn+1 -- 0040 tgx[tgn],tgy[tgn],tgz[tgn]= -467.52, 56.62, 297.26; tgs[tgn]=100; tgn=tgn+1 -- 0041 tgx[tgn],tgy[tgn],tgz[tgn]= -359.75, 51.50, 273.73; tgs[tgn]=100; tgn=tgn+1 -- 0042 tgx[tgn],tgy[tgn],tgz[tgn]= -330.08, 51.50, 252.57; tgs[tgn]=100; tgn=tgn+1 -- 0043 tgx[tgn],tgy[tgn],tgz[tgn]= -307.59, 51.50, 211.05; tgs[tgn]=100; tgn=tgn+1 -- 0044 tgx[tgn],tgy[tgn],tgz[tgn]= -305.70, 50.70, 124.10; tgs[tgn]=100; tgn=tgn+1 -- 0045 tgx[tgn],tgy[tgn],tgz[tgn]= -280.41, 51.04, 55.88; tgs[tgn]=100; tgn=tgn+1 -- 0046 tgx[tgn],tgy[tgn],tgz[tgn]= -247.80, 51.50, 40.73; tgs[tgn]=100; tgn=tgn+1 -- 0047 tgx[tgn],tgy[tgn],tgz[tgn]= -92.28, 51.50, 6.61; tgs[tgn]=100; tgn=tgn+1 -- 0048 tgx[tgn],tgy[tgn],tgz[tgn]= -52.91, 51.50, -39.99; tgs[tgn]=100; tgn=tgn+1 -- 0049 dst0=99999999 check=0 auto=0 line=0 pow0=0 CL_R,CL_G,CL_B=0,0,0 CC_R,CC_G,CC_B=1,2,3 BRKFL,BRKFR,BRKRL,BRKRR=0,0,0,0 GXX0,GXY0,GXZ0=_XX(0),_XY(0),_XZ(0) GYX0,GYY0,GYZ0=_YX(0),_YY(0),_YZ(0) GZX0,GZY0,GZZ0=_ZX(0),_ZY(0),_ZZ(0) GWX,GWY,GWZ=_WX(0),_WY(0),_WZ(0) -- COLOR CHANGE --------------------------------------------------------------- function col_change(r,g,b,rc,gc,bc) if(r==0) then rc=math.floor(math.random()*15)+1 elseif(r==255) then rc=-math.floor(math.random()*15)-1 end if(g==0) then gc=math.floor(math.random()*15)+1 elseif(g==255) then gc=-math.floor(math.random()*15)-1 end if(b==0) then bc=math.floor(math.random()*15)+1 elseif(b==255) then bc=-math.floor(math.random()*15)-1 end r=math.min(255,math.max(0,r+rc)) g=math.min(255,math.max(0,g+gc)) b=math.min(255,math.max(0,b+bc)) return r*65536+g*256+b,r,g,b,rc,gc,bc 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 q_mul(q0,q1) local q={} q[0]=q0[0]*q1[0]-q0[1]*q1[1]-q0[2]*q1[2]-q0[3]*q1[3] q[1]=q0[0]*q1[1]+q1[0]*q0[1]+q0[2]*q1[3]-q0[3]*q1[2] q[2]=q0[0]*q1[2]+q1[0]*q0[2]+q0[3]*q1[1]-q0[1]*q1[3] q[3]=q0[0]*q1[3]+q1[0]*q0[3]+q0[1]*q1[2]-q0[2]*q1[1] return q end -- 姿勢ベクトル→クォータニオン変換 ------------------------------------------- function cal_quaternion(v) local xx,xy,xz=v[1][1],v[1][2],v[1][3] local yx,yy,yz=v[2][1],v[2][2],v[2][3] local zx,zy,zz=v[3][1],v[3][2],v[3][3] local x=math.max(0,1+xx-yy-zz)/4 local y=math.max(0,1-xx+yy-zz)/4 local z=math.max(0,1-xx-yy+zz)/4 local w=math.max(0,1-x-y-z) w,x,y,z=math.sqrt(w),math.sqrt(x),math.sqrt(y),math.sqrt(z) if(zy-yz<0) then x=-x end if(xz-zx<0) then y=-y end if(yx-xy<0) then z=-z end return w,-x,-y,-z end -- クォータニオンから角速度ベクトルを求める ----------------------------------- function cal_avel(q) local s=math.sqrt(math.max(0,1-q[1]^2)) local c=math.acos(q[1])*2 local wx,wy,wz if(s>0) then c=c/s wx,wy,wz=q[2]*c,q[3]*c,q[4]*c else wx,wy,wz=0,0,0 end return wx,wy,wz end -- 物理量計算 ----------------------------------------------------------------- function cal_physics(cn) local axis={{getlvec(GXX0,GXY0,GXZ0,cn)}, {getlvec(GYX0,GYY0,GYZ0,cn)}, {getlvec(GZX0,GZY0,GZZ0,cn)}} local q={cal_quaternion(axis)} local wx,wy,wz=cal_avel(q) wx,wy,wz=-wx*30,-wy*30,-wz*30 GWX,GBX,GXX0,GXY0,GXZ0=wx,(wx-GWX)*30,_XX(cn),_XY(cn),_XZ(cn) GWY,GBY,GYX0,GYY0,GYZ0=wy,(wy-GWY)*30,_YX(cn),_YY(cn),_YZ(cn) GWZ,GBZ,GZX0,GZY0,GZZ0=wz,(wz-GWZ)*30,_ZX(cn),_ZY(cn),_ZZ(cn) end ------------------------------------------------------------------------------- function main() cal_physics(0) local t=math.randomseed(1) if(_KEY(14)>0) then t=_SPLIT(C_0) end local vel=-_VZ(C_0) local sp=math.sqrt(_VX(C_0)^2+_VY(C_0)^2+_VZ(C_0)^2)*3.6 local wfl= _WY(NWFL) local wfr=-_WY(NWFR) local wrl= _WY(NWRL) local wrr=-_WY(NWRR) local trq=7 local brk=0 if(_KEYDOWN(10)>0) then if(line==0) then line=1 else line=0 end end if(_KEYDOWN(13)>0) then if(auto==0) then auto=1 else auto=0 end end if(_KEY(14)>0)or(_KEYDOWN(7)>0) then check=math.mod(check+tgn-1,tgn) end if(_KEYDOWN(15)>0) then check=0 end if(_KEY(16)>0)or(_KEYDOWN(9)>0) then check=math.mod(check+1,tgn) end -- Search if(_KEYDOWN(8)>0) then local n,d=0,1000000 local i,l for i=0,tgn-1 do l=math.sqrt((_X(C_0)-tgx[i])^2+(_Y(C_0)-tgy[i])^2+(_Z(C_0)-tgz[i])^2) if(l0) then local lx,ly,lz,dst while true do lx=tgx[check]-_X(C_0) ly=tgy[check]-_Y(C_0) lz=tgz[check]-_Z(C_0) dst=math.sqrt(lx^2+ly^2+lz^2) if(dst*4.55000) then pow0=pow0*1.01+500 else pow0=pow0*1.01+10 end local maxsp=tgs[check] local lim=math.min((550-sp)*maxsp,math.max(-(550-sp)*50,pow0)) if(lim>0)and(pow0>lim) then pow0=(pow0-500)*0.95 if(pow0-lim>5000) then brk=1 -- BRKFL=BRKFL+50 -- BRKFR=BRKFR+50 BRKRL=BRKRL+50 BRKRR=BRKRR+50 TRQRL=0 TRQRR=0 end elseif(lim<0)and(pow0-1)and(vel<1) then if(vel>=0) then vel=1 else vel=-1 end end local rfl=wfl/vel local rfr=wfr/vel local rrl=wrl/vel local rrr=wrr/vel -- STEERING t=math.min(5,16/math.sqrt(math.abs(vel))) if(_KEY(2)>0) then STEERL=STEERL+t STEERR=STEERR-t end if(_KEY(3)>0) then STEERL=STEERL-t STEERR=STEERR+t end -- ABS if(_KEY(4)~=0) then local v=math.abs(vel)*0.3 if(rfl<2) then BRKFL=BRKFL*0.1 else BRKFL=BRKFL+v end if(rfr<2) then BRKFR=BRKFR*0.1 else BRKFR=BRKFR+v end if(rrl<2) then BRKRL=BRKRL*0.1 else BRKRL=BRKRL+v end if(rrr<2) then BRKRR=BRKRR*0.1 else BRKRR=BRKRR+v end BRKFL=BRKFL*0.5 BRKFR=BRKFR*0.5 elseif(brk>0) then local v=math.abs(vel)*0.3 if(rrl<2) then BRKRL=BRKRL*0.1 else BRKRL=BRKRL+v end if(rrr<2) then BRKRR=BRKRR*0.1 else BRKRR=BRKRR+v end end -- TRC t=trq if(sp>20)and((rfl>t)or(rfr>t)or(rrl>t)or(rrr>t)) then TRQFL=math.max(0.01,TRQFL*0.95) TRQFR=math.max(0.01,TRQFR*0.95) TRQRL=math.max(0.01,TRQRL*0.95) TRQRR=math.max(0.01,TRQRR*0.95) elseif(sp>20)and((rfl<-1)or(rfr<-1)or(rrl<-1)or(rrr<-1)) then TRQFL,TRQFR,TRQRL,TRQRR=0,0,0,0 elseif(_H(NWFL)>0.6)or(_H(NWFR)>0.6)or(_H(NWRL)>0.6)or(_H(NWRR)>0.6) then TRQFL,TRQFR,TRQRL,TRQRR=0,0,0,0 elseif(_H(NWFL)<0)or(_H(NWFR)<0)or(_H(NWRL)<0)or(_H(NWRR)<0) then TRQFL,TRQFR,TRQRL,TRQRR=0,0,0,0 elseif(math.abs(_EZ(C_0))>1.5) then TRQFL,TRQFR,TRQRL,TRQRR=0,0,0,0 else TRQFL=math.max(0.01,TRQFL*1.01+0.01) TRQFR=math.max(0.01,TRQFR*1.01+0.01) TRQRL=math.max(0.01,TRQRL*1.01+0.01) TRQRR=math.max(0.01,TRQRR*1.01+0.01) end -- POWCAL if(_KEY(0)>0)or(_KEY(1)>0) then POW=math.min(5000,math.max(-5000,POW)) end if(_KEY(5)>0)and(_H(NWFL)<0.35)and(_H(NWFR)<0.35) then POW=POW*(1+sp/80) POW=math.min(60000,math.max(-60000,POW)) end POWFL=POW*TRQFL*2 POWFR=POW*TRQFR*2 POWRL=POW*TRQRL POWRR=POW*TRQRR -- COLOR COL,CL_R,CL_G,CL_B,CC_R,CC_G,CC_B=col_change(CL_R,CL_G,CL_B,CC_R,CC_G,CC_B) out(0,string.format("FPS=%.2f, Chips=%d, Weight=%.2f[kg]",_FPS(),_CHIPS(),_WEIGHT())) out(1,string.format("Speed=%.2f[km/h], Vz=%.2f[m/s]",sp,vel)) -- out(2,string.format("F-Speed=%.2f[km/h], Vz=%.2f[m/s]",sp*_FPS()/30,vel*_FPS()/30)) out(3,string.format("X= %+.2f, Y= %+.2f, Z= %+.2f",_X(C_0),_Y(C_0),_Z(C_0))) out(4,string.format("TGT-No.%03d [Q<D>>E, 0:W, Search:S]",check)) -- out(5,string.format("TX=%+.2f, TY=%+.2f, TZ=%+.2f",tgx[check],tgy[check],tgz[check])) if(line>0) then out(6,"LINE[V] : ON") _SETCOLOR(COL) _MOVE3D(_GX(0),_GY(0),_GZ(0)) _LINE3D(tgx[check],tgy[check],tgz[check]) else out(6,"LINE[V] : OFF") end if(auto>0) then out(7,"AUTO[G] : ON") else out(7,"AUTO[G] : OFF") end -- out(7,"WFL=",wfl,", WFR=",wfr,", WRL=",wrl,", WRR=",wrr) -- out(8,"RFL=",rfl,", RFR=",rfr,", RRL=",rrl,", RRR=",rrr) end }