Entry level project: Developing an advanced Camera Crane Rig.

icierva
Fusioneer
Posts: 156
Joined: 7 years ago

Entry level project: Developing an advanced Camera Crane Rig.

#1

Unread post by icierva »

Maybe in this corner there's someone who has already solved this problem...

Hi!

I need to build a set of expressions to make one of the object's axis point to another object. A "Look At", basically

In my better approach,

- If I set an expression for X-rotation atan2(y'-y,z'-z) , Perfect X tracking all around.
- If set the expression to Z-Rotation atan2(x'-x,z'-z) Perfect Z tracking all around too.

But, if I set both expressions simultaneously, it seems one value is perturbing the other and does not solve the quadrant change any more. As Z reaches 0 it starts missing align, and when Z<0, the object flips.

Note: due to my scene build, instead of pointing the Z axis to the target, I'm pointing Y, but that's not relevant.

I understand any look-at control needs to fast flip it the target crosses the vertical axis, but it's percfectly stable all around except in the "north/south poles". That's the behavior I want to reproduce. My approach leaves half the universe unusable ( ;

This is a minimal xtract of my scene for testing and experiment.

Code: Select all

{
   Tools = ordered() {
      helper = Shape3D {
         NameSet = true,
         Inputs = {
            ["Transform3DOp.Translate.Z"] = Input {
               Value = -5,
               Expression = "-SurfaceCylinderInputs.Height/2",
            },
            ["Transform3DOp.Rotate.X"] = Input { Value = 90, },
            Shape = Input { Value = FuID { "SurfaceCylinderInputs" }, },
            ["MtlStdInputs.MaterialID"] = Input { Value = 3, },
            ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 4, },
            ["SurfaceCylinderInputs.Radius"] = Input { Value = 0.04, },
            ["SurfaceCylinderInputs.Height"] = Input { Value = 10, },
            ["SurfaceCylinderInputs.SubdivisionLevelBase"] = Input { Value = 3, },
            ["SurfaceCylinderInputs.ObjectID.ObjectID"] = Input { Value = 5, }
         },
         ViewInfo = OperatorInfo { Pos = { 853, 260 } },
      },
      TARGET_MOVETHIS = Shape3D {
         NameSet = true,
         Inputs = {
            ["Transform3DOp.Translate.X"] = Input { Value = -6.47769075517161, },
            ["Transform3DOp.Translate.Y"] = Input { Value = 3.58967256230106, },
            ["Transform3DOp.Translate.Z"] = Input { Value = -2.49235762543579, },
            Shape = Input { Value = FuID { "SurfaceSphereInputs" }, },
            ["MtlStdInputs.MaterialID"] = Input { Value = 1, },
            ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 1, },
            ["SurfaceSphereInputs.Radius"] = Input { Value = 0.34, },
            ["SurfaceSphereInputs.ObjectID.ObjectID"] = Input { Value = 3, }
         },
         ViewInfo = OperatorInfo { Pos = { 1082, 202 } },
      },
      CAM_MOVETHIS = Shape3D {
         CtrlWZoom = false,
         NameSet = true,
         Inputs = {
            SceneInput = Input {
               SourceOp = "helper",
               Source = "Output",
            },
            ["Transform3DOp.Translate.X"] = Input { Value = -8.27141386342268, },
            ["Transform3DOp.Translate.Y"] = Input { Value = 1.7791611753255, },
            ["Transform3DOp.Translate.Z"] = Input { Value = -0.0633333150819293, },
            ["Transform3DOp.Rotate.X"] = Input {
               SourceOp = "Expression2",
               Source = "NumberResult",
            },
            ["Transform3DOp.Rotate.Y"] = Input {
               SourceOp = "Expression1",
               Source = "NumberResult",
            },
            ["MtlStdInputs.MaterialID"] = Input { Value = 2, },
            ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 2, }
         },
         ViewInfo = OperatorInfo { Pos = { 854, 306 } },
      },
      Expression2 = Expression {
         CtrlWZoom = false,
         NameSet = true,
         Inputs = {
            n1 = Input {
               Value = -8.27141386342268,
               Expression = "CAM_MOVETHIS.Transform3DOp.Translate.X",
            },
            n2 = Input {
               Value = 1.7791611753255,
               Expression = "CAM_MOVETHIS.Transform3DOp.Translate.Y",
            },
            n3 = Input {
               Value = -0.0633333150819293,
               Expression = "CAM_MOVETHIS.Transform3DOp.Translate.Z",
            },
            n4 = Input {
               Value = -6.47769075517161,
               Expression = "TARGET_MOVETHIS.Transform3DOp.Translate.X",
            },
            n5 = Input {
               Value = 3.58967256230106,
               Expression = "TARGET_MOVETHIS.Transform3DOp.Translate.Y",
            },
            n6 = Input {
               Value = -2.49235762543579,
               Expression = "TARGET_MOVETHIS.Transform3DOp.Translate.Z",
            },
            n7 = Input { Value = -3.41628771292701, },
            NumberExpression = Input { Value = "atan2(n5-n2,n6-n3)", },
            NumberControls = Input { Value = 1, },
            NameforNumber1 = Input { Value = "plate X", },
            NameforNumber2 = Input { Value = "plate Y", },
            NameforNumber3 = Input { Value = "plate Z", },
            NameforNumber4 = Input { Value = "T X", },
            NameforNumber5 = Input { Value = "T Y", },
            NameforNumber6 = Input { Value = "T Z", },
         },
      },
      Expression1 = Expression {
         CtrlWZoom = false,
         Inputs = {
            n1 = Input {
               Value = -8.27141386342268,
               Expression = "CAM_MOVETHIS.Transform3DOp.Translate.X",
            },
            n2 = Input {
               Value = 1.7791611753255,
               Expression = "CAM_MOVETHIS.Transform3DOp.Translate.Y",
            },
            n3 = Input {
               Value = -0.0633333150819293,
               Expression = "CAM_MOVETHIS.Transform3DOp.Translate.Z",
            },
            n4 = Input {
               Value = -6.47769075517161,
               Expression = "TARGET_MOVETHIS.Transform3DOp.Translate.X",
            },
            n5 = Input {
               Value = 3.58967256230106,
               Expression = "TARGET_MOVETHIS.Transform3DOp.Translate.Y",
            },
            n6 = Input {
               Value = -2.49235762543579,
               Expression = "TARGET_MOVETHIS.Transform3DOp.Translate.Z",
            },
            n7 = Input { Value = -3.41628771292701, },
            NumberExpression = Input { Value = "180+atan2(n4-n1,n6-n3)", },
            NumberControls = Input { Value = 1, },
            NameforNumber1 = Input { Value = "plate X", },
            NameforNumber2 = Input { Value = "plate Y", },
            NameforNumber3 = Input { Value = "plate Z", },
            NameforNumber4 = Input { Value = "T X", },
            NameforNumber5 = Input { Value = "T Y", },
            NameforNumber6 = Input { Value = "T Z", },
         },
      },
      Merge3D1 = Merge3D {
         Inputs = {
            SceneInput1 = Input {
               SourceOp = "TARGET_MOVETHIS",
               Source = "Output",
            },
            SceneInput2 = Input {
               SourceOp = "CAM_MOVETHIS",
               Source = "Output",
            },
            SceneInput3 = Input {
               SourceOp = "zero",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 1102, 307 } },
      },
      zero = Text3D {
         NameSet = true,
         Inputs = {
            Size = Input { Value = 0.51, },
            Font = Input { Value = "Open Sans", },
            StyledText = Input { Value = "0,0,0", },
            Style = Input { Value = "Bold", },
            Extrusion = Input { Value = 1, },
            ExtrusionProfile = Input {
               SourceOp = "zeroExtrusionProfile",
               Source = "Value",
            },
            ExtrusionDepth = Input { Value = 0.1514, },
            ManualFontKerningPlacement = Input {
               Value = StyledText {
                  Array = {
                  },
                  Value = ""
               },
            },
         },
         ViewInfo = OperatorInfo { Pos = { 1229, 307 } },
      },
      zeroExtrusionProfile = LUTBezier {
         KeyColorSplines = {
            [0] = {
               [0] = { 0, RH = { 0.0196116135138184, 0.098058067569092 }, Flags = { Linear = true } },
               [0.2] = { 1, LH = { 0.180388386486182, 0.901941932430908 }, RH = { 0.3, 1 }, Flags = { Linear = true } },
               [0.8] = { 1, LH = { 0.7, 1 }, RH = { 0.819611613513818, 0.901941932430908 }, Flags = { Linear = true } },
               [1] = { 0, LH = { 0.980388386486182, 0.098058067569092 }, Flags = { Linear = true } }
            }
         },
         SplineColor = { Red = 192, Green = 128, Blue = 64 },
         NameSet = true,
      }
   }
}
Last edited by icierva 7 years ago, edited 2 times in total.

