Jump to: Board index » General » Fusion

How to time pulsate animation?

Learn about 3D compositing, animation, broadcast design and VFX workflows.
  • Author
  • Message
Offline

HDR12bit

  • Posts: 15
  • Joined: Wed Feb 19, 2020 2:06 am
  • Real Name: Moses Konovalov

How to time pulsate animation?

PostThu Nov 17, 2022 8:35 pm

Hello everyone,

In my current project I set 12 video mediain clips to rotate in circle around same pivot point of -10 on Z axis.
Using Rotation Y command time*-0.5 command with gaps for each clip like time*-0.5+10, time*-0.5+20 etc..
Basically all the clips are spread in circle and moving like a carousel when the point of view is in front of the closest clip.

The question is how do I control the movement pattern, so instead of continuously all the clips rotate clockwise around the circle plain at the same constant speed, they will move more like say a seconds hand movement by pulses: clips play in place for 2 seconds, then fast move to the next position using half a second duration speed with easy in and out, then play in place again for 2 seconds and so on.

Is there an easier way to create that, like creating a 12 sided shape and attaching each clip on its side?
Is there a better expression way to divide the 360 by 12, so all of them be spaced equally around the pivot point if I use same method?

Would it be easier to just align all the clips in circle and then move the camera around the same pivot point in circular motion with stops?
Any tip for time expression that contains pauses for such a movement?

Please help.
Thank you.
Attachments
Screenshot 2022-11-17 at 12.30.56 PM.png
Screenshot 2022-11-17 at 12.30.56 PM.png (726.04 KiB) Viewed 564 times
Offline

Okke Verbart

  • Posts: 290
  • Joined: Tue Jan 17, 2017 8:40 pm

Re: How to time pulsate animation?

PostFri Nov 18, 2022 7:15 am

Hi Moses - there's an easier way indeed, but it does require a few expressions etc. I created the below in Fusion standalone but it should work in Resolve too. Just copy&paste the below in the fusion page and replace the placeholder as per the sticky note (i.e. each media-in into a imageplane3d and then into the replicate3D).

The way it works:

- I create a single 3D point/vertex by creating a single particle (that stays on for like 10000 frames)
- I then use a Duplicate 3D to create a circle out of these
- then I replace the points with ImagePlanes (-->. your videos)
- then, instead of having to use individual expressions for each video, I use a transform 3D to rotate the whole circle. Within this one, I use an expression to make the distinction between the still part (60 frames) and the moving part (30 frames).

Code: Select all
iif((time%90)>60,(floor(time/90)*30)+(Animator*30),floor(time/90)*30)


I refer to a control I added: Animator. And this control in turn is driven by a modifier: "Anim Curve". This Anim curve creates the same motion every 30 frames (i.e. it goes from 0 to 1 every 30 frames)

Code: Select all
(time%30)/30


I then apply easing to this.

Let me know if this works for you!

