Page 1 of 1

Speed Warp and Smooth Cut in Fusion Studio

PostPosted: Mon Aug 04, 2025 8:24 am
by JulianQ
Hello the team,

I would like to know how we can do these two procedures, that I usually do in the edit timeline of DaVinci Resolve, but with nodes inside Fusion Studio (not inside the Fusion tab in Resolve):

- Speed Warp (Better) (in Optical Flow re-timing).
- Smooth Cut.

I mean, I want to make these two procedures in Fusion Studio in the same way that in the timeline of Resolve. Is that possible, right?

Thank you very much in advance for your answers! 

Re: Speed Warp and Smooth Cut in Fusion Studio

PostPosted: Mon Aug 04, 2025 1:40 pm
by KrunoSmithy
These are edit page specific and part of Resolve Studio, so they are technically not fusion effects at all and they are not part of Fusion Studio.

You can use optical flow to generate motion vectors but than use TimeSpeed or TimeStrecher or similar tool for interpolation of new frames, but the results will not be as good as the more advance Speed Warp algorithm. In linear motion with no overlaping elements its probably going to look smooth, but not with more complex overlaping movement.

For smooth cut you can try some of the old dimention tools in fusion, like Tween, Repair frame, or macro called TweenIt by JustCropIt found on We Suck Less forum.

Third party tools from Boris FX like Continuum have I think similar tools but they are not native tools and are pretty expensive. Best to do that in edit page if you have Resolve Studio with tools you already have.

Re: Speed Warp and Smooth Cut in Fusion Studio

