Jump to: Board index » General » Fusion

How to make particles follow a curve

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

santanamo

  • Posts: 6
  • Joined: Mon May 16, 2022 8:26 am
  • Real Name: Julius Kristmann

How to make particles follow a curve

PostMon May 16, 2022 9:02 am

Hi Guys,

i'm trying to make a fancy animation for our company logo, but i'm having trouble with understanding the particle system. :?:

I cant figure out how to make particles follow a line with a sine wave at its end. I tried pemitter->pfollow->prender and used a bezier curve (which i drew ontop of the logo to match it) in the pfollow node to tell the node the path. The particles should move along the line and stick to it while going from left to right. but whatever i tried so far, the particle stream is somehow effected by the curve, but the particles do not follow it.

is there a simple way to explain how to get particles to follow a line? i dont want to emit them across the line. after emitting them, they should fly along the line.

thanks already! :roll:
Offline

birdseye

  • Posts: 345
  • Joined: Fri Jun 12, 2020 2:36 pm
  • Real Name: Iain Fisher

Re: How to make particles follow a curve

PostTue May 17, 2022 5:11 pm

From 29 minutes in, this tutorial may help you achieve what you need.

Offline

Eyn-0519

  • Posts: 15
  • Joined: Thu Jun 10, 2021 4:00 pm
  • Real Name: Hui Eyn

Re: How to make particles follow a curve

PostWed May 18, 2022 1:04 am

birdseye wrote:From 29 minutes in, this tutorial may help you achieve what you need.

Hey, thanks for the link, I have the same question, but I can't view the video here, can you use a short description of the operation process, thank you!
--Sorry, I'm not very good at English, I translated it with translation software
Offline

birdseye

  • Posts: 345
  • Joined: Fri Jun 12, 2020 2:36 pm
  • Real Name: Iain Fisher

Re: How to make particles follow a curve

PostWed May 18, 2022 11:00 am

If you search YouTube for 'VFXstudy' it will be simple to find. YouTube may offer subtitles in a language that you are more comfortable with. If you click on the video and then the title at the top of the video, that should also take you to the video on YouTube.
Offline

Eyn-0519

  • Posts: 15
  • Joined: Thu Jun 10, 2021 4:00 pm
  • Real Name: Hui Eyn

Re: How to make particles follow a curve

PostThu May 19, 2022 2:52 pm

Hey buddy! I can't open a video link from youtube, it might require a VPN, but I haven't done that, if you're willing to upload a simple comp file I can learn on my own, that's going to give me a great deal help, thanks!
Offline

birdseye

  • Posts: 345
  • Joined: Fri Jun 12, 2020 2:36 pm
  • Real Name: Iain Fisher

Re: How to make particles follow a curve

PostThu May 19, 2022 6:08 pm

You must have a very...'unique' set up there. Anyway apart from connecting the nodes the changes he made from the standard settings are, he changed the output Mode in the pRender to 2d, he changed the particle emitter to 'Bitmap', drew the polygon, increased the border width and removed the animation in the Polygon node (right click on the bottom control of the polygon node to reveil the option). He also later changed the polygon by adjusting the Length control to about 0.1 and the Position control by setting keyframes at the first and last frame.

In the pEmitter he set the Lifespan duration to the length of the comp, he then increased the number of particles to 200 on frame 0 and increased the Velocity Variance a small amount. In the Glow node he increased the Glow. He also, in the pEmitter Style tab set them to change colour over time using the Color Over Life Controls
Anyway he ended up with something like this, this has a comp life of 201 frames.

