<-previous
index -- map
The Underlying Concepts & Interface Description

You can think of Puppeteer as a channel in a sound-mixer: there is data coming in, being modified, and being sent out again. The input and output in these cases are the objects, and the data is the object's PSR data, intead of the soundwave. There are a few stations the data passes by in the process. I'll explain them all in turn below, together with the interface elements that drive them.

 

the source and destination objects


The Source object can be seen as the input object. It's the object you're going to be using to influence the Destination object, which, in turn, can be seen as the output object. In Puppeteer, the source and destination objects can actually be the same object! You can, for example, use Puppeteer to make an object rotate in P by 90 degrees for every 100m it moves in Z.
You define the source and destination object in the upper-left and upper-right area of the Puppeteer window. There you can choose various methods of definition. With the exception of Custom, these are all relative methods, which take the object the Puppeteer tag is attached to into account.
The method This object refers to the object the Puppeteer tag is attached to, plain and simple. The other options: Parent object, Child object, Previous object and Next object, all work relative to the object the tag is attached to. So Parent object will, for example, use the immediate parent of the object as the source object. With all these four options, you can also set a Level, with which you can broaden the scope of the option. For example, if you set the source object to Next object, and the Level to 4, Puppeteer will use the fourth direct neighbour of the object the Puppeteer tag is attached to. Keep in mind, that Previous and Next will regard neighbouring objects as if they are folded in the Object Manager. They will look for objects in the same level of the hierarchy, not to their parent or childs. Likewise, Child will look only for the first child of an object, or the first child of that if the level has been set. It will disregard other childs of the object completely. Parent will take the direct parent, or the parent of that if the level has been set. It will disregard the neighbours of the parent object.
There are three other object types: Selected object, Custom, and Custom in parent space. Selected object is more of a function than an object type. It will simply look which object is selected in the Object Manager, fill in it's name into Puppeteer's name field, and set the object type to Custom. Custom, then, is the mode you are most used to in Cinema4D. It simply allows you to fill in a specific object name, and Puppeteer will search all objects to find the first object with that exact name.
Custom in parent space is similar to Custom, in that it searches for an object with a certain name. The difference with this type of search is that the search can be limited to just the objects that are at the same level, or deeper than, the object the tag is attached to. So it will search all objects that are a child of the same parent as the tag's object, and all their child objects. On top of this, you can also set the Level parameter here. Setting it to two for example will search all child objects (and their child objects, etc.) of the parent of the parent (thus: two) of the tag's object, broadening the search with one level in the hierarchy. The main use of this type of object definition will become clear if you want to create a Puppeteer driven structure, and use it multiple times in the same scene. With Custom, each structure will find the first object in the whole scene that has the desired name, so all structures will use the control-object of the topmost structure! If set to Custom in parent space, with the Level set correctly, you can limit the search of each structure to just the objects within it's own hierarchy.
Another thing to keep in mind with Custom in parent space is that this search method uses a coffee-driven search algorithm, and thus can be a bit slower than the other object definition methods. In other words: only use if you really need to.
Next to the name field is an extra button: Set Custom. Like the Selected object option in the popup-menu, this will fill in the name of the currently defined object (like the Parent, or This object) and set the object type to Custom.

 

strength and active


Between the two object definition areas are two extra settings: Strength and Active.
Strength defines how strong the overall influence of the Puppeteer tag is in relation to previous expression tags. Cinema4D calculates all expressions on an object from left to right (that is, expression tags that are on the left in the Object Manager's tag display area are calculated first). Also, it calculates a document's timeline first, and any expressions after that. Suppose you have an object that is animated to rotate in H, and add a Puppeteer somewhere that makes the same object rotate in H as well. The strength value is then used to decide to what extent the Puppeteer tag influences the object's H rotation. If it's set to 100%, Puppeteer will have full influence. If it is set to 50%, the object's H rotation will be a mix between the animated rotation and the rotation caused by the Puppeteer tag. Similarly, adding another Puppeteer tag to the right of the last tag, also affecting H rotation and set to 50%, will mix the result of the last mix (50% animation, 50% first Puppeteer tag) once again. Effectively this will result in the animation having 25% influence, the first Puppeteer tag also having 25% influence, and the second Puppeteer tag having 50% influence.
The Active checkbox allows you to completely turn off the Puppeteer tag. It is advisable to turn Puppeteer off when doing the first settings, like linking the correct data together and setting the curve (more on both further below), and only turning it on when doing the final tweaks. Since the Puppeteer interface is completely non-modal and works in real-time, any mistake you make accutely changes the destination object, and a mistake might mean inadvertedly sending your object into infinity!

 

<-previous
index -- map