PostPosted: Mon Aug 04, 2025 9:33 pm
by birdseye
The most straight forward way to get something similar is to use a Tween node like this, which if you compare to a dissolve would be a lot better, assuming you can get the frames similar enough.
Code: Select all
{
   Tools = ordered() {
      Text1 = TextPlus {
         Inputs = {
            GlobalOut = Input { Value = 500, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            StyledText = Input { Value = "50", },
            Font = Input { Value = "Open Sans", },
            Style = Input { Value = "Bold", },
            Size = Input { Value = 0.3, },
            VerticalJustificationNew = Input { Value = 3, },
            HorizontalJustificationNew = Input { Value = 3, },
         },
         ViewInfo = OperatorInfo { Pos = { 50, 44.3333 } },
      },
      Text2_1 = TextPlus {
         Inputs = {
            GlobalOut = Input { Value = 500, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            StyledText = Input { Value = "SO", },
            Font = Input { Value = "Open Sans", },
            Style = Input { Value = "Bold", },
            Size = Input { Value = 0.3, },
            VerticalJustificationNew = Input { Value = 3, },
            HorizontalJustificationNew = Input { Value = 3, },
         },
         ViewInfo = OperatorInfo { Pos = { 296.667, 38.2728 } },
      },
      Text1_1 = TextPlus {
         Inputs = {
            GlobalOut = Input { Value = 500, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            StyledText = Input { Value = "50", },
            Font = Input { Value = "Open Sans", },
            Style = Input { Value = "Bold", },
            Size = Input { Value = 0.3, },
            VerticalJustificationNew = Input { Value = 3, },
            HorizontalJustificationNew = Input { Value = 3, },
         },
         ViewInfo = OperatorInfo { Pos = { 298, 74.6364 } },
      },
      Dissolve1 = Dissolve {
         Transitions = {
            [0] = "DFTDissolve"
         },
         Inputs = {
            Mix = Input {
               SourceOp = "Dissolve1BackgroundForeground",
               Source = "Value",
            },
            Background = Input {
               SourceOp = "Text1_1",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "Text2_1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 412, 74.6364 } },
      },
      Dissolve1BackgroundForeground = BezierSpline {
         SplineColor = { Red = 16, Green = 164, Blue = 235 },
         CtrlWZoom = false,
         NameSet = true,
         KeyFrames = {
            [0] = { 0, RH = { 16.6666666666667, 0 }, Flags = { Linear = true } },
            [50] = { 0, LH = { 33.3333333333333, 0 }, RH = { 50.3333333333333, 0.333333333333333 }, Flags = { Linear = true } },
            [51] = { 1, LH = { 50.6666666666667, 0.666666666666667 }, RH = { 77.3333333333333, 1 }, Flags = { Linear = true } },
            [130] = { 1, LH = { 103.666666666667, 1 }, Flags = { Linear = true } }
         }
      },
      Text2 = TextPlus {
         Inputs = {
            GlobalOut = Input { Value = 500, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            StyledText = Input { Value = "SO", },
            Font = Input { Value = "Open Sans", },
            Style = Input { Value = "Bold", },
            Size = Input { Value = 0.3, },
            VerticalJustificationNew = Input { Value = 3, },
            HorizontalJustificationNew = Input { Value = 3, },
         },
         ViewInfo = OperatorInfo { Pos = { 49.3333, 77.0606 } },
      },
      Tween1 = Dimension.Tween {
         Inputs = {
            Interpolation = Input {
               SourceOp = "Tween1Interpolation",
               Source = "Value",
            },
            OpticalFlowOptionsNest = Input { Value = 1, },
            Image0 = Input {
               SourceOp = "Text1",
               Source = "Output",
            },
            Image1 = Input {
               SourceOp = "Text2",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 162, 77.0606 } },
      },
      Tween1Interpolation = BezierSpline {
         SplineColor = { Red = 137, Green = 74, Blue = 235 },
         CtrlWZoom = false,
         NameSet = true,
         KeyFrames = {
            [0] = { 0, RH = { 16.6666666666667, 0 }, Flags = { Linear = true } },
            [50] = { 0, LH = { 33.3333333333333, 0 }, RH = { 60, 0.333333333333333 }, Flags = { Linear = true } },
            [80] = { 1, LH = { 70, 0.666666666666667 }, RH = { 96.6666666666667, 1 }, Flags = { Linear = true } },
            [130] = { 1, LH = { 113.333333333333, 1 }, Flags = { Linear = true } }
         }
      },
      OpticalFlow1 = Dimension.OpticalFlow {
         Inputs = {
            Input = Input {
               SourceOp = "Dissolve1",
               Source = "Output",
            },
            ["Advanced.Advanced"] = Input { Value = 1, },
         },
         ViewInfo = OperatorInfo { Pos = { 519.333, 74.6364 } },
      },
      TimeStretcher1 = TimeStretcher {
         Inputs = {
            SourceTime = Input {
               SourceOp = "TimeStretcher1SourceTime",
               Source = "Value",
            },
            InterpolateBetweenFrames = Input { Value = 2, },
            SampleSpread = Input { Disabled = true, },
            Input = Input {
               SourceOp = "OpticalFlow1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 626, 74.6364 } },
      },
      TimeStretcher1SourceTime = BezierSpline {
         SplineColor = { Red = 233, Green = 217, Blue = 243 },
         CtrlWZoom = false,
         KeyFrames = {
            [0] = { 0, RH = { 16.6666666666667, 16.6666666666667 }, Flags = { Linear = true } },
            [50] = { 50, LH = { 33.3333333333333, 33.3333333333333 }, RH = { 60, 50.3333333333333 }, Flags = { Linear = true } },
            [80] = { 51, LH = { 70, 50.6666666666667 }, RH = { 96.6666666666667, 67.6666666666667 }, Flags = { Linear = true } },
            [130] = { 101, LH = { 113.333333333333, 84.3333333333333 }, Flags = { Linear = true } }
         }
      },
      Text2_1_1 = TextPlus {
         CtrlWZoom = false,
         Inputs = {
            GlobalOut = Input { Value = 500, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            StyledText = Input { Value = "SO", },
            Font = Input { Value = "Open Sans", },
            Style = Input { Value = "Bold", },
            Size = Input { Value = 0.3, },
            VerticalJustificationNew = Input { Value = 3, },
            HorizontalJustificationNew = Input { Value = 3, },
         },
         ViewInfo = OperatorInfo { Pos = { 788.667, 34.6364 } },
      },
      Text1_1_1 = TextPlus {
         Inputs = {
            GlobalOut = Input { Value = 500, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            StyledText = Input { Value = "50", },
            Font = Input { Value = "Open Sans", },
            Style = Input { Value = "Bold", },
            Size = Input { Value = 0.3, },
            VerticalJustificationNew = Input { Value = 3, },
            HorizontalJustificationNew = Input { Value = 3, },
         },
         ViewInfo = OperatorInfo { Pos = { 791.334, 68.5756 } },
      },
      Dissolve1_1 = Dissolve {
         Transitions = {
            [0] = "DFTDissolve"
         },
         CtrlWZoom = false,
         Inputs = {
            Mix = Input {
               SourceOp = "Dissolve1_1BackgroundForeground",
               Source = "Value",
            },
            Background = Input {
               SourceOp = "Text1_1_1",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "Text2_1_1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 898, 68.5758 } },
      },
      Dissolve1_1BackgroundForeground = BezierSpline {
         SplineColor = { Red = 16, Green = 164, Blue = 235 },
         CtrlWZoom = false,
         NameSet = true,
         KeyFrames = {
            [0] = { 0, RH = { 16.6666666666667, 0 }, Flags = { Linear = true } },
            [50] = { 0, LH = { 33.3333333333333, 0 }, RH = { 60, 0.333333333333333 }, Flags = { Linear = true } },
            [80] = { 1, LH = { 70, 0.666666666666667 }, RH = { 96.6666666666667, 1 }, Flags = { Linear = true } },
            [130] = { 1, LH = { 113.333333333333, 1 }, Flags = { Linear = true } }
         }
      }
   },
   ActiveTool = "Dissolve1_1"
}

Obviously you would have video clips and you would need to time them to whatever frames are most suitable/similar. I have yet to use Speed Warp or Smooth Cut but I guess they are similar to Avid's so called FluidMorph.
You can also use a TimeStretcher which I think is the same thing but a bit more fiddly to set up for this sort of thing. There is also a method using the Stereo tools at about 7 minutes in, which I found caused my brain some amount of pain. It may be slightly superior but I guess the similarity of the two input frames is the most significant factor.