Advertisement
suremarc

Untitled

Sep 26th, 2014
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.60 KB | None | 0 0
  1. -- Catmull-Rom splines
  2.  
  3. local sqrt, acos = math.sqrt, math.acos;
  4.  
  5. -- gives a spline interpolator between controls points p0p1p2p3, with time modifiers
  6. local function spline(p0, p1, p2, p3, dt0, dt1, dt2)
  7.     local t1, t2 =  ((p1-p0)/dt0 - (p2-p0)/(dt0+dt1) + (p2-p1)/dt1)*dt1,
  8.                     ((p2-p1)/dt1 - (p3-p1)/(dt1+dt2) + (p3-p2)/dt2)*dt1;
  9.     return function(t)
  10.         local a, b, c, d = p1, t1, -3*p1+3*p2-2*t1-t2, 2*p1-2*p2+t1+t2;
  11.         return a+b*t+c*t^2+d*t^3;
  12.     end;
  13. end
  14.  
  15. local function getAxisAngle(cf)
  16.     local _, _, _,  m00, m01, m02,
  17.                     m10, m11, m12,
  18.                     m20, m21, m22 = cf:components();
  19.     return acos((m00 + m11 + m22 - 1)/2), Vector3.new(m21-m12, m02-m20, m10-m01);
  20. end
  21.  
  22. -- begin
  23.  
  24. local part0, part1, part2, part3 = Workspace.Part0, Workspace.Part1, Workspace.Part2, Workspace.Part3;
  25. local c0, c1, c2, c3 = part0.CFrame, part1.CFrame, part2.CFrame, part3.CFrame;
  26. local p0, p1, p2, p3 = c0.p, c1.p, c2.p, c3.p;
  27. local interpolatePos = spline(p0, p1, p2, p3, sqrt((p1-p0).magnitude), sqrt((p2-p1).magnitude), sqrt((p3-p2).magnitude));
  28. local th0, v0 = getAxisAngle(c0);
  29. local th1, v1 = getAxisAngle(c1);
  30. local th2, v2 = getAxisAngle(c2);
  31. local th3, v3 = getAxisAngle(c3);
  32. local interpolateTheta = spline(th0, th1, th2, th3, sqrt(abs(th1-th0)), sqrt(abs(th2-th1)), sqrt(abs(th3-th2)));
  33. local interpolateAxis = spline(v0, v1, v2, v3, sqrt((v1-v0).magnitude), sqrt((v2-v1).magnitude), sqrt((v3-v2).magnitude));
  34.  
  35. local new = part1:Clone();
  36. new.Parent = Workspace;
  37. local t = 0;
  38. repeat
  39.     t = t + wait();
  40.     new.CFrame CFrame.new(interpolatePos(t)) * CFrame.fromAxisAngle(interpolateAxis(t), interpolateTheta(t));
  41. until t>1;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement