How to close a keyframe loop?

Get answers to your questions about color grading, editing and finishing with DaVinci Resolve.
  • Author
  • Message
Offline

SteveW

  • Posts: 81
  • Joined: Sun Feb 04, 2024 12:01 am
  • Real Name: Steve Wellens

How to close a keyframe loop?

PostWed May 07, 2025 1:54 pm

I have a Fusion 3d component and I have the camera circling around a few objects. How can I close the the loop I made using key frames? (circled in yellow)

KeyFrameLoop.png
KeyFrameLoop.png (157.88 KiB) Viewed 736 times
Davinci Resolve 20
Windows 10 (until they pry it out of my cold dead fingers).
Offline
User avatar

KrunoSmithy

  • Posts: 4563
  • Joined: Fri Oct 20, 2023 11:01 pm
  • Warnings: 1
  • Real Name: Kruno Stifter

Re: How to close a keyframe loop?

PostWed May 07, 2025 4:15 pm

To make the camera focus on the center of the scene, set it to "use target." If you haven't changed anything, the center is at coordinates 0,0,0. Then, move the camera to where you want it. After the camera, add a Transform 3D node. Use this node to rotate the camera around the Y axis. This is easy and precise. You can also set the Transform 3D node to loop, so it rotates continuously. Because the Transform 3D node is separate from the camera, you can animate them independently, which is very simple.

If you draw things by hand, it will probably look messy, like in your picture. But, if you want to connect specific points, you can copy the coordinates of one point and paste them into the coordinates of a nearby point at the correct keyframe.


sshot-1260.jpg
sshot-1260.jpg (251 KiB) Viewed 399 times


Copy this code to your clipboard and paste it in the empty space of your fusion composition.

