Jump to: Board index » General » Fusion

Tapered strokes

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

bobodes

  • Posts: 5
  • Joined: Mon Jan 21, 2019 10:00 am
  • Real Name: Boris Desgeyl

Tapered strokes

PostMon Jan 21, 2019 11:42 am

On youtube I found an after effects tutorial showing how to create tapered strokes with a dotted text line along a path and there is no need for expressions (search for "after effects tapered strokes no expressions").

Does anybody have a solution how to solve this in fusion/resolve?:

Unfortunately Text+ does not offer to reszize the characters along the path. Any ideas?
Thanks.
Offline

xunile

  • Posts: 3072
  • Joined: Mon Apr 23, 2018 5:21 am
  • Real Name: Eric Eisenmann

Re: Tapered strokes

PostMon Jan 21, 2019 7:43 pm

bobodes wrote:On youtube I found an after effects tutorial showing how to create tapered strokes with a dotted text line along a path and there is no need for expressions (search for "after effects tapered strokes no expressions").

Does anybody have a solution how to solve this in fusion/resolve?:

Unfortunately Text+ does not offer to reszize the characters along the path. Any ideas?
Thanks.


You can use a Paint node and a polygon mask to create a tapered stroke.
Win 10 Home | Intel i7 - 10700f 64 GB 1 TB GB SSD 2 TB SSD
RTX-3060 12 GB | Resolve Studio 18.6.6| Fusion Studio 18.6.6

Win 10 Home | Intel Core I7-7700HQ 32 GB 1 TB NVME SSD 1 TB SATA SSD
GTX-1060-6GB | Resolve 17.4.6
Offline

Frank Feijen

  • Posts: 167
  • Joined: Tue Dec 13, 2016 10:04 am
  • Location: Vilvoorde, Belgium

Re: Tapered strokes

PostTue Jan 22, 2019 8:05 am

