In light of the Coronavirus crisis, please help make sure nothing stands in the way of social distancing in the VFX industry.

This petition asks the MPAA to act accordingly:


Sign the petition on Change.org

Be safe, everyone.

Fusion 5 multi plate (SmartPlate) equivalent?

Moderator: SecondMan

User avatar
hevonen
Posts: 22
Joined: Thu Nov 20, 2014 12:14 am

Fusion 5 multi plate (SmartPlate) equivalent?

#1

Post by hevonen » Thu Jan 09, 2020 5:47 am

Hello,

Is there a method in Fusion to generate larger single image from a shot with moving camera (translate, rotation and scale)? Years ago there was multi plate plugin for Fusion 5 (http://pigsfly.com/index.php?/topic/535 ... lti-plate/) that did this.

Or would it be better to use Photoshop (or Hugin) for this?

Thanks!

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

Re: Fusion 5 multi plate (SmartPlate) equivalent?

#2

Post by Midgardsormr » Thu Jan 09, 2020 6:39 am

I've done it a few times by hand. Usually I perform a track and stabilize, then Crop out on the result so the image stays within the bounds during the entire duration. Then run Trails to assemble the image. Patch artifacts using some TimeStretchers and masked Merges.

I prefer to use Keep Centered in the Crop so it's easy to reverse the process at the other end, but that can get inefficient since it makes a larger-than-necessary image with a lot of empty pixels.

User avatar
Millolab
Fusionista
Posts: 375
Joined: Wed Oct 24, 2018 6:26 am
Been thanked: 37 times
Contact:

Re: Fusion 5 multi plate (SmartPlate) equivalent?

#3

Post by Millolab » Thu Jan 09, 2020 9:30 am

I think mocha does that. The last version of mocha. They call it “mega plates”.
@Midgardsormr that’s an interesting technique. Would you go a little bit deeper into it? I’d really love to try that!! Maybe you already covered it in your blog?

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

Re: Fusion 5 multi plate (SmartPlate) equivalent?

#4

Post by Midgardsormr » Thu Jan 09, 2020 10:24 am

Here's a plate from this week's episode of Emergence. I've (roughly) stabilized a portion of it and cropped out to show all the pixels. First and last frames:

Image

The Trails tool, in its default mode, iteratively Merges an image over itself. The result is that we get an accumulation of the plate's pixels:

Image

Put your playhead at one end or the other of the shot, view the Trails tool, and simply play through the shot once. The result will be similar you see here. Obviously I didn't do a great job with the tracking—there's a big tear in the middle of it. But if I'd taken the time to get a better track, or maybe used Mocha instead of a point track, the results would be better.

If there are smaller tears, or some emphemeral feature like a bird flying through, you can use a TimeStretcher pulled off the Crop node to grab a clean patch and Merge it over the result of the Trails.

Once you're satisfied with the result, save the expanded plate as a still—Trails isn't a tool you want to leave live in your comp because it will keep working, and it's not non-destructive. Also, Trails won't work on a render farm—it has to play through the entire sequence to do its thing.

When you're done with the compositing, destabilize and Crop back down to your format.

Code: Select all

{
	Tools = ordered() {
		Merge2 = Merge {
			Inputs = {
				UseOpenCL = Input { Value = 0, },
				Background = Input {
					SourceOp = "Trails1",
					Source = "Output",
				},
				Foreground = Input {
					SourceOp = "TimeStretcher2",
					Source = "Output",
				},
				PerformDepthMerge = Input { Value = 0, },
				EffectMask = Input {
					SourceOp = "Ellipse1",
					Source = "Mask",
				}
			},
			ViewInfo = OperatorInfo { Pos = { 825, -577.5 } },
		},
		TimeStretcher2 = TimeStretcher {
			Inputs = {
				SourceTime = Input { Value = 1184, },
				Input = Input {
					SourceOp = "Crop1",
					Source = "Output",
				},
			},
			ViewInfo = OperatorInfo { Pos = { 715, -643.5 } },
		},
		Tracker1 = Tracker {
			Trackers = {
				{
					PatternTime = 1123,
					PatternX = 0.192283950617284,
					PatternY = 0.781578947368421
				},
				{
					PatternTime = 1123,
					PatternX = 0.904012345679012,
					PatternY = 0.766666666666667
				}
			},
			Inputs = {
				Input = Input {
					SourceOp = "PipeRouter3",
					Source = "Output",
				},
				Operation = Input { Value = 1, },
				Merge = Input { Value = 0, },
				Scaling = Input { Value = 0, },
				MatchMoveSettings = Input { Value = 1, },
				Reference = Input { Value = 3, },
				PathCenter = Input { Value = 1, },
				Name1 = Input { Value = "Tracker 1", },
				PatternCenter1 = Input { Value = { 0.192283950617284, 0.781578947368421 }, },
				PatternWidth1 = Input { Value = 0.0808641975308642, },
				PatternHeight1 = Input { Value = 0.134210526315789, },
				SearchWidth1 = Input { Value = 0.148765432098765, },
				SearchHeight1 = Input { Value = 0.242982456140351, },
				TrackedCenter1 = Input {
					SourceOp = "XYPath1",
					Source = "Value",
				},
				Name2 = Input { Value = "Tracker 2", },
				PatternCenter2 = Input { Value = { 0.904012345679012, 0.766666666666667 }, },
				PatternWidth2 = Input { Value = 0.0882716049382717, },
				PatternHeight2 = Input { Value = 0.147368421052632, },
				SearchWidth2 = Input { Value = 0.167283950617284, },
				SearchHeight2 = Input { Value = 0.283333333333333, },
				TrackedCenter2 = Input {
					SourceOp = "XYPath2",
					Source = "Value",
				},
			},
			ViewInfo = OperatorInfo { Pos = { 440, -577.5 } },
			UserControls = ordered() {
				UpdateReferenceFrame = {
					INP_Integer = false,
					LINKID_DataType = "Number",
					BTNCS_Execute = "RunScript([[S:\\net_exe\\BlackMagic\\fusion9\\scripts\\Tool\\updateTrackerReferenceFrame.lua]])",
					ICS_ControlPage = "Operation",
					INPID_InputControl = "ButtonControl",
					LINKS_Name = "Update Reference Frame"
				}
			}
		},
		XYPath1 = XYPath {
			ShowKeyPoints = false,
			DrawMode = "ModifyOnly",
			Inputs = {
				X = Input {
					SourceOp = "XYPath1X",
					Source = "Value",
				},
				Y = Input {
					SourceOp = "XYPath1Y",
					Source = "Value",
				},
			},
		},
		XYPath1X = BezierSpline {
			SplineColor = { Red = 255, Green = 0, Blue = 0 },
			NameSet = true,
			KeyFrames = {
				[1113] = { -0.0593119592984518, Flags = { Linear = true } }
			}
		},
		XYPath1Y = BezierSpline {
			SplineColor = { Red = 0, Green = 255, Blue = 0 },
			NameSet = true,
			KeyFrames = {
				[1113] = { -0.407512485980988, Flags = { Linear = true } }
			}
		},
		XYPath2 = XYPath {
			ShowKeyPoints = false,
			DrawMode = "ModifyOnly",
			Inputs = {
				X = Input {
					SourceOp = "XYPath2X",
					Source = "Value",
				},
				Y = Input {
					SourceOp = "XYPath2Y",
					Source = "Value",
				},
			},
		},
		XYPath2X = BezierSpline {
			SplineColor = { Red = 255, Green = 77, Blue = 0 },
			NameSet = true,
			KeyFrames = {
				[1113] = { 0.537618301808834, Flags = { Linear = true } }
			}
		},
		XYPath2Y = BezierSpline {
			SplineColor = { Red = 0, Green = 255, Blue = 76 },
			NameSet = true,
			KeyFrames = {
				[1113] = { -0.458528637886047, Flags = { Linear = true } }
			}
		},
		Crop1 = Crop {
			Inputs = {
				XOffset = Input { Value = -974, },
				YOffset = Input { Value = -1753, },
				XSize = Input { Value = 3869, },
				YSize = Input { Value = 4586, },
				KeepCentered = Input { Value = 1, },
				Input = Input {
					SourceOp = "Tracker1",
					Source = "Output",
				},
			},
			ViewInfo = OperatorInfo { Pos = { 550, -577.5 } },
		},
		Trails1 = Trails {
			Inputs = {
				Input = Input {
					SourceOp = "Crop1",
					Source = "Output",
				},
			},
			ViewInfo = OperatorInfo { Pos = { 715, -577.5 } },
		},
		Ellipse1 = EllipseMask {
			Inputs = {
				SoftEdge = Input { Value = 0.0103, },
				MaskWidth = Input { Value = 1920, },
				MaskHeight = Input { Value = 1080, },
				PixelAspect = Input { Value = { 1, 1 }, },
				ClippingMode = Input { Value = FuID { "None" }, },
				Center = Input { Value = { 0.744053774560496, 0.726876090750436 }, },
				Width = Input { Value = 0.103603753041211, },
				Height = Input { Value = 0.103603753041211, },
			},
			ViewInfo = OperatorInfo { Pos = { 825, -544.5 } },
		},
		PipeRouter1 = PipeRouter {
			Inputs = {
				Input = Input {
					SourceOp = "PipeRouter3",
					Source = "Output",
				},
			},
			ViewInfo = PipeRouterInfo { Pos = { 385, -610.5 } },
		},
		PipeRouter3 = PipeRouter {
			ViewInfo = PipeRouterInfo { Pos = { 330, -577.5 } },
		},
		Tracker1_1 = Tracker {
			Trackers = {
				{
					PatternTime = 1123,
					PatternX = 0.192283950617284,
					PatternY = 0.781578947368421
				},
				{
					PatternTime = 1123,
					PatternX = 0.904012345679012,
					PatternY = 0.766666666666667
				}
			},
			Inputs = {
				Input = Input {
					SourceOp = "PipeRouter2",
					Source = "Output",
				},
				Foreground = Input {
					SourceOp = "Merge2",
					Source = "Output",
				},
				Operation = Input { Value = 1, },
				Merge = Input { Value = 1, },
				Scaling = Input { Value = 0, },
				MatchMoveSettings = Input { Value = 1, },
				Reference = Input { Value = 3, },
				PathCenter = Input { Value = 1, },
				TrackerList = Input { Value = 1, },
				Name1 = Input { Value = "Tracker 1", },
				PatternCenter1 = Input { Value = { 0.192283950617284, 0.781578947368421 }, },
				PatternWidth1 = Input { Value = 0.0808641975308642, },
				PatternHeight1 = Input { Value = 0.134210526315789, },
				SearchWidth1 = Input { Value = 0.148765432098765, },
				SearchHeight1 = Input { Value = 0.242982456140351, },
				TrackedCenter1 = Input {
					SourceOp = "XYPath1_1",
					Source = "Value",
				},
				Name2 = Input { Value = "Tracker 2", },
				PatternCenter2 = Input { Value = { 0.904012345679012, 0.766666666666667 }, },
				PatternWidth2 = Input { Value = 0.0882716049382717, },
				PatternHeight2 = Input { Value = 0.147368421052632, },
				SearchWidth2 = Input { Value = 0.167283950617284, },
				SearchHeight2 = Input { Value = 0.283333333333333, },
				TrackedCenter2 = Input {
					SourceOp = "XYPath2_1",
					Source = "Value",
				},
			},
			ViewInfo = OperatorInfo { Pos = { 935, -577.5 } },
			UserControls = ordered() {
				UpdateReferenceFrame = {
					INP_Integer = false,
					LINKID_DataType = "Number",
					BTNCS_Execute = "RunScript([[S:\\net_exe\\BlackMagic\\fusion9\\scripts\\Tool\\updateTrackerReferenceFrame.lua]])",
					ICS_ControlPage = "Operation",
					INPID_InputControl = "ButtonControl",
					LINKS_Name = "Update Reference Frame"
				}
			}
		},
		XYPath1_1 = XYPath {
			ShowKeyPoints = false,
			DrawMode = "ModifyOnly",
			Inputs = {
				X = Input {
					SourceOp = "Tracker1_1TrackedCenter1XYPath1_1X",
					Source = "Value",
				},
				Y = Input {
					SourceOp = "Tracker1_1TrackedCenter1XYPath1_1Y",
					Source = "Value",
				},
			},
		},
		Tracker1_1TrackedCenter1XYPath1_1X = BezierSpline {
			SplineColor = { Red = 255, Green = 0, Blue = 0 },
			NameSet = true,
			KeyFrames = {
				[1113] = { -0.0593119592984518, Flags = { Linear = true } }
			}
		},
		Tracker1_1TrackedCenter1XYPath1_1Y = BezierSpline {
			SplineColor = { Red = 0, Green = 255, Blue = 0 },
			NameSet = true,
			KeyFrames = {
				[1113] = { -0.407512485980988, Flags = { Linear = true } }
			}
		},
		XYPath2_1 = XYPath {
			ShowKeyPoints = false,
			DrawMode = "ModifyOnly",
			Inputs = {
				X = Input {
					SourceOp = "Tracker1_1TrackedCenter2XYPath2_1X",
					Source = "Value",
				},
				Y = Input {
					SourceOp = "Tracker1_1TrackedCenter2XYPath2_1Y",
					Source = "Value",
				},
			},
		},
		Tracker1_1TrackedCenter2XYPath2_1X = BezierSpline {
			SplineColor = { Red = 255, Green = 77, Blue = 0 },
			NameSet = true,
			KeyFrames = {
				[1113] = { 0.537618301808834, Flags = { Linear = true } }
			}
		},
		Tracker1_1TrackedCenter2XYPath2_1Y = BezierSpline {
			SplineColor = { Red = 0, Green = 255, Blue = 76 },
			NameSet = true,
			KeyFrames = {
				[1113] = { -0.458528637886047, Flags = { Linear = true } }
			}
		},
		Crop2 = Crop {
			Inputs = {
				XOffset = Input { Value = 975, },
				YOffset = Input { Value = 1753, },
				XSize = Input { Value = 1920, },
				YSize = Input { Value = 1080, },
				KeepCentered = Input { Value = 1, },
				Input = Input {
					SourceOp = "Tracker1_1",
					Source = "Output",
				},
			},
			ViewInfo = OperatorInfo { Pos = { 1045, -577.5 } },
		},
		PipeRouter2 = PipeRouter {
			CtrlWZoom = false,
			Inputs = {
				Input = Input {
					SourceOp = "PipeRouter1",
					Source = "Output",
				},
			},
			ViewInfo = PipeRouterInfo { Pos = { 935, -610.5 } },
		}
	}
}
I removed the tracking keyframes to cut down the character count.

User avatar
Millolab
Fusionista
Posts: 375
Joined: Wed Oct 24, 2018 6:26 am
Been thanked: 37 times
Contact:

Re: Fusion 5 multi plate (SmartPlate) equivalent?

#5

Post by Millolab » Thu Jan 09, 2020 10:54 am

@Midgardsormr That's some smart thinking! Thanks for sharing!!
I'll test this one soon!!

User avatar
SirEdric
Fusionator
Posts: 2276
Joined: Tue Aug 05, 2014 10:04 am
Answers: 9
Real name: Eric Westphal
Been thanked: 32 times
Contact:

Re: Fusion 5 multi plate (SmartPlate) equivalent?

#6

Post by SirEdric » Thu Jan 09, 2020 11:43 am

Instead of the Trails you could also use a Duplicate2D, with a time-offset of 1, and set the number of copies to the number of frames you want to combine.
I find this a bit more reliable than the Trails.
All the rest is like @Midgardsormr explained.

User avatar
Millolab
Fusionista
Posts: 375
Joined: Wed Oct 24, 2018 6:26 am
Been thanked: 37 times
Contact:

Re: Fusion 5 multi plate (SmartPlate) equivalent?

#7

Post by Millolab » Thu Jan 09, 2020 12:32 pm

Thanks @SirEdric !

User avatar
Millolab
Fusionista
Posts: 375
Joined: Wed Oct 24, 2018 6:26 am
Been thanked: 37 times
Contact:

Re: Fusion 5 multi plate (SmartPlate) equivalent?

#8

Post by Millolab » Thu Jan 09, 2020 3:03 pm

@SirEdric @Midgardsormr
i'm having troubles here. It seems that cropping messes up with my tracking data.
I'm able to get a plate as Bryan showed in this previous post, but i can't reverse stabilise it.
If i get rid of crop and trails, the reverse stabilisation works as expected... I'm confused.

Image

i'm using this clip if you'd like to help :) :)
https://www.pexels.com/video/mountains- ... y-2021532/

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

