Rigging shadow proxies?

I’m curious what’s the best way (max 2009) to rig the soft little pseudo-AO quads I have under this guy’s feet?

Currently I have each skinned to a point helper that is simply linked to one of Biped feet bones, and uses the Inherit checkboxes to prohibit Z movement and any rotation.

Works great except when I try to move the helper itself, then it doesn’t seem to move logically, like moving on World Y will make it move at an angle across the XZ plane.

I’d avoid those Inherit checkboxes whenever possible. You’d probably want to assign a Script Controller to AO quad’s position (give it the foot bone’s Y and X position, but keep its Z at 0 or whatever the ground height is where the foot bone is, you can check by casting an intersection ray from the foot straight down, and even take the surface normal from that to orient the bone).

Thanks Rob, sounds a lot like the Expression controller, makes sense.

If I remember my Max history correctly, there were Expressions, then Script controllers, but script controllers were really slow and not well supported. They were redone in Max 8 and have replaced Expression controllers (which were redone in Max 8 as well according to Help, but I think they are somewhat deprecated and I don’t know if anyone uses them… are they still faster than Script controllers, does any Max historian know?)

Made a variable, tried to assign it to the position controller of the biped foot but that’s a position list, so it won’t work. Instead I linked a helper to the Biped foot, and assigned the variable fooX to the helper’s X Position Bezier Float (and fooY to the Y pos), then when I evaluate my Script Controller expression [fooX, fooY, Z] I get the exception Unable to convert Controller:Bezier_Float to type:Float.

do “fooY.value” instead of just “fooY”, and same for fooX.

Hmmm… [fooX.value, fooY.value, Z] produces – Unable to convert: undefined to type:Float

Oops, just had to define Z.

But how do I get it to update each frame? Thought I could just use NT or F, but [(fooX.valueF), (fooY.valueF), 0 ] doesn’t update.

I guess I’m getting way ahead of myself here, not knowing MXS. I tried just the simple example in the Help file…

local pos=[0,0,0]
for o in objects where o != StickShadowL do
pos += o.pos
pos / (objects.count - 1)

But it returns the error Unknown property: “pos” in $Biped_Object:Bip01 @ [ … ]

Which I guess makes sense because it’s trying to evaluate all nodes in the scene but I guess Biped is an unusual node type that probably has to be accessed differently. And anyhow this is not the script I need.

Because biped is a totally different beast than most max objects, its parts don’t have “position”, so you have to use transform.position instead.

Not being a TA I’d do it the old fashioned manual way.

Create a point helper and align to the foot but keep it upright. Turn off it’s Move Z and rotation axes in Inherit motion. Link to foot. Now it’ll follow the foot in the XY plane but stay upright and at a fixed position in Z. (Just like the original setup).

Make a plane and align or position as required below the foot. Link to the point helper. Now all the weird movement that might happen will be in the point helper which you don’t move. You can move or animate the plane as required. If it must be skinned, then another point helper replacing the plane stage should do, then skin the plane to that.

I haven’t tested it extensively, but it seems to work.

I’m going to put this off for later, after I’ve learned some MAXScript fundamentals. Thanks for the help guys, I’ll certainly hit you up again later.

Oops, missed your post Robin. I have it working well enough as-is, don’t need to move those AO bones independently. I just have to get this job out of the way first.

You could use wiring and exposeTM on the biped feet.

ExposeTM gives you local or world coords for Pos, Rot and Scale

Super useful for things that live in their own world (biped, target objects etc…)