Code: Select all
{
   Tools = ordered() {
      Shape3D2 = Shape3D {
         Inputs = {
            ["SurfacePlaneInputs.Visibility.CullBackFace"] = Input {
               Value = Number {
                  Value = 1
               },
            },
            ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input {
               Value = Number {
                  Value = 6
               },
            },
            ["SurfacePlaneInputs.Visibility.Nest"] = Input {
               Value = Number {
                  Value = 1
               },
            },
            ["Transform3DOp.Translate.Z"] = Input { Value = -1.44, },
            ["Transform3DOp.Rotate.Z"] = Input { Value = -36.5, },
            Shape = Input { Value = FuID { "SurfaceCubeInputs" }, },
            ["MtlStdInputs.Diffuse.Color.Red"] = Input { Value = 0.666666666666667, },
            ["MtlStdInputs.Diffuse.Color.Green"] = Input { Value = 0.580392156862745, },
            ["MtlStdInputs.Diffuse.Color.Blue"] = Input { Value = 0.411764705882353, },
            ["MtlStdInputs.MaterialID"] = Input { Value = 5, },
            ["SurfaceSphereInputs.SubdivisionLevelBase"] = Input { Value = 60, },
            ["SurfaceSphereInputs.SubdivisionLevelHeight"] = Input { Value = 60, },
            ["SurfaceSphereInputs.Visibility.Nest"] = Input { Value = 1, },
            ["SurfaceSphereInputs.Visibility.CullBackFace"] = Input { Value = 1, },
            ["SurfaceSphereInputs.ObjectID.ObjectID"] = Input { Value = 1, },
            ["SurfaceConeInputs.ObjectID.ObjectID"] = Input { Value = 2, },
            ["SurfaceCubeInputs.ObjectID.ObjectID"] = Input { Value = 3, }
         },
         ViewInfo = OperatorInfo { Pos = { 394.667, 31.6061 } },
      },
      Text3D1 = Text3D {
         Inputs = {
            ["Transform3DOp.Translate.X"] = Input { Value = 1, },
            ["Transform3DOp.Translate.Y"] = Input { Value = -0.19, },
            LayoutRotation = Input { Value = 1, },
            TransformRotation = Input { Value = 1, },
            Red1 = Input { Value = 0.333333333333333, },
            Green1 = Input { Value = 0.666666666666667, },
            StyledText = Input { Value = "TEXT 3D", },
            Font = Input { Value = "Open Sans", },
            Style = Input { Value = "Bold", },
            VerticalTopCenterBottom = Input { Value = 1, },
            VerticalJustification = Input { Value = 3, },
            VerticalJustificationNew = Input { Value = 3, },
            HorizontalJustificationNew = Input { Value = 3, },
            Extrusion = Input { Value = 1, },
            ExtrusionProfile = Input {
               SourceOp = "Text3D1ExtrusionProfile",
               Source = "Value",
            },
            ExtrusionDepth = Input { Value = 0.1, }
         },
         ViewInfo = OperatorInfo { Pos = { 536, -23.0303 } },
      },
      Text3D1ExtrusionProfile = LUTBezier {
         KeyColorSplines = {
            [0] = {
               [0] = { 0, RH = { 0.0666666666666667, 0.333333333333333 }, Flags = { Linear = true } },
               [0.2] = { 1, LH = { 0.133333333333333, 0.666666666666667 }, RH = { 0.4, 1 }, Flags = { Linear = true } },
               [0.8] = { 1, LH = { 0.6, 1 }, RH = { 0.866666666666667, 0.666666666666667 }, Flags = { Linear = true } },
               [1] = { 0, LH = { 0.933333333333333, 0.333333333333333 }, Flags = { Linear = true } }
            }
         },
         SplineColor = { Red = 0, Green = 0, Blue = 0 },
         CtrlWZoom = false,
      },
      Merge3D1 = Merge3D {
         Inputs = {
            ["Transform3DOp.Translate.X"] = Input { Value = -0.73, },
            SceneInput1 = Input {
               SourceOp = "Shape3D2",
               Source = "Output",
            },
            SceneInput2 = Input {
               SourceOp = "Text3D1",
               Source = "Output",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 536, 31.6061 } },
      },
      Camera3D1 = Camera3D {
         CtrlWZoom = false,
         Inputs = {
            ["Transform3DOp.Translate.Z"] = Input { Value = 8.816039, },
            ["Transform3DOp.UseTarget"] = Input { Value = 1, },
            AoV = Input { Value = 19.2642683071402, },
            ["Stereo.Mode"] = Input { Value = FuID { "OffAxis" }, },
            FilmBack = Input { Value = 1, },
            FilmGate = Input { Value = FuID { "BMD_URSA_4K_16x9" }, },
            ApertureW = Input { Value = 0.831496062992126, },
            ApertureH = Input { Value = 0.467716535433071, },
            ControlVis = Input { Value = 1, },
            PlaneOfFocusVis = Input { Value = 1, },
            ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 2, },
            ["MtlStdInputs.MaterialID"] = Input { Value = 2, }
         },
         ViewInfo = OperatorInfo { Pos = { 679.333, -45.9697 } },
      },
      Transform3D1 = Transform3D {
         Inputs = {
            SceneInput = Input {
               SourceOp = "Camera3D1",
               Source = "Output",
            },
            ["Transform3DOp.Rotate.Y"] = Input {
               SourceOp = "Transform3D1YRotation",
               Source = "Value",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 679.333, -12.9697 } },
      },
      Transform3D1YRotation = BezierSpline {
         SplineColor = { Red = 128, Green = 255, Blue = 128 },
         CtrlWZoom = false,
         NameSet = true,
         KeyFrames = {
            [0] = { 0, RH = { 33.3333333333333, -120 }, Flags = { Linear = true, Loop = true } },
            [100] = { -360, LH = { 66.6666666666667, -240 }, Flags = { Linear = true, Loop = true } }
         }
      },
      Merge3D2 = Merge3D {
         Inputs = {
            SceneInput1 = Input {
               SourceOp = "Merge3D1",
               Source = "Output",
            },
            SceneInput2 = Input {
               SourceOp = "Transform3D1",
               Source = "Output",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 679.333, 31.6061 } },
      }
   }
}
Offline

