--!nonstrict --[[ @class QFrame.story ]] local require = (require :: any)( game:GetService("ServerScriptService"):FindFirstChild("LoaderUtils", true).Parent ).bootstrapStory(script) :: typeof(require(script.Parent.loader).load(script)) local CameraStoryUtils = require("CameraStoryUtils") local CubicSplineUtils = require("CubicSplineUtils") local Maid = require("Maid") local QFrame = require("QFrame") return function(target) local maid = Maid.new() local viewportFrame = CameraStoryUtils.setupViewportFrame(maid, target) local cameraCFrame = workspace.CurrentCamera.CFrame local a = QFrame.fromCFrameClosestTo( CFrame.new(cameraCFrame.Position + cameraCFrame.lookVector * 25 - 20 * cameraCFrame.RightVector), QFrame.new() ) local setup = CameraStoryUtils.getInterpolationFactory(maid, viewportFrame, -1, 2, 8, function(qFrame) return QFrame.toCFrame(qFrame) end) local function getFinish(t) local root = CFrame.new(cameraCFrame.Position + cameraCFrame.lookVector * 25 + 20 * cameraCFrame.RightVector) * CFrame.Angles(math.pi / 3, 2 * math.pi / 3, 0) return QFrame.fromCFrameClosestTo(root * CFrame.Angles(0, math.pi * t / 3, 0), QFrame.new()) end setup(function(t) return getFinish(t) end, Color3.new(1, 0.5, 0.5)) setup(function(_) return a end, Color3.new(0.5, 1, 0.5)) -- setup(function(t) -- return (1 - t)*a + t*getFinish(t) -- end, Color3.new(0.25, 0.25, 0.25)) setup(function(t) return QFrame.fromCFrameClosestTo(QFrame.toCFrame(a):Lerp(QFrame.toCFrame(getFinish(t)), t), QFrame.new()) end, Color3.new(0.75, 0.75, 0.75), "CFrame:Lerp()") local function slerp(q0, q1, t) local delta = q1 * (q0 ^ -1) if delta.W < 0 then delta = QFrame.new(delta.x, delta.y, delta.z, -delta.W, -delta.X, -delta.Y, -delta.Z) end return (delta ^ t) * q0 end setup(function(t) local result = slerp(a, getFinish(t), t) return result end, Color3.new(0.5, 0.5, 1), "Quaternion Slerp") setup(function(t) local node0 = CubicSplineUtils.newSplineNode(0, a, QFrame.new()) local node1 = CubicSplineUtils.newSplineNode(1, getFinish(t), QFrame.new()) if t <= node0.t then return node0.p elseif t >= node1.t then return node1.p end local newNode = CubicSplineUtils.tweenSplineNodes(node0, node1, t) return newNode.p end, Color3.new(0.5, 1, 1), "Cubic Spline") return function() maid:DoCleaning() end end