You don’t want the CharacterMaker class. That’s used by the egg loader for the purpose of constructing a Character object out of an egg file.
You need to understand a little of the structure of a Character internally, and how it relates to the higher-level Python class, Actor, which is the principle interface documented here.
Actor is the high-level interface to animations from the Python level. An Actor typically contains one Character node (though it might contain several, in the case of multipart actors).
Character is the front-facing interface to controlling animations at the C++ level. When the egg loader finds an animated model in an egg file, it creates a Character object, which is a kind of PandaNode, and attaches it to the scene graph. Then it constructs the geometry corresponding to that animated model and attaches it to the Character (in the form of one or more GeomNodes). It also fills in the contents of the Character object with the model’s hierarchy of joints and morphs.
The Character object itself is really just a mechanism to attach the joint hierarchy into the scene graph. The actual joint hierarchy is called a bundle; it is a hierarchy of PartGroup nodes (not related to PandaNode), whose root is a node of type PartBundle. This bundle can be retrieved with Character.getBundle().
Most of the interfaces that control the animation are made through the bundle. For instance, you can bind an animation here, or control the blending and/or weight of different animations. You can also walk through the list of children of the bundle, using get_num_children()/get_child(); and if you do this recursively, you can walk through the entire hierarchy of joints. Or, you can simply call PartBundle::find_child() to immediately return the joint with a particular name.
But to control the joints of a character programmatically, you don’t need to get a pointer to the joint. Instead, you set it up directly from the PartBundle, using PartBundle::control_joint(). You pass it a new PandaNode that you have attached to the Character node. Henceforth, any transform that you assign to this PandaNode will be automatically applied to the joint you specified.
In general, you might find it useful to read through the documentation on this website about using the Actor class, and then reading the Actor.py file itself, to see how it uses the low-level C++ class to achieve its magic. You will find that Actor is in many cases just a thin wrapper around Character and PartBundle.
For instance, the manual here recommends calling Actor.controlJoint() to control a joint programmatically. If you read Actor.py, you can see that Actor.controlJoint() simply calls PartBundle::control_joint().
David