Code: Select all
{
   Tools = ordered() {
      FastNoise1 = FastNoise {
         Inputs = {
            GlobalOut = Input { Value = 4000, },
            Width = Input { Value = 2560, },
            Height = Input { Value = 1440, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            SeetheRate = Input { Value = 0.528, },
            Color1Alpha = Input { Value = 1, },
         },
         ViewInfo = OperatorInfo { Pos = { 190.448, -178.67 } },
      },
      ImagePlane3D1 = ImagePlane3D {
         Inputs = {
            ["Transform3DOp.Scale.X"] = Input { Value = 2, },
            ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 1, },
            MaterialInput = Input {
               SourceOp = "FastNoise1",
               Source = "Output",
            },
            ["MtlStdInputs.MaterialID"] = Input { Value = 1, },
         },
         ViewInfo = OperatorInfo { Pos = { 184.482, -128.958 } },
      },
      Note1 = Note {
         Inputs = {
            Comments = Input { Value = "Replace the placeholder with your various MediaIn's (each into their own ImagePlace3D) and pipe them all into the replicate 3D", }
         },
         ViewInfo = StickyNoteInfo {
            Pos = { 361.096, -226.668 },
            Flags = {
               Expanded = true
            },
            Size = { 196, 181.364 }
         },
      },
      Placeholder = Underlay {
         NameSet = true,
         ViewInfo = UnderlayInfo {
            Pos = { 187.465, -205.24 },
            Size = { 177.966, 125.979 }
         },
      },
      pEmitter1 = pEmitter {
         ID = 28,
         Inputs = {
            Number = Input {
               Value = 0,
               Expression = "iif(time==0,1,0)",
            },
            Lifespan = Input { Value = 100000, },
            ["ParticleStyle.SizeOverLife"] = Input {
               SourceOp = "pEmitter1SizeOverLife",
               Source = "Value",
            },
            ["ParticleStyle.BlurOverLife"] = Input {
               SourceOp = "pEmitter1BlurOverLife2D",
               Source = "Value",
            },
         },
         ViewInfo = OperatorInfo { Pos = { -101.639, -14.4907 } },
      },
      pEmitter1SizeOverLife = LUTBezier {
         KeyColorSplines = {
            [0] = {
               [0] = { 0.5, RH = { 0.3, 0.5 }, Flags = { Linear = true } },
               [1] = { 0.5, LH = { 0.7, 0.5 }, Flags = { Linear = true } }
            }
         },
         SplineColor = { Red = 0, Green = 0, Blue = 0 },
         CtrlWZoom = false,
         NameSet = true,
      },
      pEmitter1BlurOverLife2D = LUTBezier {
         KeyColorSplines = {
            [0] = {
               [0] = { 0.5, RH = { 0.3, 0.5 }, Flags = { Linear = true } },
               [1] = { 0.5, LH = { 0.7, 0.5 }, Flags = { Linear = true } }
            }
         },
         SplineColor = { Red = 0, Green = 0, Blue = 0 },
         CtrlWZoom = false,
         NameSet = true,
      },
      pRender1 = pRender {
         Inputs = {
            _MotionBlurWarning = Input { Disabled = true, },
            GlobalOut = Input { Value = 4000, },
            Width = Input { Value = 2560, },
            Height = Input { Value = 1440, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            OutputMode = Input { Disabled = true, },
            ["MaterialID.MaterialID"] = Input { Value = 4, },
            ["ObjectID.ObjectID"] = Input { Value = 4, },
            Input = Input {
               SourceOp = "pEmitter1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { -98.938, 39.5888 } },
      },
      Create_One_Point = Underlay {
         NameSet = true,
         ViewInfo = UnderlayInfo {
            Pos = { -100.289, -40.2037 },
            Size = { 174.701, 129.489 }
         },
      },
      Replicate3D1 = Replicate3D {
         CtrlWZoom = false,
         Inputs = {
            InputMode = Input { Value = FuID { "Random" }, },
            Alignment = Input { Value = 2, },
            Destination = Input {
               SourceOp = "Duplicate3D1",
               Source = "Data3D",
            },
            Input1 = Input {
               SourceOp = "ImagePlane3D1",
               Source = "Output",
            },
            Input2 = Input {
               SourceOp = "ImagePlane3D1",
               Source = "Output",
            },
            Input3 = Input {
               SourceOp = "ImagePlane3D1",
               Source = "Output",
            },
            Input4 = Input {
               SourceOp = "ImagePlane3D1",
               Source = "Output",
            },
            Input5 = Input {
               SourceOp = "ImagePlane3D1",
               Source = "Output",
            },
            Input6 = Input {
               SourceOp = "ImagePlane3D1",
               Source = "Output",
            },
            Input7 = Input {
               SourceOp = "ImagePlane3D1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 187.609, 93.6753 } },
      },
      Duplicate3D1 = Duplicate3D {
         Inputs = {
            LastCopy = Input { Value = 12, },
            ["Rotate.Y"] = Input { Value = 30, },
            PivotNest = Input { Value = 1, },
            ["Pivot.Z"] = Input { Value = -10, },
            SceneInput = Input {
               SourceOp = "pRender1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { -102.667, 92.2121 } },
      },
      Transform3D1 = Transform3D {
         Inputs = {
            SceneInput = Input {
               SourceOp = "Replicate3D1",
               Source = "Data3D",
            },
            ["Transform3DOp.Rotate.Y"] = Input {
               Value = 31.6666666666667,
               Expression = "iif((time%90)>60,(floor(time/90)*30)+(Animator*30),floor(time/90)*30)",
            },
            ["Transform3DOp.PivotNest"] = Input { Value = 1, },
            ["Transform3DOp.Pivot.Z"] = Input { Value = -10, },
            Animator = Input {
               SourceOp = "AnimCurves1",
               Source = "Value",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 378.667, 89.7879 } },
         UserControls = ordered() {
            Animator = {
               LINKS_Name = "Animator",
               LINKID_DataType = "Number",
               INPID_InputControl = "SliderControl",
               INP_Integer = false,
               INP_MinScale = 0,
               INP_MaxScale = 1,
               INP_MinAllowed = -1000000,
               INP_MaxAllowed = 1000000,
               ICS_ControlPage = "3D"
            }
         }
      },
      AnimCurves1 = LUTLookup {
         CtrlWZoom = false,
         Inputs = {
            Source = Input { Value = FuID { "Custom" }, },
            Input = Input {
               Value = 0.233333333333333,
               Expression = "(time%30)/30",
            },
            Curve = Input { Value = FuID { "Easing" }, },
            EaseIn = Input { Value = FuID { "Quad" }, },
            EaseOut = Input { Value = FuID { "Quad" }, },
            Lookup = Input {
               SourceOp = "AnimCurves1Lookup",
               Source = "Value",
            },
         },
      },
      AnimCurves1Lookup = LUTBezier {
         KeyColorSplines = {
            [0] = {
               [0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
               [1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
            }
         },
         SplineColor = { Red = 255, Green = 255, Blue = 255 },
         CtrlWZoom = false,
         NameSet = true,
      },
      Merge3D1 = Merge3D {
         Inputs = {
            SceneInput1 = Input {
               SourceOp = "Transform3D1",
               Source = "Output",
            },
            SceneInput2 = Input {
               SourceOp = "Camera3D1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 560.969, 93.3202 } },
      },
      Camera3D1 = Camera3D {
         Inputs = {
            ["Transform3DOp.Translate.Z"] = Input { Value = 24.64, },
            AoV = Input { Value = 19.2642683071402, },
            ["Stereo.Mode"] = Input { Value = FuID { "OffAxis" }, },
            FilmGate = Input { Value = FuID { "BMD_URSA_4K_16x9" }, },
            ApertureW = Input { Value = 0.831496062992126, },
            ApertureH = Input { Value = 0.467716535433071, },
            ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 2, },
            ["MtlStdInputs.MaterialID"] = Input { Value = 2, },
         },
         ViewInfo = OperatorInfo { Pos = { 565.636, 151.169 } },
      }
   }
}
www.ablackbirdcalledsue.com
Offline

Okke Verbart

  • Posts: 290
  • Joined: Tue Jan 17, 2017 8:40 pm

Re: How to time pulsate animation?

PostFri Nov 18, 2022 7:25 am

btw, tested it in Resolve (with 4 videos) and it works. Becomes a little bit slow on my system though:


Capture.JPG
Capture.JPG (259.93 KiB) Viewed 472 times
www.ablackbirdcalledsue.com
Offline

HDR12bit

  • Posts: 15
  • Joined: Wed Feb 19, 2020 2:06 am
  • Real Name: Moses Konovalov

Re: How to time pulsate animation?

PostMon Nov 21, 2022 3:54 pm

Hi there,

So I ended up creating a video of 2 of those animations side by side with 12 videos in each.
The project resolution is 2048x256, and the export of the final video is 1024x128 of only 1 minute duration.
But for some reason it takes 4.5 hours on my MacBook Pro, 2.5 hours on my Mac mini m1, and 2.5 hours on my PC desktop.
Is that rendering time is normal for such a low resolution and duration video?
1024x128 60fps 1 minute video.

Thank you for your help.
Offline

Sander de Regt

  • Posts: 3563
  • Joined: Thu Nov 13, 2014 10:09 pm

Re: How to time pulsate animation?

PostTue Nov 22, 2022 2:57 pm

1 minute of video at 60fps is 3600 frames. So if it takes only 2.5 seconds per frame, you're already looking at a render time like that. Especially with 12 streams of video that need to be loaded it's not entirely unreasonable even at that resolution. There's a good chance it's your I/O that's the culprit.
Sander de Regt

ShadowMaker SdR
The Netherlands

Return to Fusion

Who is online

Users browsing this forum: No registered users and 19 guests