// ワイヤーフレーム val{ } /////////////////////////////////////////////////////////////////////////////// key{ } /////////////////////////////////////////////////////////////////////////////// body{ core(name=c_0){ } } /////////////////////////////////////////////////////////////////////////////// lua{ axis={{1,0,0},{0,1,0},{0,0,1}} ------------------------------------------------------------------------------- function rgb_col(r,g,b) return r*65536+g*256+b end ------------------------------------------------------------------------------- function draw_axis(p,m,l) local x,y,z=p[1],p[2],p[3] local xx,xy,xz=m[1][1]*l,m[1][2]*l,m[1][3]*l local yx,yy,yz=m[2][1]*l,m[2][2]*l,m[2][3]*l local zx,zy,zz=m[3][1]*l,m[3][2]*l,m[3][3]*l _SETCOLOR(rgb_col(0,0,255)) _MOVE3D(x+zx,y+zy,z+zz) _LINE3D(x-zx,y-zy,z-zz) _SETCOLOR(rgb_col(0,255,0)) _MOVE3D(x+xx,y+xy,z+xz) _LINE3D(x-xx,y-xy,z-xz) _SETCOLOR(rgb_col(255,0,0)) _MOVE3D(x+yx,y+yy,z+yz) _LINE3D(x-yx,y-yy,z-yz) end ------------------------------------------------------------------------------- function draw_oct(p,m,l) local x,y,z=p[1],p[2],p[3] local xx,xy,xz=m[1][1]*l,m[1][2]*l,m[1][3]*l local yx,yy,yz=m[2][1]*l,m[2][2]*l,m[2][3]*l local zx,zy,zz=m[3][1]*l,m[3][2]*l,m[3][3]*l local x={x+xx,x+yx,x+zx,x-xx,x-yx,x-zx} local y={y+xy,y+yy,y+zy,y-xy,y-yy,y-zy} local z={z+xz,z+yz,z+zz,z-xz,z-yz,z-zz} _SETCOLOR(rgb_col(255,255,0)) _MOVE3D(x[1],y[1],z[1]) for i,n in {2,3,1,5,3,4,5,6,4,2,6,1} do _LINE3D(x[n],y[n],z[n]) end end ------------------------------------------------------------------------------- function draw_rotaxis(p,u,l) _SETCOLOR(rgb_col(255,0,255)) _MOVE3D(p[1]-u[1]*l,p[2]-u[2]*l,p[3]-u[3]*l) _LINE3D(p[1]+u[1]*l,p[2]+u[2]*l,p[3]+u[3]*l) 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 rotate(v,w) local u={} for i=1,3 do u[i]=v[1][i]*w[1]+v[2][i]*w[2]+v[3][i]*w[3] end local r=math.sqrt(u[1]^2+u[2]^2+u[3]^2) local c=r if(r>0) then r=1/r u[1],u[2],u[3]=u[1]*r,u[2]*r,u[3]*r end c=c/2 local cc,cs=math.cos(c),math.sin(c) local qt,q0,q1,pq={},{},{},{} q0[0],q0[1],q0[2],q0[3]=cc,u[1]*cs,u[2]*cs,u[3]*cs q1[0],q1[1],q1[2],q1[3]=q0[0],-q0[1],-q0[2],-q0[3] local a={{},{},{}} for i=1,3 do pq[0],pq[1],pq[2],pq[3]=0,v[i][1],v[i][2],v[i][3] qt=q_mul(q_mul(q1,pq),q0) for j=1,3 do a[i][j]=qt[j] end end return a,u end ------------------------------------------------------------------------------- function main() local c=math.rad(1) local w={0,0,0} if(_KEY(5)>0) then c=c*5 end if(_KEY(0)>0) then w[1]=w[1]-c end if(_KEY(1)>0) then w[1]=w[1]+c end if(_KEY(2)>0) then w[2]=w[2]-c end if(_KEY(3)>0) then w[2]=w[2]+c end if(_KEY(4)>0) then w[3]=w[3]-c end if(_KEY(6)>0) then w[3]=w[3]+c end if(_KEY(7)>0) then axis={{1,0,0},{0,1,0},{0,0,1}} end if(_KEY(8)>0) then w={0,0,0} end if(_KEY(9)>0) then if(math.mod(_TICKS(),30)>0) then w={0,0,0} end end local u={} axis,u=rotate(axis,w) local wpos={_X(C_0),_Y(C_0)+1.5,_Z(C_0)} draw_rotaxis(wpos,u,2) draw_axis(wpos,axis,1.4) draw_oct(wpos,axis,1.4) out(0,"FPS=",_FPS(),", CHIPS=".._CHIPS(),", WEIGHT=",_WEIGHT(),"kg") out(1,"Up / Down : X-Rot, Left / Right : Y-Rot, Z / C : Z-Rot") out(2,"+X : Rot-Accel, S : Rot-Stop, D : Rot-Step, A : Rot-Reset") out(3,string.format("&XX=%+.2f, XY=%+.2f, XZ=%+.2f",axis[1][1],axis[1][2],axis[1][3])) out(4,string.format("&YX=%+.2f, YY=%+.2f, YZ=%+.2f",axis[2][1],axis[2][2],axis[2][3])) out(5,string.format("&ZX=%+.2f, ZY=%+.2f, ZZ=%+.2f",axis[3][1],axis[3][2],axis[3][3])) end }