SteveW

  • Posts: 81
  • Joined: Sun Feb 04, 2024 12:01 am
  • Real Name: Steve Wellens

Re: How to close a keyframe loop?

PostThu May 08, 2025 5:36 am

Got it working....thanks! Both suggestions were good.

I got the 3D Transform working.

I also saw that you don't have to have every node go to the same Merge3D. You can daisy chain them to make a much neater layout.
Davinci Resolve 20
Windows 10 (until they pry it out of my cold dead fingers).
Offline
User avatar

KrunoSmithy

  • Posts: 4563
  • Joined: Fri Oct 20, 2023 11:01 pm
  • Warnings: 1
  • Real Name: Kruno Stifter

Re: How to close a keyframe loop?

PostThu May 08, 2025 10:08 am

SteveW wrote:Got it working....thanks! Both suggestions were good. I got the 3D Transform working.


Great.

SteveW wrote:I also saw that you don't have to have every node go to the same Merge3D. You can daisy chain them to make a much neater layout.


Yes.
Many users often make a central "hub" by connecting everything to a single Merge 3D node. I also see people doing this with MultiMerge in 2D.

I think merge nodes with many connections are useful for grouping similar, already-positioned elements. However, they can restrict the user's compositing process.

It's easier to see and work with a segmented flow where each element that will be manipulated is merged separately. Merge and Transform nodes build upon each other (concatenate), so they don't cancel each other out.

Segmenting elements makes the work and overview easier.

When working in 3D space, I often use one Merge 3D node for the geometry, and then two other Merge 3D nodes: one for the lights and one for the camera.

If it's a more complex scene with multiple render passes, I'll put the lights and camera in a single Merge node. This makes it easy to link them for the other passes.

For example, if I want something to orbit around something else (like in your scene), and I want the orbiting object to be a glowing ball, here's how I might approach it.

Since there isn't a built-in glow option for 3D, it has to be done in 2D. If the glowing ball is always in front of everything else, you can add a glow effect to the texture before plugging it into the 3D shape.

However, if the glowing ball needs to appear in front of objects sometimes and behind them at other times, you can use multiple passes to create holdout masks. Then, after rendering, you can add the glow only to the 3D pass that renders the ball with the holdout mask.

In that case, it's helpful to have the camera and lights in one Merge node, which can be easily shared among different render passes. The ball and the figure would be merged separately, each in its own Merge node.

This setup would be virtually impossible to achieve using a single Merge 3D node.

Essentially, you render out different render passes using the same lights and camera (hence, one Merge node that's easy to share). You have two separate passes: one for the background and one for the ball. But you don't just render them; you also render them with a holdout mask. You can achieve this by using an Override 3D tool to create the matte.

It would look something like this.

sshot-181.jpg
sshot-181.jpg (69.95 KiB) Viewed 247 times


sshot-182.jpg
sshot-182.jpg (69.14 KiB) Viewed 247 times


sshot-183.jpg
sshot-183.jpg (50.52 KiB) Viewed 247 times


Using multiple render passes and merge nodes can also be helpful for managing elements built outside of the main composition, making them easier to handle. For instance, if you're adding particles to a 3D scene, you can create them separately and then add them using a dedicated Merge 3D node.

Another benefit is the ability to reuse elements throughout the scene. By placing lights, cameras, and other elements further down the node graph, you can use the same setup but branch out from earlier nodes. This is particularly useful when combining elements multiple times.

Return to DaVinci Resolve

Who is online

Users browsing this forum: Bing [Bot], Dave Shortman, Dermot Shane, Jim Simon, JordanTet, loshablokshema, Skiess and 374 guests