Or with some expressions and particles?
Code: Select all
{
   Tools = ordered() {
      Polygon1 = PolylineMask {
         DrawMode = "ClickAppend",
         DrawMode2 = "InsertAndModify",
         Inputs = {
            MaskWidth = Input { Value = 1920, },
            MaskHeight = Input { Value = 1080, },
            PixelAspect = Input { Value = { 1, 1 }, },
            ClippingMode = Input { Value = FuID { "None" }, },
            Polyline = Input {
               SourceOp = "Publish1",
               Source = "Value",
            },
            Polyline2 = Input {
               Value = Polyline {
               },
               Disabled = true,
            },
         },
         ViewInfo = OperatorInfo { Pos = { 715, 181.5 } },
      },
      Publish1 = PublishPolyLine {
         Inputs = {
            Value = Input {
               Value = Polyline {
                  Points = {
                     { X = -0.401534527540207, Y = 0.00909090880304575, RX = 0.0505652248167056, RY = 0.17973639003029 },
                     { X = -0.0997442454099655, Y = 0.284090906381607, LX = -0.078005114975183, LY = 0.0499999972906979, RX = 0.113692522731533, RY = -0.0728750394170668 },
                     { X = 0.0690537095069885, Y = -0.286363631486893, LX = -0.148337594840838, LY = 0.0318181866949247, RX = 0.122524416481178, RY = -0.0262812995078417 },
                     { X = 0.410485923290253, Y = -0.0318181812763214, LX = -0.109453898651043, LY = -0.140413374859206 }
                  }
               },
            },
         },
      },
      Background1 = Background {
         Inputs = {
            GlobalOut = Input { Value = 100, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            EffectMask = Input {
               SourceOp = "Polygon1",
               Source = "Mask",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 880, 181.5 } },
      },
      pEmitter1 = pEmitter {
         ID = 8,
         Inputs = {
            Lifespan = Input { Value = 50, },
            Style = Input { Value = FuID { "ParticleStyleNGon" }, },
            ["ParticleStyle.SizeControls"] = Input { Value = 1, },
            ["ParticleStyle.SizeOverLife"] = Input {
               SourceOp = "pEmitter1SizeoverLife",
               Source = "Value",
            },
            ["ParticleStyle.BlurOverLife"] = Input {
               SourceOp = "pEmitter1BluroverLife2D",
               Source = "Value",
            },
            ["SphereRgn.Translate.X"] = Input {
               Value = 0.651115038704123,
               Expression = "Transform1.Center.X",
            },
            ["SphereRgn.Translate.Y"] = Input {
               Value = 0.219729030724273,
               Expression = "Transform1.Center.Y",
            },
            ["SphereRgn.Size"] = Input { Value = 0, },
            ["ParticleStyleNGon.NGonType"] = Input { Value = 6, },
         },
         ViewInfo = OperatorInfo { Pos = { 880, 214.5 } },
      },
      pEmitter1SizeoverLife = LUTBezier {
         KeyColorSplines = {
            [0] = {
               [0] = { 0.5, RH = { 0.328621908127208, 0.333333333333333 }, Flags = { Linear = true } },
               [0.985865724381625] = { 0, LH = { 0.657243816254417, 0.166666666666667 }, Flags = { Linear = true } }
            }
         },
         SplineColor = { Red = 192, Green = 128, Blue = 64 },
         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 = 192, Green = 128, Blue = 64 },
         NameSet = true,
      },
      pRender1 = pRender {
         Inputs = {
            _MotionBlurWarning = Input { Disabled = true, },
            GlobalOut = Input { Value = 100, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            OutputMode = Input { Disabled = true, },
            IntegrationMethod = Input { Value = FuID { "RK4" }, },
            SubFrameCalculationAccuracy = Input { Value = 5, },
            ["MaterialID.MaterialID"] = Input { Value = 2, },
            ["ObjectID.ObjectID"] = Input { Value = 2, },
            Input = Input {
               SourceOp = "pEmitter1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 990, 214.5 } },
      },
      Transform1 = Transform {
         CtrlWZoom = false,
         Inputs = {
            Center = Input {
               SourceOp = "Path1",
               Source = "Position",
            },
            Input = Input {
               SourceOp = "Background1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 1045, 181.5 } },
      },
      Path1 = PolyPath {
         DrawMode = "InsertAndModify",
         CtrlWZoom = false,
         Inputs = {
            Displacement = Input {
               SourceOp = "Path1Displacement",
               Source = "Value",
            },
            PolyLine = Input {
               SourceOp = "Publish1",
               Source = "Value",
            },
         },
      },
      Path1Displacement = BezierSpline {
         SplineColor = { Red = 255, Green = 0, Blue = 255 },
         NameSet = true,
         KeyFrames = {
            [0] = { 0, RH = { 33.3333333333333, 0.333333333333333 }, Flags = { Linear = true, LockedY = true } },
            [100] = { 1, LH = { 66.6666666666667, 0.666666666666667 }, Flags = { Linear = true } }
         }
      },
      Merge3D1 = Merge3D {
         Inputs = {
            SceneInput1 = Input {
               SourceOp = "pRender1",
               Source = "Output",
            },
            SceneInput2 = Input {
               SourceOp = "Camera3D1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 1100, 214.5 } },
      },
      Camera3D1 = Camera3D {
         Inputs = {
            ["Transform3DOp.Translate.X"] = Input { Value = 0.557, },
            ["Transform3DOp.Translate.Y"] = Input { Value = 0.481, },
            ["Transform3DOp.Translate.Z"] = Input { Value = 2.37191106617693, },
            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 = 3, },
            ["MtlStdInputs.MaterialID"] = Input { Value = 3, },
         },
         ViewInfo = OperatorInfo { Pos = { 1100, 247.5 } },
      },
      Renderer3D1 = Renderer3D {
         CustomData = {
            ToolVersion = 2,
         },
         Inputs = {
            GlobalOut = Input { Value = 100, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            SceneInput = Input {
               SourceOp = "Merge3D1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 1210, 214.5 } },
      }
   }
}
Offline

bobodes

  • Posts: 5
  • Joined: Mon Jan 21, 2019 10:00 am
  • Real Name: Boris Desgeyl

Re: Tapered strokes

PostTue Jan 22, 2019 1:07 pm

Thanks for your solution, Frank. It's working, but unfortunately it's a bit slow for editing on my machine.
I hoped there would be a more direct way with e.g. Paint Tool, just animating Write On.
@xunile: Did I miss something, how can I animate this along a path?
Offline

xunile

  • Posts: 3072
  • Joined: Mon Apr 23, 2018 5:21 am
  • Real Name: Eric Eisenmann

Re: Tapered strokes

PostTue Jan 22, 2019 6:39 pm

bobodes wrote:Thanks for your solution, Frank. It's working, but unfortunately it's a bit slow for editing on my machine.
I hoped there would be a more direct way with e.g. Paint Tool, just animating Write On.
@xunile: Did I miss something, how can I animate this along a path?



I thought you were asking if it was possible to do a tapered stroke like in the video, not also animating it.
Here is a way to animate it along a path and have it auto orient as well. This is just the basic animation, you can use various warp tools to have it warp around the turns.

Code: Select all
{
   Tools = ordered() {
      Background1_1 = Background {
         Inputs = {
            GlobalOut = Input { Value = 300, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            TopLeftRed = Input { Value = 1, },
            TopLeftGreen = Input { Value = 1, },
            TopLeftBlue = Input { Value = 1, },
         },
         ViewInfo = OperatorInfo { Pos = { 863, 79 } },
      },
      Merge1 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "Background1_1",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "Transform1",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 863, 180 } },
      },
      Transform1 = Transform {
         CtrlWZoom = false,
         Inputs = {
            FlipHoriz = Input { Value = 1, },
            Center = Input {
               SourceOp = "Path1",
               Source = "Position",
            },
            Angle = Input {
               SourceOp = "Path1",
               Source = "Heading",
            },
            Input = Input {
               SourceOp = "Paint1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 613, 178 } },
      },
      Path1 = PolyPath {
         DrawMode = "InsertAndModify",
         CtrlWZoom = false,
         Inputs = {
            Displacement = Input {
               SourceOp = "Path1Displacement",
               Source = "Value",
            },
            PolyLine = Input {
               Value = Polyline {
                  Points = {
                     { Linear = true, LockY = true, X = 0.384969325153374, Y = -0.405994550408719, RX = -0.339468302658486, RY = 0.119891008174387 },
                     { LockY = true, X = 0.0613496932515337, Y = 0.288828337874659, LX = 0.190649885588232, LY = -0.25386403136904, RX = -0.203721249149077, RY = 0.0124443919438363 },
                     { LockY = true, X = -0.412576687116564, Y = -0.359673024523161, LX = 0.16376180032326, LY = 0.246630929951166, RX = -0.0830081361825607, RY = -0.101567744737985 },
                     { LockY = true, X = -0.730619500572222, Y = -0.533586068001422, LX = 0.106014271151886, LY = 0.0579710144927536 }
                  }
               },
            },
         },
      },
      Path1Displacement = BezierSpline {
         SplineColor = { Red = 255, Green = 0, Blue = 255 },
         NameSet = true,
         KeyFrames = {
            [0] = { 0, RH = { 10, 0.134516535713417 }, Flags = { Linear = true, LockedY = true } },
            [30] = { 0.403549607140251, LH = { 20, 0.269033071426834 }, RH = { 40.3333333333333, 0.541668942029548 }, Flags = { Linear = true, LockedY = true } },
            [61] = { 0.817907611808141, LH = { 50.6666666666667, 0.679788276918845 }, RH = { 75.6666666666667, 0.878605074538761 }, Flags = { Linear = true, LockedY = true } },
            [105] = { 1, LH = { 90.3333333333333, 0.93930253726938 }, Flags = { Linear = true, LockedY = true } }
         }
      },
      Paint1 = Paint {
         Inputs = {
            Input = Input {
               SourceOp = "Background1",
               Source = "Output",
            },
            Paint = Input {
               SourceOp = "PolylineStroke1",
               Source = "Out",
            },
            EffectMask = Input {
               SourceOp = "Polygon1",
               Source = "Mask",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 318, 178 } },
      },
      PolylineStroke1 = PolylineStroke {
         Points = {
         },
         IsThreaded = false,
         Brushes = { "SoftBrush" },
         ApplyModes = { "PaintApplyColor" },
         CtrlWZoom = false,
         Inputs = {
            BrushControls = Input { Value = 1, },
            ["SoftBrush.Size"] = Input { Value = 0.057, },
            ["SoftBrush.Softness"] = Input { Value = 0.001, },
            ["PaintApplyColor.Red"] = Input { Value = 0, },
            ["PaintApplyColor.Green"] = Input { Value = 0, },
            ["PaintApplyColor.Blue"] = Input { Value = 0, },
            StrokeControls = Input { Value = 1, },
            Spacing = Input { Value = 0, },
            Polyline = Input {
               Value = Polyline {
                  Points = {
                     { Linear = true, X = -0.245398770080754, Y = -0.00681198908178504, RX = 0.172801633767311, RY = -1.17155452006301e-010 },
                     { Linear = true, X = 0.27300613122118, Y = -0.0068119894332514, LX = -0.172801633767311, LY = 1.17155452006301e-010 }
                  }
               },
            },
         },
      },
      Polygon1 = PolylineMask {
         DrawMode = "ModifyOnly",
         DrawMode2 = "InsertAndModify",
         Inputs = {
            MaskWidth = Input { Value = 1920, },
            MaskHeight = Input { Value = 1080, },
            PixelAspect = Input { Value = { 1, 1 }, },
            ClippingMode = Input { Value = FuID { "None" }, },
            Polyline = Input {
               SourceOp = "Polygon1Polyline",
               Source = "Value",
            },
            Polyline2 = Input {
               Value = Polyline {
               },
               Disabled = true,
            },
         },
         ViewInfo = OperatorInfo { Pos = { 313, 87 } },
      },
      Polygon1Polyline = BezierSpline {
         SplineColor = { Red = 173, Green = 255, Blue = 47 },
         NameSet = true,
         KeyFrames = {
            [73] = { 0, Flags = { Linear = true, LockedY = true }, Value = Polyline {
                  Closed = true,
                  Points = {
                     { Linear = true, X = -0.0272933736534938, Y = 0.0395206554051565, LX = 0.0712143580118815, LY = -0.0136975695689519, RX = -0.00970393419265747, RY = -0.0150377005338669 },
                     { X = -0.0277638629170284, Y = -0.0449461484137846, LX = -0.0205024480819702, LY = 0.0349997282028198, RX = 0.071371187766393, RY = 0.0144580317040284 },
                     { Linear = true, X = 0.186349700382151, Y = -0.0015720533016993, LX = -0.071371187766393, LY = -0.0144580317040284, RX = -0.0712143580118815, RY = 0.0136975695689519 }
                  }
               } }
         }
      },
      Background1 = Background {
         Inputs = {
            GlobalOut = Input { Value = 300, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            TopLeftAlpha = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 160, 179 } },
      }
   }
}


Here is another one using ellipses and a duplicate node. It requires some fine tuning but it covers the general concept.

Code: Select all
{
   Tools = ordered() {
      Transform1 = Transform {
         Inputs = {
            FlipHoriz = Input { Value = 1, },
            Center = Input {
               SourceOp = "Path1",
               Source = "Position",
            },
            Angle = Input {
               SourceOp = "Path1",
               Source = "Heading",
            },
            Input = Input {
               SourceOp = "Duplicate1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 453, 206 } },
      },
      Path1 = PolyPath {
         DrawMode = "InsertAndModify",
         Inputs = {
            Displacement = Input {
               SourceOp = "Path1Displacement",
               Source = "Value",
            },
            PolyLine = Input {
               Value = Polyline {
                  Points = {
                     { Linear = true, LockY = true, X = -0.605504587155963, Y = 0.331521739130435, RX = 0.207951070336391, RY = -0.221014492753623 },
                     { LockY = true, X = 0.018348623853211, Y = -0.331521739130435, LX = -0.289163595259053, LY = 0.0638088168348348, RX = 0.136276148364694, RY = 0.165706495051005 },
                     { LockY = true, X = 0.314984709480122, Y = 0.217391304347826, LX = -0.180093572152941, LY = -0.0685557873673892, RX = 0.17533129459735, RY = -0.110507246376812 },
                     { LockY = true, X = 0.712538226299694, Y = -0.407608695652174, LX = -0.132517838939857, LY = 0.208333333333333 }
                  }
               },
            },
         },
      },
      Path1Displacement = BezierSpline {
         SplineColor = { Red = 255, Green = 0, Blue = 255 },
         NameSet = true,
         KeyFrames = {
            [0] = { 0, RH = { 10, 0.133743247011338 }, Flags = { Linear = true, LockedY = true } },
            [30] = { 0.401229741034014, LH = { 20, 0.267486494022676 }, RH = { 39.6666666666667, 0.493253819280156 }, Flags = { Linear = true, LockedY = true } },
            [59] = { 0.67730197577244, LH = { 49.3333333333333, 0.585277897526298 }, RH = { 69, 0.784867983848293 }, Flags = { Linear = true, LockedY = true } },
            [89] = { 1, LH = { 79, 0.892433991924147 }, Flags = { Linear = true, LockedY = true } }
         }
      },
      Duplicate1 = Fuse.Duplicate {
         CtrlWZoom = false,
         Inputs = {
            Copies = Input { Value = 20, },
            TimeOffset = Input { Value = 5, },
            Center = Input { Value = { 0.5092024539877, 0.5 }, },
            Pivot = Input { Value = { 0.595312499999995, 0.5 }, },
            XSize = Input { Value = 0.915, },
            Angle = Input {
               SourceOp = "Duplicate1Angle",
               Source = "Value",
            },
            RandomSeed = Input { Value = 26024, },
            Background = Input {
               SourceOp = "Background1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 302, 208 } },
      },
      Duplicate1Angle = BezierSpline {
         SplineColor = { Red = 14, Green = 221, Blue = 144 },
         NameSet = true,
         KeyFrames = {
            [23] = { 0, RH = { 25, 3.16666666666667 }, Flags = { Linear = true } },
            [29] = { 9.5, LH = { 27, 6.33333333333333 }, RH = { 30.3333333333333, 6.33333333333333 }, Flags = { Linear = true } },
            [33] = { 0, LH = { 31.6666666666667, 3.16666666666667 }, RH = { 41.6666666666667, -2.1 }, Flags = { Linear = true } },
            [59] = { -6.3, LH = { 50.3333333333333, -4.2 }, RH = { 62.6666666666667, -4.2 }, Flags = { Linear = true } },
            [70] = { 0, LH = { 66.3333333333333, -2.1 }, Flags = { Linear = true } }
         }
      },
      Ellipse1 = EllipseMask {
         Inputs = {
            MaskWidth = Input { Value = 1920, },
            MaskHeight = Input { Value = 1080, },
            PixelAspect = Input { Value = { 1, 1 }, },
            ClippingMode = Input { Value = FuID { "None" }, },
            Center = Input { Value = { 0.51840490797546, 0.5 }, },
            Width = Input { Value = 0.0430086951048631, },
            Height = Input { Value = 0.0292682926829268, },
         },
         ViewInfo = OperatorInfo { Pos = { 140, 149 } },
      },
      Background1 = Background {
         Inputs = {
            GlobalOut = Input { Value = 150, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            EffectMask = Input {
               SourceOp = "Ellipse1",
               Source = "Mask",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 143, 211 } },
      }
   }
}
Win 10 Home | Intel i7 - 10700f 64 GB 1 TB GB SSD 2 TB SSD
RTX-3060 12 GB | Resolve Studio 18.6.6| Fusion Studio 18.6.6

Win 10 Home | Intel Core I7-7700HQ 32 GB 1 TB NVME SSD 1 TB SATA SSD
GTX-1060-6GB | Resolve 17.4.6
Offline

bobodes

  • Posts: 5
  • Joined: Mon Jan 21, 2019 10:00 am
  • Real Name: Boris Desgeyl

Re: Tapered strokes

PostThu Jan 24, 2019 11:18 pm

xunile, thanks for the code examples.
However, Frank's solution is more workable for my job.
Thanks again both of you.
Offline

Frank Feijen

  • Posts: 167
  • Joined: Tue Dec 13, 2016 10:04 am
  • Location: Vilvoorde, Belgium

Re: Tapered strokes

PostThu Jan 24, 2019 11:24 pm

Hey Xunile, did you animate the duplicate-angle by hand? I'm wondering if it's possible to somehow link it to the path. If there would be a way to look at the previous point on the path and calculate the angle? Man, it'd be so cool to be a math-wizard... :o
Offline

Sander de Regt

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

Re: Tapered strokes

PostThu Jan 24, 2019 11:29 pm

Most angles can be 'connected to' the heading of a path.
Try it for yourself: create a path and something you want to move in the same way your path moves, say a transform. Go to the 'angle' setting, right click and select connect to--> path--> heading and your transform will rotate along the path.
Sander de Regt

ShadowMaker SdR
The Netherlands

Return to Fusion

Who is online

Users browsing this forum: Hawkeye68 and 29 guests