Code: Select all
{
   Tools = ordered() {
      Glow1 = Glow {
         Inputs = {
            Blend = Input { Value = 0.2, },
            Filter = Input { Value = FuID { "Fast Gaussian" }, },
            Input = Input {
               SourceOp = "pRender1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 582.667, 37.0606 } },
      },
      pRender1 = pRender {
         Inputs = {
            _MotionBlurWarning = Input { Disabled = true, },
            GlobalOut = Input { Value = 200, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            OutputMode = Input {
               Value = FuID { "TwoD" },
               Disabled = true,
            },
            ["MaterialID.MaterialID"] = Input { Value = 1, },
            ["ObjectID.ObjectID"] = Input { Value = 1, },
            Input = Input {
               SourceOp = "pEmitter1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 460, 36.4545 } },
      },
      pEmitter1 = pEmitter {
         ID = 7,
         CtrlWZoom = false,
         Inputs = {
            Number = Input { Value = 200, },
            Lifespan = Input { Value = 200, },
            VelocityControls = Input { Value = 1, },
            VelocityVariance = Input { Value = 0.015, },
            Region = Input { Value = FuID { "BitmapRgn" }, },
            ["BezierRgn.Polyline"] = Input {
               Value = Polyline {
                  Points = {
                     { X = -0.372161059357918, Y = -0.165540357510486, RX = 0.0149046470020282, RY = 0.0728771755083296 },
                     { X = -0.306451612903226, Y = 0.00896057347670251, LX = -0.0330085282869085, LY = -0.0381701509083454, RX = 0.0532524201767647, RY = 0.0615796286557827 },
                     { X = -0.11768219832736, Y = 0.0555555555555556, LX = -0.0622795818873559, LY = 0.0222685714306534, RX = 0.0808667061031907, RY = -0.0289145489845711 },
                     { X = 0.104540023894863, Y = -0.137992831541219, LX = -0.0817078885875985, LY = -0.0200957239499229, RX = 0.0917636480979735, RY = 0.022568897234907 },
                     { X = 0.324372759856631, Y = 0.164277180406213, LX = -0.0885119087892645, LY = -0.0486010844624688, RX = 0.0409344055929248, RY = 0.0224767099801151 },
                     { X = 0.433094384707288, Y = 0.0424133811230585, LX = -0.0338936096288661, LY = 0.0721702546316346 }
                  }
               },
            },
            ["BitmapRgn.Bitmap"] = Input {
               SourceOp = "Polygon1",
               Source = "Mask",
            },
            ["ParticleStyle.ColorControls"] = Input { Value = 1, },
            ["ParticleStyle.ColorOverLifeControls"] = Input { Value = 1, },
            ["ParticleStyle.ColorOverLife"] = Input {
               Value = Gradient {
                  Colors = {
                     [0] = { 0.336, 0.178, 1, 1 },
                     [0.25414364640884] = { 0, 1, 0, 1 },
                     [0.464088397790055] = { 1, 0, 0, 1 },
                     [0.69060773480663] = { 0, 0, 1, 1 },
                     [0.911602209944751] = { 1, 1, 0, 1 }
                  }
               },
            },
            ["ParticleStyle.SizeOverLife"] = Input {
               SourceOp = "pEmitter1SizeOverLife",
               Source = "Value",
            },
            ["ParticleStyle.BlurOverLife"] = Input {
               SourceOp = "pEmitter1BlurOverLife2D",
               Source = "Value",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 330, 36.4545 } },
      },
      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 = 192, Green = 128, Blue = 64 },
         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 = 192, Green = 128, Blue = 64 },
         CtrlWZoom = false,
         NameSet = true,
      },
      Polygon1 = PolylineMask {
         DrawMode = "ClickAppend",
         DrawMode2 = "InsertAndModify",
         CtrlWZoom = false,
         Inputs = {
            Filter = Input { Value = FuID { "Fast Gaussian" }, },
            BorderWidth = Input { Value = 0.025, },
            WritePosition = Input {
               SourceOp = "Polygon1Position",
               Source = "Value",
            },
            WriteLength = Input { Value = 0.1, },
            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 = { 192, 37.0606 } },
      },
      Polygon1Position = BezierSpline {
         SplineColor = { Red = 237, Green = 132, Blue = 6 },
         CtrlWZoom = false,
         NameSet = true,
         KeyFrames = {
            [0] = { 0, RH = { 66.6666666666667, 0.333333333333333 }, Flags = { Linear = true } },
            [200] = { 1, LH = { 133.333333333333, 0.666666666666667 }, Flags = { Linear = true } }
         }
      },
      Polygon1Polyline = BezierSpline {
         SplineColor = { Red = 173, Green = 255, Blue = 47 },
         CtrlWZoom = false,
         NameSet = true,
         KeyFrames = {
            [0] = { 0, Flags = { Linear = true, LockedY = true }, Value = Polyline {
                  Points = {
                     { X = -0.36857825567503, Y = -0.376857749469214, RX = 0.00793697876221816, RY = 0.133442828329396 },
                     { X = -0.294504181600956, Y = -0.0647558386411889, LX = -0.0582001165496378, LY = -0.0452162541692333, RX = 0.0545753623973544, RY = 0.0424001463198471 },
                     { X = -0.130824372759857, Y = -0.192144373673036, LX = -0.0467264865089036, LY = 0.0656559127040801, RX = 0.0548528271683417, RY = -0.0770743255316318 },
                     { X = 0.0663082437275986, Y = -0.319532908704883, LX = -0.0661706763075856, LY = -0.0401427685106923, RX = 0.076211563547019, RY = 0.0462341224847839 },
                     { X = 0.215651135005974, Y = 0.0180467091295117, LX = -0.0390155941983832, LY = -0.12523348527233, RX = 0.024356264486456, RY = 0.0781795062339449 },
                     { X = 0.338709677419355, Y = 0.173036093418259, LX = -0.0411247531160178, LY = 0.0513980255924697, RX = 0.0703368640090169, RY = -0.0879075413834259 },
                     { X = 0.433094384707288, Y = -0.253715498938429, LX = -0.0120239216394581, LY = 0.169422025486631 }
                  }
               } }
         }
      }
   },
   ActiveTool = "Polygon1"
}
Offline

Eyn-0519

  • Posts: 15
  • Joined: Thu Jun 10, 2021 4:00 pm
  • Real Name: Hui Eyn

Re: How to make particles follow a curve

PostSat May 21, 2022 3:54 am

birdseye wrote:You must have a very...'unique' set up there. Anyway apart from connecting the nodes the changes he made from the standard settings are, he changed the output Mode in the pRender to 2d, he changed the particle emitter to 'Bitmap', drew the polygon, increased the border width and removed the animation in the Polygon node (right click on the bottom control of the polygon node to reveil the option). He also later changed the polygon by adjusting the Length control to about 0.1 and the Position control by setting keyframes at the first and last frame.

In the pEmitter he set the Lifespan duration to the length of the comp, he then increased the number of particles to 200 on frame 0 and increased the Velocity Variance a small amount. In the Glow node he increased the Glow. He also, in the pEmitter Style tab set them to change colour over time using the Color Over Life Controls
Anyway he ended up with something like this, this has a comp life of 201 frames.

Code: Select all
{
   Tools = ordered() {
      Glow1 = Glow {
         Inputs = {
            Blend = Input { Value = 0.2, },
            Filter = Input { Value = FuID { "Fast Gaussian" }, },
            Input = Input {
               SourceOp = "pRender1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 582.667, 37.0606 } },
      },
      pRender1 = pRender {
         Inputs = {
            _MotionBlurWarning = Input { Disabled = true, },
            GlobalOut = Input { Value = 200, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            OutputMode = Input {
               Value = FuID { "TwoD" },
               Disabled = true,
            },
            ["MaterialID.MaterialID"] = Input { Value = 1, },
            ["ObjectID.ObjectID"] = Input { Value = 1, },
            Input = Input {
               SourceOp = "pEmitter1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 460, 36.4545 } },
      },
      pEmitter1 = pEmitter {
         ID = 7,
         CtrlWZoom = false,
         Inputs = {
            Number = Input { Value = 200, },
            Lifespan = Input { Value = 200, },
            VelocityControls = Input { Value = 1, },
            VelocityVariance = Input { Value = 0.015, },
            Region = Input { Value = FuID { "BitmapRgn" }, },
            ["BezierRgn.Polyline"] = Input {
               Value = Polyline {
                  Points = {
                     { X = -0.372161059357918, Y = -0.165540357510486, RX = 0.0149046470020282, RY = 0.0728771755083296 },
                     { X = -0.306451612903226, Y = 0.00896057347670251, LX = -0.0330085282869085, LY = -0.0381701509083454, RX = 0.0532524201767647, RY = 0.0615796286557827 },
                     { X = -0.11768219832736, Y = 0.0555555555555556, LX = -0.0622795818873559, LY = 0.0222685714306534, RX = 0.0808667061031907, RY = -0.0289145489845711 },
                     { X = 0.104540023894863, Y = -0.137992831541219, LX = -0.0817078885875985, LY = -0.0200957239499229, RX = 0.0917636480979735, RY = 0.022568897234907 },
                     { X = 0.324372759856631, Y = 0.164277180406213, LX = -0.0885119087892645, LY = -0.0486010844624688, RX = 0.0409344055929248, RY = 0.0224767099801151 },
                     { X = 0.433094384707288, Y = 0.0424133811230585, LX = -0.0338936096288661, LY = 0.0721702546316346 }
                  }
               },
            },
            ["BitmapRgn.Bitmap"] = Input {
               SourceOp = "Polygon1",
               Source = "Mask",
            },
            ["ParticleStyle.ColorControls"] = Input { Value = 1, },
            ["ParticleStyle.ColorOverLifeControls"] = Input { Value = 1, },
            ["ParticleStyle.ColorOverLife"] = Input {
               Value = Gradient {
                  Colors = {
                     [0] = { 0.336, 0.178, 1, 1 },
                     [0.25414364640884] = { 0, 1, 0, 1 },
                     [0.464088397790055] = { 1, 0, 0, 1 },
                     [0.69060773480663] = { 0, 0, 1, 1 },
                     [0.911602209944751] = { 1, 1, 0, 1 }
                  }
               },
            },
            ["ParticleStyle.SizeOverLife"] = Input {
               SourceOp = "pEmitter1SizeOverLife",
               Source = "Value",
            },
            ["ParticleStyle.BlurOverLife"] = Input {
               SourceOp = "pEmitter1BlurOverLife2D",
               Source = "Value",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 330, 36.4545 } },
      },
      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 = 192, Green = 128, Blue = 64 },
         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 = 192, Green = 128, Blue = 64 },
         CtrlWZoom = false,
         NameSet = true,
      },
      Polygon1 = PolylineMask {
         DrawMode = "ClickAppend",
         DrawMode2 = "InsertAndModify",
         CtrlWZoom = false,
         Inputs = {
            Filter = Input { Value = FuID { "Fast Gaussian" }, },
            BorderWidth = Input { Value = 0.025, },
            WritePosition = Input {
               SourceOp = "Polygon1Position",
               Source = "Value",
            },
            WriteLength = Input { Value = 0.1, },
            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 = { 192, 37.0606 } },
      },
      Polygon1Position = BezierSpline {
         SplineColor = { Red = 237, Green = 132, Blue = 6 },
         CtrlWZoom = false,
         NameSet = true,
         KeyFrames = {
            [0] = { 0, RH = { 66.6666666666667, 0.333333333333333 }, Flags = { Linear = true } },
            [200] = { 1, LH = { 133.333333333333, 0.666666666666667 }, Flags = { Linear = true } }
         }
      },
      Polygon1Polyline = BezierSpline {
         SplineColor = { Red = 173, Green = 255, Blue = 47 },
         CtrlWZoom = false,
         NameSet = true,
         KeyFrames = {
            [0] = { 0, Flags = { Linear = true, LockedY = true }, Value = Polyline {
                  Points = {
                     { X = -0.36857825567503, Y = -0.376857749469214, RX = 0.00793697876221816, RY = 0.133442828329396 },
                     { X = -0.294504181600956, Y = -0.0647558386411889, LX = -0.0582001165496378, LY = -0.0452162541692333, RX = 0.0545753623973544, RY = 0.0424001463198471 },
                     { X = -0.130824372759857, Y = -0.192144373673036, LX = -0.0467264865089036, LY = 0.0656559127040801, RX = 0.0548528271683417, RY = -0.0770743255316318 },
                     { X = 0.0663082437275986, Y = -0.319532908704883, LX = -0.0661706763075856, LY = -0.0401427685106923, RX = 0.076211563547019, RY = 0.0462341224847839 },
                     { X = 0.215651135005974, Y = 0.0180467091295117, LX = -0.0390155941983832, LY = -0.12523348527233, RX = 0.024356264486456, RY = 0.0781795062339449 },
                     { X = 0.338709677419355, Y = 0.173036093418259, LX = -0.0411247531160178, LY = 0.0513980255924697, RX = 0.0703368640090169, RY = -0.0879075413834259 },
                     { X = 0.433094384707288, Y = -0.253715498938429, LX = -0.0120239216394581, LY = 0.169422025486631 }
                  }
               } }
         }
      }
   },
   ActiveTool = "Polygon1"
}

Cool bro! But this method does not seem to be what I want. I want the particles to be attached to the spline all the time, and when the spline deforms, the particles will also move along the spline tangent direction. Maybe the fusion is not very good. To achieve this kind of effect, I ended up having to use other 3D software to get the job done.
Anyway, thanks for your answer!
Offline

santanamo

  • Posts: 6
  • Joined: Mon May 16, 2022 8:26 am
  • Real Name: Julius Kristmann

Re: How to make particles follow a curve

PostWed May 25, 2022 11:28 am

Hey Guys,

first off, thanks for the help.

I got around the problem in the meantime by just emitting particles all along the lines. I gave them a certain velocity and a very restricted lifetime. But still its not quite what i would like to have. I also included some turbulence and another particle emitter paired with a directional force. I'm gonna check out the other ideas you guys posted and see if i can improve the animation with it.

Next thing will be a more sophisticated lighting sytem, because right now i just use spotlights, but i really want to include ambient occlusion.

Check out the screenshot! The particles now move from left to right, and almost instantly get killed. Since particles are emiited all along the line, the effect kind of works, but its not perfect.

FusionParticleAnimation.PNG
Screenshot Fusion Particles
FusionParticleAnimation.PNG (351.22 KiB) Viewed 1705 times

Return to Fusion

Who is online

Users browsing this forum: No registered users and 15 guests