Re: Fusion 5 multi plate (SmartPlate) equivalent?

#9

Post by Midgardsormr » Thu Jan 09, 2020 3:49 pm

Whoops! Order of operations failure, I think. Crop (no clipping), then Destabilize.

User avatar
Millolab
Fusionista
Posts: 375
Joined: Wed Oct 24, 2018 6:26 am
Been thanked: 37 times
Contact:

Re: Fusion 5 multi plate (SmartPlate) equivalent?

#10

Post by Millolab » Thu Jan 09, 2020 3:52 pm

Ooooh ok. That makes sense ☺️.
I should have thought about that.
Thanks a bunch!

🙏🏼

User avatar
SecondMan
Site Admin
Posts: 4242
Joined: Thu Jul 31, 2014 5:31 pm
Answers: 15
Location: Vancouver, Canada
Been thanked: 61 times
Contact:

Re: Fusion 5 multi plate (SmartPlate) equivalent?

#11

Post by SecondMan » Sun Jan 12, 2020 4:03 pm

Here's the same example, using my simple-yet-useful Linger Fuse (available in Reactor), which equally doesn't require any specific local render-wrangling, like @SirEdric's suggestion.

Image

The comp uses @Millolab's clip from 2 posts above. Save the attached comp next to the downloaded clip and it will pick it up.

Just rendered this on a very modest laptop with only 8GB of RAM as a test - the result is built from all 321 HD frames of the clip. Not too bad at all :)
You do not have the required permissions to view the files attached to this post.

User avatar
Millolab
Fusionista
Posts: 375
Joined: Wed Oct 24, 2018 6:26 am
Been thanked: 37 times
Contact:

Re: Fusion 5 multi plate (SmartPlate) equivalent?

#12

Post by Millolab » Tue Jan 14, 2020 8:48 am

Thanks @SecondMan !