User avatar
SirEdric
Fusionator
Posts: 2405
Joined: 10 years ago
Real name: Eric Westphal
Been thanked: 6 times
Contact:

Re: 3D LookAt expression

#2

Unread post by SirEdric »

Hi Icierva.

Sorry for asking the obvious, but why don't you just activate "use target" in the 3d-controls
and link the Target to the Object you want it to look at?

Code: Select all

{
	Tools = ordered() {
		TARGET_MOVETHIS = Shape3D {
			CtrlWZoom = false,
			NameSet = true,
			Inputs = {
				["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 1, },
				["Transform3DOp.Translate.X"] = Input { Value = -6.47769075517161, },
				["Transform3DOp.Translate.Y"] = Input { Value = -0.445904260074093, },
				["Transform3DOp.Translate.Z"] = Input { Value = 5.8478509800532, },
				Shape = Input { Value = FuID { "SurfaceSphereInputs" }, },
				["MtlStdInputs.MaterialID"] = Input { Value = 1, },
				["SurfaceSphereInputs.Radius"] = Input { Value = 0.34, },
				["SurfaceSphereInputs.ObjectID.ObjectID"] = Input { Value = 3, }
			},
			ViewInfo = OperatorInfo { Pos = { 550, 115.5 } },
		},
		helper = Shape3D {
			NameSet = true,
			Inputs = {
				["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 4, },
				["Transform3DOp.Translate.Z"] = Input {
					Value = -5,
					Expression = "-SurfaceCylinderInputs.Height/2",
				},
				["Transform3DOp.Rotate.X"] = Input { Value = 90, },
				Shape = Input { Value = FuID { "SurfaceCylinderInputs" }, },
				["MtlStdInputs.MaterialID"] = Input { Value = 3, },
				["SurfaceCylinderInputs.Radius"] = Input { Value = 0.04, },
				["SurfaceCylinderInputs.Height"] = Input { Value = 10, },
				["SurfaceCylinderInputs.SubdivisionLevelBase"] = Input { Value = 3, },
				["SurfaceCylinderInputs.ObjectID.ObjectID"] = Input { Value = 5, }
			},
			ViewInfo = OperatorInfo { Pos = { 440, 181.5 } },
		},
		CAM_MOVETHIS = Shape3D {
			NameSet = true,
			Inputs = {
				SceneInput = Input {
					SourceOp = "helper",
					Source = "Output",
				},
				["Transform3DOp.Translate.X"] = Input { Value = -8.27141386342268, },
				["Transform3DOp.Translate.Y"] = Input { Value = 1.7791611753255, },
				["Transform3DOp.Translate.Z"] = Input { Value = -0.0633333150819293, },
				["Transform3DOp.UseTarget"] = Input { Value = 1, },
				["Transform3DOp.Target.X"] = Input {
					Value = -6.47769075517161,
					Expression = "TARGET_MOVETHIS.Transform3DOp.Translate.X",
				},
				["Transform3DOp.Target.Y"] = Input {
					Value = -0.445904260074093,
					Expression = "TARGET_MOVETHIS.Transform3DOp.Translate.Y",
				},
				["Transform3DOp.Target.Z"] = Input {
					Value = 5.8478509800532,
					Expression = "TARGET_MOVETHIS.Transform3DOp.Translate.Z",
				},
				["MtlStdInputs.MaterialID"] = Input { Value = 2, },
				["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 2, }
			},
			ViewInfo = OperatorInfo { Pos = { 440, 214.5 } },
		},
		Merge3D1 = Merge3D {
			Inputs = {
				SceneInput1 = Input {
					SourceOp = "TARGET_MOVETHIS",
					Source = "Output",
				},
				SceneInput2 = Input {
					SourceOp = "CAM_MOVETHIS",
					Source = "Output",
				},
				SceneInput3 = Input {
					SourceOp = "zero",
					Source = "Output",
				},
			},
			ViewInfo = OperatorInfo { Pos = { 660, 214.5 } },
		},
		zero = Text3D {
			CtrlWZoom = false,
			NameSet = true,
			Inputs = {
				Size = Input { Value = 0.51, },
				Font = Input { Value = "Open Sans", },
				StyledText = Input { Value = "0,0,0", },
				Style = Input { Value = "Bold", },
				Extrusion = Input { Value = 1, },
				ExtrusionProfile = Input {
					SourceOp = "zeroExtrusionProfile",
					Source = "Value",
				},
				ExtrusionDepth = Input { Value = 0.1514, },
				ManualFontKerningPlacement = Input {
					Value = StyledText {
						Array = {
						},
						Value = ""
					},
				},
			},
			ViewInfo = OperatorInfo { Pos = { 825, 214.5 } },
		},
		zeroExtrusionProfile = LUTBezier {
			KeyColorSplines = {
				[0] = {
					[0] = { 0, RH = { 0.0666666666666667, 0.333333333333333 }, Flags = { Linear = true } },
					[0.2] = { 1, LH = { 0.133333333333333, 0.666666666666667 }, RH = { 0.4, 1 }, Flags = { Linear = true } },
					[0.8] = { 1, LH = { 0.6, 1 }, RH = { 0.866666666666667, 0.666666666666667 }, Flags = { Linear = true } },
					[1] = { 0, LH = { 0.933333333333333, 0.333333333333333 }, Flags = { Linear = true } }
				}
			},
			SplineColor = { Red = 192, Green = 128, Blue = 64 },
			NameSet = true,
		}
	}
}
Cheers.

Eric.

icierva
Fusioneer
Posts: 156
Joined: 7 years ago

Entry level project: Developing an advanced Camera Crane Rig.

#3

Unread post by icierva »

Hi Edric,

I've needed to solve this issue twice in a week, that's why I'm here.

First time, to make emited particles look at a third object, instead of the built-in "look at camera". Luckily, I wanted all my particles to go "north", so my bad formula (a complete hemisphere unusable) was good enough for that specific use.

Now I'm preparing a crane-camera Rig, and there's a good reason.

- You usually dont want your target in the exact center of the shot, almost never. You need some angle offsets for thirds framing when in target mode. The Lookat controller leaves your rotation slider alive to set an offset, but that works bad, the horizon goes crazy, because most of times the camera axis are tilted; its Y axis is no longer vertical. Only works when cam and target are perfectly leveled. Otherwise, you can not pan a target camera without rolling the horizon.


Compared to real camera hardware, Fusion's lookat controller+rotation sliders acts as a pan/tilt tripod head mounted over a ball head. Wrong setup, you usually want the ball head on top of the pan head, in a balanced tripod.

To solve that I need to send the resulting X,Y rotation angles separatedly to the specific Tilt/Pan gears of my camera rig, respectively. Z axis is Roll, shoud not be affected.

Fusion does not give you that information; the rotation angles result of a look-at controller, and I' don't know how to extract it. But I might be able to do my own look-at formulae so I can offset the resulting angles and apply them properly to the rig gear setup.

Its an intersesting gadget for 3D mograph, this rig I'm building. Most of the controls in one single panel: (zoom, pan/tilt/roll/perturbs, crane lift/angle/arm lenght, Manual or Autofocus with animatable offset, Normal(pan tilt roll) mode or Target follow mode with offsets... This last feature is what I'm refining now. Then I'll go with bouncing/overshoot automations and it will be ready for sharing.
Last edited by icierva 7 years ago, edited 1 time in total.

User avatar
SirEdric
Fusionator
Posts: 2405
Joined: 10 years ago
Real name: Eric Westphal
Been thanked: 6 times
Contact:

Re: 3D LookAt expression

#4

Unread post by SirEdric »

Hi Icierva.

Right...okay...that's a bit more complex than just a normal LookAt...:-)

Apart from the rotation values you want, for "simple" Offset of the framing,
I've added three more sliders to the Camera's Controls.

Code: Select all

{
	Tools = ordered() {
		TARGET_MOVETHIS = Shape3D {
			CtrlWZoom = false,
			NameSet = true,
			Inputs = {
				["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 1, },
				["Transform3DOp.Translate.X"] = Input { Value = -6.47769075517161, },
				["Transform3DOp.Translate.Y"] = Input { Value = -0.445904260074093, },
				["Transform3DOp.Translate.Z"] = Input { Value = 3.3039645266624, },
				Shape = Input { Value = FuID { "SurfaceSphereInputs" }, },
				["MtlStdInputs.MaterialID"] = Input { Value = 1, },
				["SurfaceSphereInputs.Radius"] = Input { Value = 0.34, },
				["SurfaceSphereInputs.ObjectID.ObjectID"] = Input { Value = 3, }
			},
			ViewInfo = OperatorInfo { Pos = { 550, 115.5 } },
		},
		Merge3D1 = Merge3D {
			Inputs = {
				SceneInput1 = Input {
					SourceOp = "TARGET_MOVETHIS",
					Source = "Output",
				},
				SceneInput2 = Input {
					SourceOp = "CAM_MOVETHIS",
					Source = "Output",
				},
				SceneInput3 = Input {
					SourceOp = "zero",
					Source = "Output",
				},
			},
			ViewInfo = OperatorInfo { Pos = { 660, 214.5 } },
		},
		helper = Shape3D {
			NameSet = true,
			Inputs = {
				["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 4, },
				["Transform3DOp.Translate.Z"] = Input {
					Value = -5,
					Expression = "-SurfaceCylinderInputs.Height/2",
				},
				["Transform3DOp.Rotate.X"] = Input { Value = 90, },
				Shape = Input { Value = FuID { "SurfaceCylinderInputs" }, },
				["MtlStdInputs.MaterialID"] = Input { Value = 3, },
				["SurfaceCylinderInputs.Radius"] = Input { Value = 0.04, },
				["SurfaceCylinderInputs.Height"] = Input { Value = 10, },
				["SurfaceCylinderInputs.SubdivisionLevelBase"] = Input { Value = 3, },
				["SurfaceCylinderInputs.ObjectID.ObjectID"] = Input { Value = 5, }
			},
			ViewInfo = OperatorInfo { Pos = { 275, 214.5 } },
		},
		CAM_MOVETHIS = Shape3D {
			NameSet = true,
			Inputs = {
				SceneInput = Input {
					SourceOp = "helper",
					Source = "Output",
				},
				["Transform3DOp.Translate.X"] = Input { Value = -4.93828340616404, },
				["Transform3DOp.Translate.Y"] = Input { Value = 2.45967191873124, },
				["Transform3DOp.Translate.Z"] = Input { Value = -3.16093301423256, },
				["Transform3DOp.UseTarget"] = Input { Value = 1, },
				["Transform3DOp.Target.X"] = Input {
					Value = -6.47769075517161,
					Expression = "TARGET_MOVETHIS.Transform3DOp.Translate.X+TargetOffsetX",
				},
				["Transform3DOp.Target.Y"] = Input {
					Value = -0.445904260074093,
					Expression = "TARGET_MOVETHIS.Transform3DOp.Translate.Y+TargetOffsetY",
				},
				["Transform3DOp.Target.Z"] = Input {
					Value = 3.3039645266624,
					Expression = "TARGET_MOVETHIS.Transform3DOp.Translate.Z+TargetOffsetZ",
				},
				["MtlStdInputs.MaterialID"] = Input { Value = 2, },
				["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 2, },
			},
			ViewInfo = OperatorInfo { Pos = { 440, 214.5 } },
			UserControls = ordered() {
				TargetOffsetX = {
					LINKS_Name = "Target Offset X",
					LINKID_DataType = "Number",
					INPID_InputControl = "SliderControl",
					INP_Default = 0,
					INP_Integer = false,
					INP_MinScale = -1,
					INP_MaxScale = 1,
					ICS_ControlPage = "3D"
				},
				TargetOffsetY = {
					LINKS_Name = "Target Offset Y",
					LINKID_DataType = "Number",
					INPID_InputControl = "SliderControl",
					INP_Default = 0,
					INP_Integer = false,
					INP_MinScale = -1,
					INP_MaxScale = 1,
					ICS_ControlPage = "3D"
				},
				TargetOffsetZ = {
					LINKS_Name = "Target Offset Z",
					LINKID_DataType = "Number",
					INPID_InputControl = "SliderControl",
					INP_Default = 0,
					INP_Integer = false,
					INP_MinScale = -1,
					INP_MaxScale = 1,
					ICS_ControlPage = "3D"
				}
			}
		},
		zero = Text3D {
			NameSet = true,
			Inputs = {
				Size = Input { Value = 0.51, },
				Font = Input { Value = "Open Sans", },
				StyledText = Input { Value = "0,0,0", },
				Style = Input { Value = "Bold", },
				Extrusion = Input { Value = 1, },
				ExtrusionProfile = Input {
					SourceOp = "zeroExtrusionProfile",
					Source = "Value",
				},
				ExtrusionDepth = Input { Value = 0.1514, },
				ManualFontKerningPlacement = Input {
					Value = StyledText {
						Array = {
						},
						Value = ""
					},
				},
			},
			ViewInfo = OperatorInfo { Pos = { 825, 214.5 } },
		},
		zeroExtrusionProfile = LUTBezier {
			KeyColorSplines = {
				[0] = {
					[0] = { 0, RH = { 0.0666666666666667, 0.333333333333333 }, Flags = { Linear = true } },
					[0.2] = { 1, LH = { 0.133333333333333, 0.666666666666667 }, RH = { 0.4, 1 }, Flags = { Linear = true } },
					[0.8] = { 1, LH = { 0.6, 1 }, RH = { 0.866666666666667, 0.666666666666667 }, Flags = { Linear = true } },
					[1] = { 0, LH = { 0.933333333333333, 0.333333333333333 }, Flags = { Linear = true } }
				}
			},
			SplineColor = { Red = 192, Green = 128, Blue = 64 },
		}
	}
}
And, yes! You're project sounds very interesting and it's cool that you wanna share!
Have you installed Reactor already?...:-)

Cheers.

Eric.

User avatar
Dunn
Moderator
Posts: 545
Joined: 10 years ago
Location: Hamburg, Germany
Contact:

Re: 3D LookAt expression

#5

Unread post by Dunn »

Yup, that sounds verry interesting.
I once made some kinda Camrig in the past .. used it alot. but it might needs some updates for Fu9 ..
If you are interested check it out here : Re: How to make smooth movements with the Camera?

I will prep it for Reactor ;)

icierva
Fusioneer
Posts: 156
Joined: 7 years ago

Entry level project: Developing an advanced Camera Crane Rig.

#6

Unread post by icierva »

Sir Edric,

I've checked your approach. Setting an offset to the target x.y.z position coordinates. Of course it can work on many situations, specially if the followed object has a kind of "flat" trajectory along one axis. If the target moves in a plane, you'd need to animate by hand two offsets. COmplicated. If it's a random flyby object, then you're lost. And again, in most cases you'll lose horizon.

We need this to be operated as a cameraman does. He des not care the space x,y,v changes, that's a nightmare, he only cares his shot, he thinks in 2D comositing, and wants consistent horizontal horizon by default.

From the thread Dunn linked, I got this sentence: "If only the TransforCoordinate modifier gave us the angles too".

Yeah. Or a TranformCoord Rotation modifier. Or a function that gives you the three angles of a vector, and we do the rest by hand.

A FUNCTION THAT RETURNS THE ANGLES OF A GIVEN VECTOR.

I'd had bet that function would exist or, if not, the expression to calculate those angles would be a classic in the forums, thousand times needed by artists, and consequently, present in every "useful expressions for daily use" collection. But suprisingly it's not.



Dunn, Nice job your rig. Luckily I didnt find it before starting my own. ( ;

My planned rig is more a "telescopic crane with hot head" than a "path traveller with hot head" like the one you created. Anyway, you can always animate my crane's position/rotation/and size!! of the crane base. With paths or normal bezier curves.

The only limitation I have is the crane base must be referenced to word ,0,0,0. You can trnsfor it as much as you want and keeps coherent, but you can not link it to others and move it dragged by it's parent. This is a limitation of the TransformCoord modifier. (Actually an eufemism of _my_ limitations using it lol) (Actually, that modifier is buggy in my PC. If I set something wrong, Fusion crashes. And whenits all right, when I select the node that has that modifier active, Fusion seems to hang for a few seconds, as if I had a hiper-complex nested expressions structure to assimilate. I can't imagine the three levels of nested buggy modifiers I'd need to make my crane base corrdinate independent...
Last edited by icierva 7 years ago, edited 3 times in total.

User avatar
Dunn
Moderator
Posts: 545
Joined: 10 years ago
Location: Hamburg, Germany
Contact:

Re: 3D LookAt expression

#7

Unread post by Dunn »

Yay, that CoordTransform Modifier has a bug that's been known for awhile now. If you try deleting the modifier, Fusion hangs up. It was posted on the Bug list.
True, having Rotations on that Modifier would be awesome. We are still waiting :P .

Thanks ;)

When you do stuff like this .. the best is to experiment. Somehow you will get to a point that it works. So hang in there !
Create a WIP page in Sweatbox so that we can follow it.

Cheers, Dunn

icierva
Fusioneer
Posts: 156
Joined: 7 years ago

Entry level project: Developing an advanced Camera Crane Rig.

#8

Unread post by icierva »

Dunn wrote: 7 years ago Create a WIP page in Sweatbox so that we can follow it.

Oh, this is just an entry-level expressions problem. This thread is more than enough.

I can open a new thread called "Developing a Crane Camera Rig", to facilitate further searchs, but that's all it worths, I think.

Later I'll go for it and keep posting issues here, it might interest some other newbies. I'll open a new thread if you guys reccomend it.

I'll also need a lot of help with the auto ease/bounce/overshoot expressions, sure, I never did that before neither. And to implement it as Macro, or Fuse, or whatever is best.

PS: I've changed the thread subject in the 1st and all my posts, this thread is now a dev. blog.

icierva
Fusioneer
Posts: 156
Joined: 7 years ago

Re: Entry level project: Developing an advanced Camera Crane Rig.

#9

Unread post by icierva »

Btw... is there any way to reorder customized controls? I've seen I can't delete a control once I've created it, but I can hide it. But how can I reorder the controls? Whot to do if I want my last created control to be on top of the layout instead of last? This silly thing will force me to repeat the whole process whe I have it solved, just to have the controls in a logic order. Come on....

User avatar
Midgardsormr
Fusius Of Borg
Posts: 2848
Joined: 10 years ago
Location: Los Angeles, CA, USA
Real name: Bryan Ray
Mood:
Has thanked: 1 time
Been thanked: 19 times
Contact:

Re: Entry level project: Developing an advanced Camera Crane Rig.

#10

Unread post by Midgardsormr »

There's no way to do it through the GUI, but if you copy the node and paste it into a programmer's text editor (I like Notepad++ on Windows), you can reorganize the controls there. Look for a section headed UserControls = ordered(). That will contain the list of controls. You can rearrange them and change their names and attributes.

Once you're done, you can copy and paste that code back into your Flow to get the touched-up node.

icierva
Fusioneer
Posts: 156
Joined: 7 years ago

Re: Entry level project: Developing an advanced Camera Crane Rig.

#11

Unread post by icierva »

Ok, back to it.

I think I already had the solution in my hand and I couldn't see it!
icierva wrote: 7 years ago
To solve that I need to send the resulting X,Y rotation angles separatedly to the specific Tilt/Pan gears of my camera rig, respectively. Z axis is Roll, shoud not be affected.

So, my problem was I can't build a expression emulating the full-quadrant look-at controller of Fusion. I can only solve one axis.

But... I dont need an object to do a proper look at! I'm explicitly buuilding the opposite thing: separate gears for pan and tilt, to conserve horizontal. I only need partial solves!!

But, befor that, I have to rebuild some things.

1- The locator with the buggy TransformCoord Pos modifier has gone absolute zombie. I can't touch the scene. It has been growing messier as the crane hierarchy grew from base to camera plate, 7 rotating/scaling elements to calculate.

I f I position every object at the end of the crane arm with one shared center, I can reference the camera position with only 3 hierarchy and transform levels, much lighter for the modifier.

2. I modelled all rotation gears as cilinders, to be more intuitive at construction and easy to understand in first uses. Then you have checkboxes to wire o hide it all. It was an error: To have the tilt and crane lift cilinders aligned to it's function, I had to rotate them. Beatiful, but now all formulas and expressions needs modifiers everywhere, +90 here, -180 there... The worst is I have a flip when you change normal to target mode, solved with more expression complication
...))+180*CraneTargetMode- A mess.

Time to rebuild knowing these issues. My new crane will be much uglier. All thin boxes and a bunch of them concentric at the top, with a camera in the middle of the melée. Who cares... You only need it visible to import and first placement. I set visibility and opacity controls the clean it away from the viewer once you get it.

icierva
Fusioneer
Posts: 156
Joined: 7 years ago

Re: Entry level project: Developing an advanced Camera Crane Rig.

#12

Unread post by icierva »

Question. I'd like the gears to have everything locked but the angle I need to handle.

The only way I know to do that is insterting a null expression with a 0. It works but, instaed of getting rid of that control, I have it illuminated and expanded with the expression lol. And I'm afraid I'm making thogs slower.

Is ther any convenient way to lock or inhibe a control? I might try to send them to hell with the EditControls window, but that0s another known Fusion headache source...

icierva
Fusioneer
Posts: 156
Joined: 7 years ago

Re: Entry level project: Developing an advanced Camera Crane Rig.

#13

Unread post by icierva »

Todays notes:

- Don't flood the thread: I'll go writing items in a text and then post it at the end of the session. I'll lose intra-day interactivity with you. No problem, I can only dedicate a couple of late hours a day.

- Theres a way to reorder controls. Last edited goes bottom. Tedious, but much better than rebuild and reassing.

- The "all aligned" rebuilding has been a GOOD idea. Now everything is so simple I only need a multiplier in the pan/tilt expressions to switch the TargetMode On/off. Great!!

- But, unfortunately, my idea of make it work calculating rotations separately is not working. It behaves exactly the same than yesterdays version. Every tracker works fine separately, but can't work together, even applied to different objects. This is beyond my maths. So I'm at the same point than yesterday but with simplified and lighter version.

I think I'm going to implement, for the moment, separate pan / tilt target tracking. Exclusive, to use one or the other. That's all I know how to, untill appears someone that knows how tocalculate the three angles of a given vector. Again, I'm astonished that calculation is so hidden. I supposed that should be an every-day!

-one hour later, I give up. At least, now tracking works seamlessly with one axis tracking. Pan or Tilt. It's useful!.

Well, you can do full pan/tilt tracking while the object stays over the camera. If the tracked object is confined to one hemisphere, one half of the 3D space, you can set the right position/angle of the Rig relative to the action to avoid the flipping plane. The only thing you can not do with this settings is tracking an objet that goes up, down, left, right, front and back.

I go back to control cleaning and ordering, and re-linking some features.

- if you try to link a camera visibility checkbox (fustrum, plane of focus, etc) to a custom checkbox elsewhere with an expression, problems. Kind of loop. I'll look for a different way to instance those controls in the Rig panel.

- Cant find how to include in the control panel a node select input, to drag on it the node of the object you want to track. Like the inputs of the WirelessLink or the CoordTransform Position modifier. Tried to edit the WirelessLink controls to see how they did it, but no info there. Appears as numeric with no input control. Nothing to imitate.

- Lost an hour randomly twaeking enigmatic options in the the EditControl interface. but can't find it.

- I'm creating the contro panel in the group interface, so you see all controls without opening the group, just selecting it as a single node in the flow. Not sure if this is a good idea. Now I can't ungroup the rig, I'd lose all custom controls. There must be better options. What I want is you usually dont need to open the grup because most needed options are available from one single panel.

More tomorrow. Any help or advice to these issues well be welcome! Wishing to end this boring control setup and start investigating the bouncing/overshoot automation expressions.

PS: Free Barrel of Beer for whoever knows how to calculate the three angles formed by a given vectorm, i.e, a proper look-at control like the Fusion embedded.

User avatar
Midgardsormr
Fusius Of Borg
Posts: 2848
Joined: 10 years ago
Location: Los Angeles, CA, USA
Real name: Bryan Ray
Mood:
Has thanked: 1 time
Been thanked: 19 times
Contact:

Re: Entry level project: Developing an advanced Camera Crane Rig.

#14

Unread post by Midgardsormr »

I'll just quote myself here, since you apparently missed it. :D
Midgardsormr wrote: 7 years ago There's no way to do it through the GUI, but if you copy the node and paste it into a programmer's text editor (I like Notepad++ on Windows), you can reorganize the controls there. Look for a section headed UserControls = ordered(). That will contain the list of controls. You can rearrange them and change their names and attributes.

Once you're done, you can copy and paste that code back into your Flow to get the touched-up node.
For the wireless link bit, consult this thread:
Rendering Text From Metadata Tags

And for a not-quite-comprehensive description of available User Controls:
https://www.steakunderwater.com/VFXPedi ... r_Controls

Not all of that functionality is available through the Edit Controls… dialogue. You have to open the node up in a text editor to get access to the more advanced features.

User avatar
SirEdric
Fusionator
Posts: 2405
Joined: 10 years ago
Real name: Eric Westphal
Been thanked: 6 times
Contact:

Re: Entry level project: Developing an advanced Camera Crane Rig.

#15

Unread post by SirEdric »

icierva wrote: 7 years ago Question. I'd like the gears to have everything locked but the angle I need to handle.

The only way I know to do that is insterting a null expression with a 0. It works but, instaed of getting rid of that control, I have it illuminated and expanded with the expression lol. And I'm afraid I'm making thogs slower.

Is ther any convenient way to lock or inhibe a control? I might try to send them to hell with the EditControls window, but that0s another known Fusion headache source...
You could either create dedicated user-controls in (say) the user-tab of the tool,
linking the actual valuecontrols to them,
or make a macro at the end of the day which only exhibits the controls you actually want to see.
With jobs like these I tend to create all UserControls I need in a single "Master"-Object and link all required controls there.

Cheers.

Eric.