I’ve been instructed to animate a couple of images that include tapered lines and I’m not entirely sure how to best create them in fusion. I unfortunately don’t have access to the original illustration files so need to create these from scratch. What’s the best, most efficient way to do so in Fusion? TIA
1 Like
You have a few options
Slow but more options:
{
Tools = ordered() {
Size = EllipseMask {
CtrlWZoom = false,
NameSet = true,
Inputs = {
Filter = Input { Value = FuID { "Fast Gaussian" }, },
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
UseFrameFormatSettings = Input { Value = 1, },
ClippingMode = Input { Value = FuID { "None" }, },
Width = Input { Value = 0.0217912086679913, },
Height = Input { Value = 0.0217912086679913, }
},
ViewInfo = OperatorInfo { Pos = { 1265, -82.5 } },
},
Background1 = Background {
Inputs = {
GlobalOut = Input { Value = 119, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
UseFrameFormatSettings = Input { Value = 1, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
TopLeftRed = Input { Value = 1, },
TopLeftGreen = Input { Value = 1, },
TopLeftBlue = Input { Value = 1, },
EffectMask = Input {
SourceOp = "Size",
Source = "Mask",
}
},
ViewInfo = OperatorInfo { Pos = { 1265, 16.5 } },
},
Duplicate1 = Fuse.Duplicate {
Inputs = {
Copies = Input { Value = 300, },
XSize = Input { Value = 0.996, },
GainNest = Input { Value = 1, },
RedGain = Input { Value = 0.995, },
GreenGain = Input { Value = 0.995, },
BlueGain = Input { Value = 0.995, },
DuplicatePath = Input { Value = 1, },
UsePath = Input { Value = 1, },
PathDisplacementScale = Input { Value = 0.95, },
Polyline = Input {
Value = Polyline {
Closed = true,
Points = {
{ X = -0.120662949194548, Y = -0.0088105726872246, LX = 8.45442188872723e-18, LY = 0.122729944406843, RX = -8.45442188872723e-18, RY = -0.122729944406843 },
{ X = 0.00433705080545227, Y = -0.231032794909447, LX = -0.0690355937288492, LY = 2.25451250366059e-17, RX = 0.0690355937288492, RY = -2.25451250366059e-17 },
{ X = 0.129337050805452, Y = -0.00881057268722468, LX = -1.69088437774545e-17, LY = -0.122729944406843, RX = 1.69088437774545e-17, RY = 0.122729944406843 },
{ X = 0.00433705080545234, Y = 0.213411649534998, LX = 0.0690355937288492, LY = -3.75752083943432e-17, RX = -0.0690355937288492, RY = 3.75752083943432e-17 }
}
},
},
Background = Input {
SourceOp = "Background1",
Source = "Output",
}
},
ViewInfo = OperatorInfo { Pos = { 1430, 16.5 } },
},
Color = Background {
NameSet = true,
Inputs = {
GlobalOut = Input { Value = 119, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
UseFrameFormatSettings = Input { Value = 1, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
TopLeftRed = Input { Value = 0.23921568627451, },
TopLeftGreen = Input { Value = 0.76078431372549, },
TopLeftBlue = Input { Value = 1, }
},
ViewInfo = OperatorInfo { Pos = { 1650, -82.5 } },
},
Merge1 = Merge {
Inputs = {
Background = Input {
SourceOp = "Duplicate1",
Source = "Output",
},
Foreground = Input {
SourceOp = "Color",
Source = "Output",
},
ApplyMode = Input { Value = FuID { "Color" }, },
PerformDepthMerge = Input { Value = 0, },
EffectMask = Input {
SourceOp = "Duplicate1",
Source = "Output",
}
},
ViewInfo = OperatorInfo { Pos = { 1650, 16.5 } },
}
}
}
If I had to match your examples of tapered lines I would do this.
Match your examples:
{
Tools = ordered() {
sRender1 = sRender {
Inputs = {
GlobalOut = Input { Value = 119, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
UseFrameFormatSettings = Input { Value = 1, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
Input = Input {
SourceOp = "sTransform1",
Source = "Output",
}
},
ViewInfo = OperatorInfo { Pos = { 1870, 181.5 } },
},
sEllipse1 = sEllipse {
Inputs = {
Width = Input { Value = 0.02, },
Height = Input { Value = 0.02, },
Red = Input { Value = 0.364705882352941, },
Green = Input { Value = 0.619607843137255, }
},
ViewInfo = OperatorInfo { Pos = { 825, 181.5 } },
},
sDuplicate1 = sDuplicate {
Inputs = {
Copies = Input { Value = 400, },
XSize = Input { Value = 0.995, },
YSize = Input { Value = 0.995, },
Input = Input {
SourceOp = "sEllipse1",
Source = "Output",
},
UsePath = Input { Value = 1, },
PathDisplacementScale = Input { Value = 0.501, },
Polyline = Input {
Value = Polyline {
Closed = true,
Points = {
{ X = -0.124892456549235, Y = 0.000637235073932159, LX = 8.45442188872723e-18, LY = 0.0690355937288492, RX = -8.45442188872723e-18, RY = -0.0690355937288492 },
{ X = 0.000107543450764359, Y = -0.124362764926068, LX = -0.0690355937288492, LY = 1.26816328330908e-17, RX = 0.0690355937288492, RY = -1.26816328330908e-17 },
{ X = 0.125107543450764, Y = 0.000637235073932131, LX = -1.69088437774545e-17, LY = -0.0690355937288492, RX = 1.69088437774545e-17, RY = 0.0690355937288492 },
{ X = 0.000107543450764359, Y = 0.125637235073932, LX = 0.0690355937288492, LY = -2.11360547218181e-17, RX = -0.0690355937288492, RY = 2.11360547218181e-17 }
}
},
}
},
ViewInfo = OperatorInfo { Pos = { 1155, 181.5 } },
},
sTransform1 = sTransform {
Inputs = {
ZRotation = Input { Value = -90, },
Input = Input {
SourceOp = "sDuplicate1",
Source = "Output",
}
},
ViewInfo = OperatorInfo { Pos = { 1485, 181.5 } },
},
Merge2 = Merge {
Inputs = {
Background = Input {
SourceOp = "BrightnessContrast1",
Source = "Output",
},
Foreground = Input {
SourceOp = "sRender1",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, }
},
ViewInfo = OperatorInfo { Pos = { 2695, 181.5 } },
},
Merge3 = Merge {
Inputs = {
Background = Input {
SourceOp = "Background3",
Source = "Output",
},
Foreground = Input {
SourceOp = "Merge2",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
EffectMask = Input {
SourceOp = "Rectangle1",
Source = "Mask",
}
},
ViewInfo = OperatorInfo { Pos = { 2970, 181.5 } },
},
Rectangle1 = RectangleMask {
Inputs = {
Filter = Input { Value = FuID { "Fast Gaussian" }, },
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
UseFrameFormatSettings = Input { Value = 1, },
ClippingMode = Input { Value = FuID { "None" }, },
Center = Input { Value = { 0.25, 0.5 }, },
Height = Input { Value = 1, }
},
ViewInfo = OperatorInfo { Pos = { 2970, 82.5 } },
},
Background3 = Background {
Inputs = {
GlobalOut = Input { Value = 119, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
UseFrameFormatSettings = Input { Value = 1, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
TopLeftAlpha = Input { Value = 0, }
},
ViewInfo = OperatorInfo { Pos = { 2970, 313.5 } },
},
Blur1 = Blur {
Inputs = {
Filter = Input { Value = FuID { "Fast Gaussian" }, },
XBlurSize = Input { Value = 29.1, },
Input = Input {
SourceOp = "sRender1",
Source = "Output",
},
EffectMask = Input {
SourceOp = "Ellipse1",
Source = "Mask",
}
},
ViewInfo = OperatorInfo { Pos = { 2200, 313.5 } },
},
BrightnessContrast1 = BrightnessContrast {
Inputs = {
Brightness = Input { Value = 0.16, },
Saturation = Input { Value = 2.59, },
PreDividePostMultiply = Input { Value = 1, },
Input = Input {
SourceOp = "Blur1",
Source = "Output",
},
EffectMask = Input {
SourceOp = "Ellipse1",
Source = "Mask",
}
},
ViewInfo = OperatorInfo { Pos = { 2585, 313.5 } },
},
Merge4 = Merge {
Inputs = {
Background = Input {
SourceOp = "Merge3",
Source = "Output",
},
Foreground = Input {
SourceOp = "ColorCorrector1",
Source = "Output",
},
FlipHoriz = Input { Value = 1, },
FlipVert = Input { Value = 1, },
PerformDepthMerge = Input { Value = 0, }
},
ViewInfo = OperatorInfo { Pos = { 3245, 181.5 } },
},
ColorCorrector1 = ColorCorrector {
Inputs = {
WheelTintAngle1 = Input { Value = 0.829154551717347, },
WheelTintLength1 = Input { Value = 0.3697, },
ColorRanges = Input {
Value = ColorCurves {
Curves = {
{
Points = {
{ 0, 1 },
{ 0.4, 0.2 },
{ 0.6, 0 },
{ 1, 0 }
}
},
{
Points = {
{ 0, 0 },
{ 0.4, 0 },
{ 0.6, 0.2 },
{ 1, 1 }
}
}
}
},
},
HistogramIgnoreTransparent = Input { Value = 1, },
Input = Input {
SourceOp = "Merge3",
Source = "Output",
}
},
ViewInfo = OperatorInfo { Pos = { 3245, 49.5 } },
},
Merge5 = Merge {
Inputs = {
Background = Input {
SourceOp = "Background2",
Source = "Output",
},
Foreground = Input {
SourceOp = "Merge4",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
EffectMask = Input {
SourceOp = "Ellipse2",
Source = "Mask",
}
},
ViewInfo = OperatorInfo { Pos = { 3465, 181.5 } },
},
Background2 = Background {
Inputs = {
GlobalOut = Input { Value = 119, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
UseFrameFormatSettings = Input { Value = 1, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
TopLeftRed = Input { Value = 0.188235294117647, },
TopLeftGreen = Input { Value = 0.188235294117647, },
TopLeftBlue = Input { Value = 0.188235294117647, }
},
ViewInfo = OperatorInfo { Pos = { 3465, 313.5 } },
},
Ellipse2 = EllipseMask {
Inputs = {
Filter = Input { Value = FuID { "Fast Gaussian" }, },
Invert = Input { Value = 1, },
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
UseFrameFormatSettings = Input { Value = 1, },
ClippingMode = Input { Value = FuID { "None" }, },
Width = Input { Value = 0.249413079797577, },
Height = Input { Value = 0.249413079797577, }
},
ViewInfo = OperatorInfo { Pos = { 3465, 82.5 } },
},
Ellipse1 = EllipseMask {
Inputs = {
Filter = Input { Value = FuID { "Fast Gaussian" }, },
Invert = Input { Value = 1, },
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
UseFrameFormatSettings = Input { Value = 1, },
ClippingMode = Input { Value = FuID { "None" }, },
Width = Input { Value = 0.24753157195051, },
Height = Input { Value = 0.24753157195051, }
},
ViewInfo = OperatorInfo { Pos = { 2420, 511.5 } },
}
}
}
The node to bring this all together is using the sDuplicate if you are using shapes aka vectors or Duplicate for non vector stuff. Since you will be making 200-400 copies vectors will render a lot faster. You could also do this with particles and get really cool effects using the over life controls
This can be a bit complicated since there’s so many more controls once you get into the particle world
Using particles:
{
Tools = ordered() {
pEmitter1 = pEmitter {
ID = 7,
CtrlWZoom = false,
Inputs = {
Lifespan = Input { Value = 60, },
Style = Input { Value = FuID { "ParticleStyleNGon" }, },
["ParticleStyleNGon.NGonType"] = Input { Value = 6, },
["SphereRgn.Size"] = Input { Value = 0, },
["SphereRgn.Translate.X"] = Input {
SourceOp = "pEmitter1XOffset",
Source = "Value",
},
["SphereRgn.Translate.Y"] = Input {
SourceOp = "pEmitter1YOffset",
Source = "Value",
},
["ParticleStyle.ColorControls"] = Input { Value = 1, },
["ParticleStyle.ColorOverLifeControls"] = Input { Value = 1, },
["ParticleStyle.ColorOverLife"] = Input {
Value = Gradient {
Colors = {
[0] = { 1, 1, 1, 1 },
[1] = { 0.376470588235294, 0.52156862745098, 0.549019607843137, 1 }
}
},
},
["ParticleStyle.SizeControls"] = Input { Value = 1, },
["ParticleStyle.Size"] = Input { Value = 2, },
["ParticleStyle.SizeOverLife"] = Input {
SourceOp = "pEmitter1SizeOverLife",
Source = "Value",
},
["ParticleStyle.BlurOverLife"] = Input {
SourceOp = "pEmitter1BlurOverLife2D",
Source = "Value",
}
},
ViewInfo = OperatorInfo { Pos = { 1320, 676.5 } },
},
pEmitter1XOffset = BezierSpline {
SplineColor = { Red = 250, Green = 59, Blue = 49 },
KeyFrames = {
[0] = { -0.159279073649641, RH = { 12.1818181818182, -0.159279073649641 }, Flags = { Loop = true } },
[26] = { -0.0379965457686, LH = { 9.72544837135166, -0.101617779343743 }, RH = { 43.3338969515702, 0.0297659297752441 } },
[63] = { 0.0870034542314, LH = { 39.8400611438466, 0.0870034542314 }, RH = { 80.3339304815639, 0.0870034542314 } },
[100] = { -0.0379965457686, LH = { 76.8377445339471, -0.0379965457686 }, Flags = { Loop = true } }
}
},
pEmitter1YOffset = BezierSpline {
SplineColor = { Red = 252, Green = 131, Blue = 47 },
KeyFrames = {
[0] = { 0.00249597113338179, RH = { 12.1818181818182, 0.00249597113338179 }, Flags = { Loop = true } },
[26] = { -0.1150690846287, LH = { 9.72544837135166, -0.116989725642289 }, RH = { 43.3339304815639, -0.113023421032599 } },
[63] = { 0.0099309153713, LH = { 39.8400611438466, -0.068312121304894 }, RH = { 80.3339304815639, 0.0684914913225294 } },
[100] = { 0.1349309153713, LH = { 76.8377445339471, 0.1349309153713 }, Flags = { Loop = true } }
}
},
pEmitter1SizeOverLife = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0.5, RH = { 0.293948130196329, 0.375008207259461 }, Flags = { Linear = true } },
[0.974960528815966] = { 0, LH = { 0.649973685877317, 0.4177473279987 } }
}
},
SplineColor = { Red = 192, Green = 128, Blue = 64 },
},
pEmitter1BlurOverLife2D = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0.5, RH = { 0.333333333333333, 0.5 }, Flags = { Linear = true } },
[1] = { 0.5, LH = { 0.666666666666667, 0.5 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 192, Green = 128, Blue = 64 },
CtrlWZoom = false,
},
pRender1 = pRender {
Inputs = {
_MotionBlurWarning = Input { Disabled = true, },
GlobalOut = Input { Value = 119, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
OutputMode = Input { Value = FuID { "TwoD" }, },
SubFrameCalculationAccuracy = Input { Value = 10, },
["MaterialID.MaterialID"] = Input { Value = 1, },
["ObjectID.ObjectID"] = Input { Value = 1, },
Translation = Input { Value = 1, },
Rotation = Input { Value = 1, },
PivotNest = Input { Value = 1, },
Input = Input {
SourceOp = "pEmitter1",
Source = "Output",
}
},
ViewInfo = OperatorInfo { Pos = { 1540, 676.5 } },
}
}
}
1 Like
Thanks, @JayAreTV this is super helpful.
1 Like




