Creating tapered lines

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