Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Catmull-Rom splines
- local sqrt, acos = math.sqrt, math.acos;
- -- gives a spline interpolator between controls points p0p1p2p3, with time modifiers
- local function spline(p0, p1, p2, p3, dt0, dt1, dt2)
- local t1, t2 = ((p1-p0)/dt0 - (p2-p0)/(dt0+dt1) + (p2-p1)/dt1)*dt1,
- ((p2-p1)/dt1 - (p3-p1)/(dt1+dt2) + (p3-p2)/dt2)*dt1;
- return function(t)
- local a, b, c, d = p1, t1, -3*p1+3*p2-2*t1-t2, 2*p1-2*p2+t1+t2;
- return a+b*t+c*t^2+d*t^3;
- end;
- end
- local function getAxisAngle(cf)
- local _, _, _, m00, m01, m02,
- m10, m11, m12,
- m20, m21, m22 = cf:components();
- return acos((m00 + m11 + m22 - 1)/2), Vector3.new(m21-m12, m02-m20, m10-m01);
- end
- -- begin
- local part0, part1, part2, part3 = Workspace.Part0, Workspace.Part1, Workspace.Part2, Workspace.Part3;
- local c0, c1, c2, c3 = part0.CFrame, part1.CFrame, part2.CFrame, part3.CFrame;
- local p0, p1, p2, p3 = c0.p, c1.p, c2.p, c3.p;
- local interpolatePos = spline(p0, p1, p2, p3, sqrt((p1-p0).magnitude), sqrt((p2-p1).magnitude), sqrt((p3-p2).magnitude));
- local th0, v0 = getAxisAngle(c0);
- local th1, v1 = getAxisAngle(c1);
- local th2, v2 = getAxisAngle(c2);
- local th3, v3 = getAxisAngle(c3);
- local interpolateTheta = spline(th0, th1, th2, th3, sqrt(abs(th1-th0)), sqrt(abs(th2-th1)), sqrt(abs(th3-th2)));
- local interpolateAxis = spline(v0, v1, v2, v3, sqrt((v1-v0).magnitude), sqrt((v2-v1).magnitude), sqrt((v3-v2).magnitude));
- local new = part1:Clone();
- new.Parent = Workspace;
- local t = 0;
- repeat
- t = t + wait();
- new.CFrame CFrame.new(interpolatePos(t)) * CFrame.fromAxisAngle(interpolateAxis(t), interpolateTheta(t));
- until t>1;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement