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 } },
}
}
}