// For Spa 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=88,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=50,spring=spr,damper=dmp,color=col){ e:chip(angle=-110,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=-88,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=-50,spring=spr,damper=dmp,color=col){ w:chip(angle=-110,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=0 tgx[tgn],tgy[tgn],tgz[tgn]= 31.31, 56.75, -140.06; tgs[tgn]= 300; tgn=tgn+1 -- 0000 tgx[tgn],tgy[tgn],tgz[tgn]= 41.51, 60.87, -202.15; tgs[tgn]= 300; tgn=tgn+1 -- 0001 tgx[tgn],tgy[tgn],tgz[tgn]= 4.79, 74.19, -286.93; tgs[tgn]= 300; tgn=tgn+1 -- 0002 tgx[tgn],tgy[tgn],tgz[tgn]= -19.33, 74.28, -366.08; tgs[tgn]= 300; tgn=tgn+1 -- 0003 tgx[tgn],tgy[tgn],tgz[tgn]= -39.18, 74.28, -493.26; tgs[tgn]= 300; tgn=tgn+1 -- 0004 tgx[tgn],tgy[tgn],tgz[tgn]= -57.17, 74.28, -543.73; tgs[tgn]= 300; tgn=tgn+1 -- 0005 tgx[tgn],tgy[tgn],tgz[tgn]= -293.06, 74.27, -1042.89; tgs[tgn]= 300; tgn=tgn+1 -- 0006 tgx[tgn],tgy[tgn],tgz[tgn]= -367.16, 74.27, -1063.70; tgs[tgn]= 300; tgn=tgn+1 -- 0007 tgx[tgn],tgy[tgn],tgz[tgn]= -422.44, 74.29, -1137.63; tgs[tgn]= 300; tgn=tgn+1 -- 0008 tgx[tgn],tgy[tgn],tgz[tgn]= -456.08, 74.27, -1157.26; tgs[tgn]= 300; tgn=tgn+1 -- 0009 tgx[tgn],tgy[tgn],tgz[tgn]= -674.22, 66.07, -1136.71; tgs[tgn]= 300; tgn=tgn+1 -- 0010 tgx[tgn],tgy[tgn],tgz[tgn]= -701.40, 64.20, -1111.34; tgs[tgn]= 300; tgn=tgn+1 -- 0011 tgx[tgn],tgy[tgn],tgz[tgn]= -694.28, 62.34, -1073.30; tgs[tgn]= 300; tgn=tgn+1 -- 0012 tgx[tgn],tgy[tgn],tgz[tgn]= -663.59, 61.03, -1062.63; tgs[tgn]= 300; tgn=tgn+1 -- 0013 tgx[tgn],tgy[tgn],tgz[tgn]= -576.57, 58.50, -1076.25; tgs[tgn]= 300; tgn=tgn+1 -- 0014 tgx[tgn],tgy[tgn],tgz[tgn]= -538.17, 56.51, -1060.25; tgs[tgn]= 300; tgn=tgn+1 -- 0015 tgx[tgn],tgy[tgn],tgz[tgn]= -492.88, 52.46, -965.46; tgs[tgn]= 300; tgn=tgn+1 -- 0016 tgx[tgn],tgy[tgn],tgz[tgn]= -370.92, 45.81, -758.56; tgs[tgn]= 300; tgn=tgn+1 -- 0017 tgx[tgn],tgy[tgn],tgz[tgn]= -364.45, 44.89, -723.30; tgs[tgn]= 300; tgn=tgn+1 -- 0018 tgx[tgn],tgy[tgn],tgz[tgn]= -387.60, 42.95, -681.63; tgs[tgn]= 300; tgn=tgn+1 -- 0019 tgx[tgn],tgy[tgn],tgz[tgn]= -447.58, 39.11, -626.76; tgs[tgn]= 300; tgn=tgn+1 -- 0020 tgx[tgn],tgy[tgn],tgz[tgn]= -489.75, 36.95, -613.78; tgs[tgn]= 300; tgn=tgn+1 -- 0021 tgx[tgn],tgy[tgn],tgz[tgn]= -744.61, 28.02, -731.25; tgs[tgn]= 300; tgn=tgn+1 -- 0022 tgx[tgn],tgy[tgn],tgz[tgn]= -796.59, 27.99, -723.38; tgs[tgn]= 300; tgn=tgn+1 -- 0023 tgx[tgn],tgy[tgn],tgz[tgn]= -837.81, 27.99, -656.01; tgs[tgn]= 300; tgn=tgn+1 -- 0024 tgx[tgn],tgy[tgn],tgz[tgn]= -874.24, 27.99, -635.03; tgs[tgn]= 300; tgn=tgn+1 -- 0025 tgx[tgn],tgy[tgn],tgz[tgn]= -1033.82, 27.99, -676.63; tgs[tgn]= 300; tgn=tgn+1 -- 0026 tgx[tgn],tgy[tgn],tgz[tgn]= -1071.86, 28.06, -654.06; tgs[tgn]= 300; tgn=tgn+1 -- 0027 tgx[tgn],tgy[tgn],tgz[tgn]= -1092.25, 31.08, -539.96; tgs[tgn]= 300; tgn=tgn+1 -- 0028 tgx[tgn],tgy[tgn],tgz[tgn]= -1078.75, 32.37, -505.59; tgs[tgn]= 300; tgn=tgn+1 -- 0029 tgx[tgn],tgy[tgn],tgz[tgn]= -996.31, 35.58, -458.45; tgs[tgn]= 300; tgn=tgn+1 -- 0030 tgx[tgn],tgy[tgn],tgz[tgn]= -872.92, 39.68, -435.14; tgs[tgn]= 300; tgn=tgn+1 -- 0031 tgx[tgn],tgy[tgn],tgz[tgn]= -763.02, 43.31, -444.98; tgs[tgn]= 300; tgn=tgn+1 -- 0032 tgx[tgn],tgy[tgn],tgz[tgn]= -598.99, 49.26, -485.81; tgs[tgn]= 300; tgn=tgn+1 -- 0033 tgx[tgn],tgy[tgn],tgz[tgn]= -546.37, 51.50, -478.36; tgs[tgn]= 300; tgn=tgn+1 -- 0034 tgx[tgn],tgy[tgn],tgz[tgn]= -387.84, 58.31, -408.75; tgs[tgn]= 300; tgn=tgn+1 -- 0035 tgx[tgn],tgy[tgn],tgz[tgn]= -297.31, 59.93, -205.21; tgs[tgn]= 300; tgn=tgn+1 -- 0036 tgx[tgn],tgy[tgn],tgz[tgn]= -223.12, 59.92, -100.30; tgs[tgn]= 300; tgn=tgn+1 -- 0037 tgx[tgn],tgy[tgn],tgz[tgn]= -212.36, 59.92, -56.12; tgs[tgn]= 300; tgn=tgn+1 -- 0038 tgx[tgn],tgy[tgn],tgz[tgn]= -175.44, 59.93, -23.41; tgs[tgn]= 300; tgn=tgn+1 -- 0039 tgx[tgn],tgy[tgn],tgz[tgn]= -155.25, 59.97, -10.51; tgs[tgn]= 300; tgn=tgn+1 -- 0040 tgx[tgn],tgy[tgn],tgz[tgn]= -106.46, 61.86, 50.20; tgs[tgn]= 300; tgn=tgn+1 -- 0041 tgx[tgn],tgy[tgn],tgz[tgn]= -73.99, 67.76, 226.53; tgs[tgn]= 300; tgn=tgn+1 -- 0042 tgx[tgn],tgy[tgn],tgz[tgn]= -57.29, 70.01, 308.48; tgs[tgn]= 18; tgn=tgn+1 -- 0043 tgx[tgn],tgy[tgn],tgz[tgn]= -34.83, 69.99, 308.83; tgs[tgn]= 300; tgn=tgn+1 -- 0044 tgx[tgn],tgy[tgn],tgz[tgn]= 26.03, 64.85, 139.38; tgs[tgn]= 300; tgn=tgn+1 -- 0045 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*45000) 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*2 POWRR=POW*TRQRR*2 -- 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(9,"WFL=",wfl,", WFR=",wfr,", WRL=",wrl,", WRR=",wrr) -- out(10,"RFL=",rfl,", RFR=",rfr,", RRL=",rrl,", RRR=",rrr) end }