Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- cframe module
- do
- local cf = CFrame.new
- local angles = CFrame.Angles
- local fromaxisangle = CFrame.fromAxisAngle
- local v3 = Vector3.new
- local nc = cf()
- local nv = v3()
- local components = nc.components
- local tos = nc.toObjectSpace
- local pi = math.pi
- local acos = math.acos
- local atan = math.atan
- local sin = math.sin
- local sqrt = math.sqrt
- local max = math.max
- local min = math.min
- local deg90 = pi/2
- local forward = v3(0,0,-1) -- arb
- function cframe.toquaternion(c)
- local x,y,z,xx,yx,zx,xy,yy,zy,xz,yz,zz = components(c)
- local tr = xx+yy+zz
- if tr>2.99999 then
- return x,y,z,0,0,0,1
- elseif tr>-0.99999 then
- local m = 2*(tr+1)^0.5
- return x,y,z,(yz-zy)/m,(zx-xz)/m,(xy-yx)/m,m/4
- else
- local qx = xx+yx+zx+1
- local qy = xy+yy+zy+1
- local qz = xz+yz+zz+1
- local m = (qx*qx+qy*qy+qz*qz)^0.5
- return x,y,z,qx/m,qy/m,qz/m,0
- end
- end
- local toquaternion = cframe.toquaternion
- function cframe.power(c,t)
- local x,y,z,xx,yx,zx,xy,yy,zy,xz,yz,zz = components(c)
- local tr = xx+yy+zz
- if tr > 2.99999 then
- return cf(t*x,t*y,t*z)
- elseif tr > -0.99999 then
- local m = 2*(tr+1)^5
- local qw = m/4
- local th = acos(qw)
- local s = (1-qw*qw)^0.5
- local c = sin(th*t)/s
- return cf(t*x,t*y,t*z,c*(yz-zy)/m,c*(zx-xz)/m,c*(xy-yx)/m,c*qw+sin(th*(1-t))/s)
- else
- local qx = xx+yx+zx+1
- local qy = xy+yy+zy+1
- local qz = xz+yz+zz+1
- local c = sin(deg90*t)/(qx*qx+qy*qy+qz*qz)^0.5
- return cf(t*x,t*y,t*z,c*qx,c*qy,c*qz,sin(deg90*(1-t)))
- end
- end
- local power = cframe.power
- function cframe.interpolate(c0,c1,t)
- return c0*power(tos(c0,c1),t)
- end
- local interpolate = cframe.interpolate
- function cframe.interpolator(c0,c1)
- if c1 then
- local x0,y0,z0,qx0,qy0,qz0,qw0 = toquaternion(c0)
- local x1,y1,z1,qx1,qy1,qz1,qw1 = toquaternion(c1)
- local x,y,z = x1-x0,y1-y0,z1-z0
- local c = qx0*qx1+qy0*qy1+qz0*qz1+qw0*qw1
- if c < 0 then
- qx0,qy0,qz0,qw0=-qx0,-qy0,-qz0,-qw0
- end
- if c < 0.9999 then
- local s = (1-c*c)^0.5
- local th = acos(c)
- return function(t)
- local s0 = sin(th*(1-t))/s
- local s1 = sin(th*t)/s
- return cf(x0+t*x,y0+t*y,z0+t*z,s0*qx0+s1*qx1,s0*qy0+s1*qy1,s0*qz0+s1*qz1,s0*qw0+s1*qw1)
- end
- else
- return function(t)
- return cf(x0+t*x,y0+t*y,z0+t*z,qx1,qy1,qz1,qw1)
- end
- end
- else
- local x,y,z,qx,qy,qz,qw = cframe.toquaternion(c0)
- if qw < 0.9999 then
- local s = (1-qw*qw)^0.5
- local th = acos(qw)
- return function(t)
- local s1 = sin(th*t)/s
- return cf(t*x,t*y,t*z,s1*qx,s1*qy,s1*qz,sin(th*(1-t))/s+s1*qw)
- end
- else
- return function(t)
- return cf(t*x,t*y,t*z,qx,qy,qz,qw)
- end
- end
- end
- end
- local interpolator = cframe.interpolator
- function cframe.pitch(c)
- local v = c.lookVector
- return atan(v.Y/sqrt(v.X^2+v.Z^2))
- end
- local pitch = cframe.pitch
- function cframe.fromtool(t)
- local gp = t.GripPos
- local gr = t.GripRight
- local gu = t.GripUp
- local gf = t.GripForward
- local x,y,z = gp.x,gp.y,gp.z
- local xx,xy,xz = gr.x,gu.x,-gf.x
- local yx,yy,yz = gr.y,gu.y,-gf.y
- local zx,zy,zz = gr.z,gu.z,-gf.z
- return cf(x,y,z,xx,xy,xz,yx,yy,yz,zx,zy,zz)
- end
- local fromtool = cframe.fromtool
- function cframe.totool(c,t)
- local x,y,z,xx,xy,xz,yx,yy,yz,zx,zy,zz = components(c)
- local gp = v3(x,y,z)
- local gr = v3(xx,yx,zx)
- local gu = v3(xy,yy,zy)
- local gf = v3(-xz,-yz,-zz)
- if t then
- t.GripPos = gp
- t.GripRight = gr
- t.GripUp = gu
- t.GripForward = gf
- end
- return {gp,gr,gu,gf}
- end
- local totool = cframe.totool
- local function tableshift(t0,p)
- local t1 = {}
- for i=1,#t0 do
- table.insert(t1,i,t0[i+p > #t0 and (i+p)%#t0 or i+p])
- end
- return t1
- end
- function cframe.shift(c,p)
- local x0,y0,z0,xx0,xy0,xz0,yx0,yy0,yz0,zx0,zy0,zz0 = components(c)
- local v = tableshift({x0,y0,z0},p)
- local x = tableshift({xx0,yx0,zx0},p)
- local y = tableshift({xy0,yy0,zy0},p)
- local z = tableshift({xz0,yz0,zz0},p)
- local x1,y1,z1 = unpack(v)
- local xx1,xy1,xz1 = unpack(x)
- local yx1,yy1,yz1 = unpack(y)
- local zx1,zy1,zz1 = unpack(z)
- return cf(x1,y1,z1,xx1,xy1,xz1,yx1,yy1,yz1,zx1,zy1,zz1)
- end
- local shift = cframe.shift
- function cframe.solve(originCF,targetPos,l1,l2)
- local localized = originCF:pointToObjectSpace(targetPos)
- local localizedUnit = localized.unit
- local l3 = localized.magnitude
- local axis = forward:Cross(localizedUnit)
- local angle = acos(-localizedUnit.Z)
- local planeCF = originCF*fromaxisangle(axis, angle)
- if l3 < max(l2,l1)-min(l2,l1) then
- return planeCF*cf(0,0,max(l2,l1)-min(l2,l1)-l3),-pi/2,pi
- elseif l3 > l1+l2 then
- return planeCF*cf(0,0,l1+l2-l3),pi/2,0
- else
- local a1 = -acos((-(l2*l2)+(l1*l1)+(l3*l3))/(2*l1*l3))
- local a2 = acos(((l2 *l2)-(l1*l1)+(l3*l3))/(2*l2*l3))
- return planeCF,a1+pi/2,a2-a1
- end
- end
- local solve = cframe.solve
- local function isnan(x)
- return x ~= x
- end
- function cframe.checknan(c)
- local comp = {c:components()}
- local nan = false
- for c=1,#comp do
- local v = comp[c]
- if isnan(v) then
- print("value is nan")
- nan = true
- end
- end
- return nan
- end
- local checknan = cframe.checknan
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement