Home Technical Talk

Struggling with Rigging an Art Easel

Nicodemaus
polycounter lvl 6
Offline / Send Message
Nicodemaus polycounter lvl 6
I have a pretty simple easel that is a main focus of an upcoming animation. I need to rig it more like a character then a simple props that i'm use to.



Requirements of the rig.
Needs to pivot up  on each of the 3 legs
Can be rotated around on whatever leg its on, and fall over pivoting from the front 2 legs
Back leg needs to close
Slight Rubbery bend for fast movements

I've done a decent amount of characters, and loads of rigging of simple mechanical things. this just seems to be stumping me, I started with the idea of a reverse foot rig to pivot up onto a leg, but it seems to fall apart once I add a second leg.

Is there any good resources for rigging non-Characters? Even better if people have an Idea of how to tackle the Easel Rig.

Replies

  • RN
    Offline / Send Message
    RN sublime tool
    Needs to pivot up on each of the 3 legs
    How about you have one free-flying parent joint, a helper joint, and a scripted button to automatically keyframe all of its direct child joints (you only need to keyframe them, as their own children will follow along) with the inverse transform of how they are transformed after you change the pivot?
    In other words, you place that helper joint wherever you wish to move the pivot joint to, and press the button: the transforms of the pivot children are stored in some array, the pivot joint assumes the transform of the helper joint, and then the pivot children get their transform multiplied with the result of "what_they_are_now.inverted() * what_they_were_before", causing them to undo this new transform of their parent, making them look like they stood in place without moving.
    This will cause the easel to effectively change its pivot point without changing how it looks to you, the animator. You'll press the button and see no change other than the pivot joint changing location and its child joints being keyframed.

    At some point during the animation you will want to place the pivot joint at a certain leg tip so the easel can pivot from there, so you place the helper joint there and press the button and continue animating from there. You can also place the pivot between the two front legs so that the easel can do that "pivoting from the front 2 legs".
    You can also place it anywhere else, like at the top of the easel so it can pivot upside down.

    That is the most complicated part of the rig, the other parts I think are simpler: try using a FFD lattice for global bendiness, and joint chains for per-leg bendiness like a humanoid spine; The back leg seems to be a simple 1-axis rotational joint.

    -- Edited with some things I forgot.
  • Nicodemaus
    Offline / Send Message
    Nicodemaus polycounter lvl 6
    Thanks s much RN im gonna try this tonight. I agree that the pivots are the hardest thing.
  • RN
    Offline / Send Message
    RN sublime tool
    Yeah, the order of matrix multiplications can give a completely different result, so that's one thing to keep in mind. Another issue is if changing the transform of a parent joint will automatically update the transforms of its child joints, if not you're going to have to do some more complicated algebra.

    In any case, I tried implementing what I said before in Blender, it looks like this:

    The "Run Script" button is executing the following. You would put such a script as a plugin in the UI of your Maya or 3ds or whatever:
    import bpy

    allBones = bpy.context.active_object.pose.bones
    pivotBone = allBones['PIVOT']
    helperBone = allBones['HELPER']

    # 1) Keyframe the loc/rot/scale of all pivot joint children and
    # advance the scene frame.
    for child in pivotBone.children:
    (...)
    bpy.context.scene.frame_current += 1

    # 2) Keep copies of the transforms of the pivot joint children.
    oldChildTransforms = [child.matrix.copy() for child in pivotBone.children]

    # 3) Change the transform of the pivot joint to be that of the helper joint.
    pivotBone.matrix = helperBone.matrix

    # 4) Refresh the scene/dependency-graph so that the children transforms are
    # updated with the new parent transform. Querying the child transforms should
    # yield their new transforms after their parent changed.
    bpy.context.scene.update()

    # 5) Undo the difference between the current and old transforms of the children
    # so they can stay in place.
    for index, child in enumerate(pivotBone.children):
    child.matrix *= child.matrix.inverted() * oldChildTransforms[index]

    # 6) Optional: preselect the helper joint?
    # (...)
  • Nicodemaus
    Offline / Send Message
    Nicodemaus polycounter lvl 6
    Wow thanks so much, this is above and beyond helpful.
Sign In or Register to comment.