Welcome to WSL!

Make yourself at home, but before posting, please may I ask you to read the following topics.


Posting 101
Server space, screenshots, and you

Thank you!

PS. please pretty please:


Image

Trails, Echo and Duplicate2d... oh my!

Moderator: SecondMan

User avatar
CalebMcL
Posts: 8
Joined: Wed Mar 11, 2020 1:54 pm

Trails, Echo and Duplicate2d... oh my!

#1

Post by CalebMcL » Tue May 19, 2020 3:11 pm

Hi everyone. I'm trying to find the best way to create advanced light-trails effects with scale, rotation and offset options.

On the surface, the Trails node has everything I need. However, the second I add offset or scale, the result gets blurred the farther in time it goes. It's almost like the "blur size" parameter is also being activated even though it's set to zero.

Echo (made by Jacob Danell) will do the trick for short trails. But because it caches all previous frames before generating the next one, it won't work for the really long clips I'm working with (500 or more frames).

Duplicate2d has the same problem as Echo (has to cache all previous frames over and over).

What I'd really love to do is figure out why the Trails node is acting strangely for me. I don't think it's supposed to blur the end of the trails over time when the actual "blur" parameter is set to zero. I've replicated the issue with several different blending modes, though the one I need is "Lighten". Also replicated the issue in Resolve Fusion (though I'm working on this in Fusion Studio 16 for Windows).

Any ideas? Many thanks in advance for your help!

Examples made to illustrate the point:
Echo vs Trails.jpeg
Echo vs Trails 301.jpeg
You do not have the required permissions to view the files attached to this post.

User avatar
Midgardsormr
Fusionator
Posts: 1757
Joined: Wed Nov 26, 2014 8:04 pm
Answers: 14
Location: Los Angeles, CA, USA
Been thanked: 89 times
Contact:

Re: Trails, Echo and Duplicate2d... oh my!

#2

Post by Midgardsormr » Tue May 19, 2020 3:39 pm

This is a guess, since you didn't share your nodes, only the result, but I imagine it's because on every frame you're moving all the pixels, and each time you do so, you get a filtering hit. That stacks and stacks and stacks, slightly blurring every time the pixels are moved. Instead of moving all of the pixels that were already rendered, you need to move the pixels that are about to be rendered.

If you share your set-up, that could be either confirmed or refuted, and perhaps someone can help you get the result you want.

Added in 5 minutes 58 seconds:
Image

Code: Select all

{
	Tools = ordered() {
		Merge1 = Merge {
			Inputs = {
				Background = Input {
					SourceOp = "Background1",
					Source = "Output",
				},
				Foreground = Input {
					SourceOp = "Trails1",
					Source = "Output",
				},
				PerformDepthMerge = Input { Value = 0, },
			},
			ViewInfo = OperatorInfo { Pos = { 572, 194 } },
		},
		Background1 = Background {
			Inputs = {
				GlobalOut = Input { Value = 120, },
				Width = Input { Value = 1920, },
				Height = Input { Value = 1080, },
				["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
			},
			ViewInfo = OperatorInfo { Pos = { 354, 194 } },
		},
		Transform1 = Transform {
			Inputs = {
				Size = Input {
					SourceOp = "Transform1Size",
					Source = "Value",
				},
				Angle = Input {
					SourceOp = "Transform1Angle",
					Source = "Value",
				},
				FilterMethod = Input { Value = 4, },
				Input = Input {
					SourceOp = "Ellipse1",
					Source = "Mask",
				},
			},
			ViewInfo = OperatorInfo { Pos = { 406, 127 } },
		},
		Transform1Size = BezierSpline {
			SplineColor = { Red = 225, Green = 0, Blue = 225 },
			NameSet = true,
			KeyFrames = {
				[0] = { 1, RH = { 40, 1.809 }, Flags = { Linear = true } },
				[120] = { 3.427, LH = { 80, 2.618 }, Flags = { Linear = true } }
			}
		},
		Transform1Angle = BezierSpline {
			SplineColor = { Red = 14, Green = 221, Blue = 144 },
			NameSet = true,
			KeyFrames = {
				[0] = { 0, RH = { 40, -240 }, Flags = { Linear = true } },
				[120] = { -720, LH = { 80, -480 }, Flags = { Linear = true } }
			}
		},
		Trails1 = Trails {
			CtrlWZoom = false,
			Inputs = {
				Input = Input {
					SourceOp = "Transform1",
					Source = "Output",
				},
			},
			ViewInfo = OperatorInfo { Pos = { 572, 117 } },
		},
		Ellipse1 = EllipseMask {
			Inputs = {
				SoftEdge = Input { Value = 0.0001, },
				MaskWidth = Input { Value = 1920, },
				MaskHeight = Input { Value = 1080, },
				PixelAspect = Input { Value = { 1, 1 }, },
				ClippingMode = Input { Value = FuID { "None" }, },
				Center = Input { Value = { 0.5, 0.646074827682548 }, },
				Width = Input { Value = 0.01, },
				Height = Input { Value = 0.01, },
			},
			ViewInfo = OperatorInfo { Pos = { 277, 124 } },
		}
	}
}

User avatar
CalebMcL
Posts: 8
Joined: Wed Mar 11, 2020 1:54 pm

Re: Trails, Echo and Duplicate2d... oh my!

#3

Post by CalebMcL » Wed May 20, 2020 9:00 am

Thanks for the response and for the gentle reminder to include my code.

Your example makes use of a transform node to move the circle. This might be a useful workaround in some cases, but I'm talking about using the built-in offset controls within the Trails node. This will offset the trail over time, not the source of the trail.

I'm experimenting with star trails and other light trails from timelapses I've taken. I've used Trails many times before for run-of-the-mill star trails. But experimenting with those offsets is where I run into trouble.

Example experiment.
https://vimeo.com/420718107/12c17fcf79

Maybe now that my code is included, someone can spot an error with the simple setup I made for demonstration purposes.

Thanks again for the help.
  1. {
  2.     {
  3.     Tools = ordered() {
  4.         Ellipse1 = EllipseMask {
  5.             Inputs = {
  6.                 Filter = Input { Value = FuID { "Fast Gaussian" }, },
  7.                 MaskWidth = Input { Value = 1920, },
  8.                 MaskHeight = Input { Value = 1080, },
  9.                 PixelAspect = Input { Value = { 1, 1 }, },
  10.                 ClippingMode = Input { Value = FuID { "None" }, },
  11.                 Center = Input { Value = { 0.5, 0.547120418848168 }, },
  12.                 Width = Input { Value = 0.01, },
  13.                 Height = Input { Value = 0.01, },
  14.             },
  15.             ViewInfo = OperatorInfo { Pos = { 772.667, 153.424 } },
  16.         },
  17.         Ellipse1_1 = EllipseMask {
  18.             Inputs = {
  19.                 Filter = Input { Value = FuID { "Fast Gaussian" }, },
  20.                 MaskWidth = Input { Value = 1920, },
  21.                 MaskHeight = Input { Value = 1080, },
  22.                 PixelAspect = Input { Value = { 1, 1 }, },
  23.                 ClippingMode = Input { Value = FuID { "None" }, },
  24.                 Center = Input { Value = { 0.5, 0.547120418848168 }, },
  25.                 Width = Input { Value = 0.01, },
  26.                 Height = Input { Value = 0.01, },
  27.             },
  28.             ViewInfo = OperatorInfo { Pos = { 1271, 122.742 } },
  29.         },
  30.         Trails1_1 = Trails {
  31.             Inputs = {
  32.                 Rotate = Input { Value = 2, },
  33.                 XScale = Input { Value = 1.005, },
  34.                 ApplyMode = Input { Value = 10, },
  35.                 Input = Input {
  36.                     SourceOp = "Ellipse1_1",
  37.                     Source = "Mask",
  38.                 },
  39.             },
  40.             ViewInfo = OperatorInfo { Pos = { 1275, 180.924 } },
  41.         },
  42.         Ellipse1_2 = EllipseMask {
  43.             Inputs = {
  44.                 Filter = Input { Value = FuID { "Fast Gaussian" }, },
  45.                 MaskWidth = Input { Value = 1920, },
  46.                 MaskHeight = Input { Value = 1080, },
  47.                 PixelAspect = Input { Value = { 1, 1 }, },
  48.                 ClippingMode = Input { Value = FuID { "None" }, },
  49.                 Center = Input { Value = { 0.5, 0.547120418848168 }, },
  50.                 Width = Input { Value = 0.005, },
  51.                 Height = Input { Value = 0.005, },
  52.             },
  53.             ViewInfo = OperatorInfo { Pos = { 1606, 144.939 } },
  54.         },
  55.         Echo1 = Fuse.Echo {
  56.             CtrlWZoom = false,
  57.             Inputs = {
  58.                 EchoFrames = Input {
  59.                     Value = 92,
  60.                     Expression = "time",
  61.                 },
  62.                 ApplyMode = Input { Value = 10, },
  63.                 Scale = Input { Value = 2, },
  64.                 Angle = Input { Value = 2, },
  65.                 Input = Input {
  66.                     SourceOp = "Merge1_2",
  67.                     Source = "Output",
  68.                 },
  69.             },
  70.             ViewInfo = OperatorInfo { Pos = { 1734, 207.303 } },
  71.             Version = 110
  72.         },
  73.         Background1_2 = Background {
  74.             Inputs = {
  75.                 Width = Input { Value = 1920, },
  76.                 Height = Input { Value = 1080, },
  77.                 ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
  78.             },
  79.             ViewInfo = OperatorInfo { Pos = { 1482, 207.03 } },
  80.         },
  81.         Merge1_2 = Merge {
  82.             Inputs = {
  83.                 Background = Input {
  84.                     SourceOp = "Background1_2",
  85.                     Source = "Output",
  86.                 },
  87.                 Foreground = Input {
  88.                     SourceOp = "Ellipse1_2",
  89.                     Source = "Mask",
  90.                 },
  91.                 PerformDepthMerge = Input { Value = 0, },
  92.             },
  93.             ViewInfo = OperatorInfo { Pos = { 1606, 207.03 } },
  94.         },
  95.         Trails1 = Trails {
  96.             Inputs = {
  97.                 Rotate = Input { Value = 2, },
  98.                 XScale = Input { Value = 1.005, },
  99.                 ApplyMode = Input { Value = 10, },
  100.                 Input = Input {
  101.                     SourceOp = "Merge1",
  102.                     Source = "Output",
  103.                 },
  104.             },
  105.             ViewInfo = OperatorInfo { Pos = { 896.604, 215.242 } },
  106.         },
  107.         Merge1 = Merge {
  108.             Inputs = {
  109.                 Background = Input {
  110.                     SourceOp = "Background1",
  111.                     Source = "Output",
  112.                 },
  113.                 Foreground = Input {
  114.                     SourceOp = "Ellipse1",
  115.                     Source = "Mask",
  116.                 },
  117.                 PerformDepthMerge = Input { Value = 0, },
  118.             },
  119.             ViewInfo = OperatorInfo { Pos = { 772.667, 215.515 } },
  120.         },
  121.         Background1 = Background {
  122.             Inputs = {
  123.                 Width = Input { Value = 1920, },
  124.                 Height = Input { Value = 1080, },
  125.                 ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
  126.             },
  127.             ViewInfo = OperatorInfo { Pos = { 648.666, 215.515 } },
  128.         },
  129.         Background1_1 = Background {
  130.             Inputs = {
  131.                 Width = Input { Value = 1920, },
  132.                 Height = Input { Value = 1080, },
  133.                 ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
  134.             },
  135.             ViewInfo = OperatorInfo { Pos = { 1153, 226.045 } },
  136.         },
  137.         Merge1_1 = Merge {
  138.             Inputs = {
  139.                 Background = Input {
  140.                     SourceOp = "Background1_1",
  141.                     Source = "Output",
  142.                 },
  143.                 Foreground = Input {
  144.                     SourceOp = "Trails1_1",
  145.                     Source = "Output",
  146.                 },
  147.                 PerformDepthMerge = Input { Value = 0, },
  148.             },
  149.             ViewInfo = OperatorInfo { Pos = { 1277, 226.045 } },
  150.         }
  151.     }
  152. }
  153. }

User avatar
Chad
Fusionator
Posts: 1476
Joined: Fri Aug 08, 2014 1:11 pm
Been thanked: 7 times

Re: Trails, Echo and Duplicate2d... oh my!

#4

Post by Chad » Wed May 20, 2020 9:33 am

One thing to try is to render at a much larger image size. There's just not enough pixels in the base 1920x1080 to prevent the significant sampling errors.

User avatar
CalebMcL
Posts: 8
Joined: Wed Mar 11, 2020 1:54 pm

Re: Trails, Echo and Duplicate2d... oh my!

#5

Post by CalebMcL » Wed May 20, 2020 9:58 am

I don't think it's a comp size issue. The problem persists on 6K timelapse footage. The example I linked to via Vimeo was in 4K.

User avatar
CalebMcL
Posts: 8
Joined: Wed Mar 11, 2020 1:54 pm

Re: Trails, Echo and Duplicate2d... oh my!

#6

Post by CalebMcL » Wed May 20, 2020 11:22 am

Chad wrote:
Wed May 20, 2020 9:33 am
One thing to try is to render at a much larger image size. There's just not enough pixels in the base 1920x1080 to prevent the significant sampling errors.
Actually, I think you helped me see the problem differently. I wasn't thinking about the quality loss in resampling over and over. I wrote that off since the "Echo" node doesn't have that issue. But Echo is sampling all previous frames every time it runs whereas Trails resamples the same frames over and over. Kind of like photocopying a photocopy over and over.

So I guess the answer is that it's just what happens when you resample that many times and not an actual bug in the Trails node.

I'd still love to be proven wrong but it makes sense now that I think of it that way.