Ok so its starts in this thread:
My questions after all of that is this.
1. Rick I had a helper bone on the shoulder already (see attached picture). Did you want a twist bone specific for the clavicle alone? Or that I should use the twist bone instead of the helper.
If so to either for the clavicle twist. How do I constrain the rotation to 1 axis per making a "twist bone"? I cannot find a way to make a rotation link without it accessing all three axis.
2. Per Professor talking about wrong placement of edge loops for correct joint collapsing. Can someone give me a better idea of what he meant? I honestly couldn't understand what he was specifically saying (if that make me stupid, so be it). A visual overlay would work best to make it click.
Replies
the bone placement looks fine.
for helper bones, this is the setup i use (maya speak)
-on my upper arm bone(the one you have highlighted in the pic), i have another bone right on top, with the same orientation and everything. and I call it upperArm_Xcontrol.
because, it will be the bone that takes the x rots.
as far as contraining in max, it's been too long and i can't help.
as far as the expression for the xcontrol (This is MEL mind you):
"L_Armu_XControl.rotateX =-1*(L_Armu.rotateX)"
so, hope that helps. sorry, it's been years since I've been in max.
Both my twists effectively clones of their parent, taking the same position and almost the same rotation as the parent -the only change is a modification to the X axis on both.
I have a twist on the upperarm which takes only 50% of the X rotation of the upperarm. This creates a dead zone at the top of the arm.
I have a twist on the clavicle that ALSO takes 50% of the upperarm rotation. This means that as the clavicle moves around in space, it inherits a little bit of arm rolling. THis is NOT the same as skinning to the upper arm, becuase it's only taking the rolling motion in one axis. Get it? If I had blended in the arm onto the clavicle, then if I raise the arm more than the clavicle (you shouldn't do this, but animators often will), then you get a dip where the arm weighting is pushing the mesh downwards into the chest.
The other benefit that I have found with having these roll bones is that you can skin the non twist bones to have a hard crease under the armpit and across the front of the shoulder (like the inside of an elbow or the back of the knee). This stops you mesh ballooning out too much in the lats, or collapsing when the arms are forward (like a pistol aim).
You can then use the rollbones to soften the blending between the bones.
It is important that you get a fairly solid skinning job UNDER the rollbones too, and use them to enhance the underlying work.
You'll want a good test animation.
Erik (Thermidor) has created an EXCELLENT test animation for us at work that really pushes the rig to the limits - then a wee bit beyond. It does it for every joint and joint region in the body and it's fairly anamtomically correct. By this I mean that when the arm moves into a certain position, the hand and shoulder move to compensate as well as they can.
The body twists in it migrate through all the spine links and the neck, so you don't get unnatural body shears where one part of the spine moves too far and another not far enough.
It was a fairly short animation, a few hundred frames, which I've appended several dozen real game animtions to - idles, walk, run, sprint, jump, climb, hang, crouch, combat etc.
With a good test animation like this ur rigging method is pretty much as follows:
- Apply a skin or skin wrap.
- While in figure mode, quickly paint all the weights. You can do this in 5 to 10 minutes with some practice
- Come out of figure mode, stepping through the join tests and adjust weighting. You'll have less to do than you think with a bit of practice. A good portion of this will be weight blending. Do a joint, then move on.
- Get to the in game animations and refine them.
Now, here is the rub - when you adjust weights for one pose, especially in the shoulders, you'll break some of the other poses a little, so it's an iterative process. Skin a load of shoulder poses, then so back to the first one and refine it, step through them all.
Repeat a few times, the adjustments become minimal, but you CAN'T get them all looking correct the first time.
1. I have a twist bone in the upper arm. Currently those bones are shoing as links to make it easier to see. Is that what you are refering to with "I have a twist on the upperarm which takes only 50% of the X rotation of the upperarm. This creates a dead zone at the top of the arm.".
2. As far as the shoulder joint itself. I was trying to give an additional twist for the clavicle (green bone). Is that what you mean by two twists?
If so, how? I mean I cannot figure out how to make the clavicle twist only get it one axis of rotation influence from the upper arm. The only reasons the twist in the upper arm work is they were created by the biped rollout.
3. The highlighted bone is one I mimicked from a rig Poop sent me showing how he did his. The command panel rollout is showing how that bone is constrained. That is not a twist bone as more a helper bone as per the rollout its influence is all rotations from clavicle and upper arm. <u>Is this bone necessary?</u> Or does your (Ricks) twist/roll bone suggestion for the clavicle (assuming that I can figure out how to make it roll in one direction alone) makes this helper bone obsolete?
4. Do I need them both actually? If so, where does each influence? Since they are so close and have overlaps. With only 4 weights per bone, thats going to need very, very precise weighting. Since I will still need to add influence for the upper arm, spine, and some places the normal clavicle, neck, and even upper arm twist. Thats 6 total potentials out of only 4 choices each.
(Animator don't talk about Maya or Mel script right now, once you do that my eyes glaze over and I curl up in a ball rocking and sucking my thumb. I have enough problems telling my right from my left. )
2. Yes
3. You don't need it with my setup, but as I keep saying, that's how *I* do it. An inbetween bone that simply takes 50% of the surrounding area helps the skinner, bus doesn't overly affect the deformation ( a string of them prevents sweetie wrapper syndrome)
.
4. Do you need them both? As I keep saying, that's how *I* do it. That may or may not be right for you. I did explain what the function of each one was. 4 bones? Yup, same here. upper arm are has upper arm bone, upper arm twist, a little clavicle roll, no spine or neck. The arm doesn't get affected by the neck or spine.
The thing is though I just cant figure out how to get that bone to roll on one axis as constraining it to the upper arm effects all three. There doesn't seem to be a option on the drop down to only use one axis.
Yes, it's a pain.
ET nodes basically query the bone and report back on what it's doing. So, you can't access rotations directly, you need to set up an etn for everything you want to look at.
You can put these helpers anywhere in your scene - have a nice line of them at the feet if you want. I place them close to the joint they are reporting on, just because I do.
I create one for each rollbone, but I suppose it would make much more sense to create one for each bone you are reporting on.
Now, you need to point these transformation reporters at something to report on.
Maxscript is your friend. It's very easy to link an expose transform to a biped bone. Create the node, link it with script. I taught myself the script for this because we were setting up the same rolls on a few hundred models.
The syntax is transformNodeObject.exposenode = theBone YouNeedInfoOn
Assuming you have created an expose transform node called eTm_RArm to spy on the right arm bone....
$eTm_RArm.exposenode = $'Char R UpperArm'
maybe you've made an ET called leftClavTwist?
$leftClavTwist.exposenode = $'Char L UpperArm'
Easy? Yes. Let's move on. (Thank you Rick, I'll buy you a pint.)
Finished! NO. Bugger.
All you have done at this stage is created a helper object to report your Biped bones rotations. You then need to tell you roll/twist bones what you want to do.
This involves using the max wiring system to link constraint of one object to another. This is all doable via menus, but I've NEVER liked how max does this. Whilst dealing with dozens of models it made a lot of sense to learn how to script this, and to be honest I think the scripting is easier than the max menus.
Lets use script to wire this shit up!
So, your upper arm roll bone is taking half the rotation of the upper arm?
Use the wire command (paramWire.connect), tell it where it can get the rotation from (the expose node you created and the axis you want to roll on), the rollbone you want to affect, and the thing you want to do.
Heres an example relevant to you:
paramWire.connect $eTm_RupArm.baseObject[#Local_Euler_X] $'R ArmRoll'.rotation.controller[#X_Rotation] "Local_Euler_X*0.5"
paramWire.connect $eTm_RupArm.baseObject[#Local_Euler_Y] $'R ArmRoll'.rotation.controller[#Y_Rotation] "Local_Euler_Y"
paramWire.connect $eTm_RupArm.baseObject[#Local_Euler_Z] $'R ArmRoll'.rotation.controller[#Z_Rotation] "Local_Euler_Z"
See?
I told it that my rollbone for the right arm takes the same rotation in Y and Z as the right arm does, but that the X axis needs to be halved.
Yes. Script. I write a lot of it for stuff like this. Prevents mistakes once you have several dozen models to work on.
How do you learn it? You use the listener and the help files, and search on the interweb for stuff, and make occasional posts asking for some help. And sometimes you ask the tools programmers at work.
Anyone got a beer?
Your talking to someone who couldn't even get past basic.
It got me through uni.
A: Do I need to do any constraints to the twist bone other than have it as a child of the clavicle?
B: Do I attach the script to the bone, or etm, or scene? Either way, how??
<font class="small">Code:</font><hr /><pre>
$etm_LArm.exposenode = $'Poop L UpperArm'
paramWire.connect $etm_LArm.baseObject[#Local_Euler_X] $'L Clavicle Helper'.rotation.controller[#X_Rotation] "Local_Euler_X*0.5"
paramWire.connect $etm_LArm.baseObject[#Local_Euler_Y] $'L Clavicle Helper'.rotation.controller[#Y_Rotation] "Local_Euler_Y"
paramWire.connect $etm_LArm.baseObject[#Local_Euler_Z] $'L Clavicle Helper'.rotation.controller[#Z_Rotation] "Local_Euler_Z"
</pre><hr />
Result:
"Runtime Error: connect requires subAnims"
Too little info.
What bit is crashing it? The etm linking working?
Then max gives a pop up error with that message.
Im sure this is something simple that I just am overlooking since again I know nothing about nothing about maxscript other to load in plugins. Possible how to attach a maxscript to an object or scence.
http://www.aldenfilion.com/tutorial/face_rig/facial_rig.htm
Not the same error now. But still is erroring. I was reading up on wiring in max 9 and noticed a mention of it being changed from older versions. I'm wondering if its the scripts terminology??
http://www.oxynary.com/downloads/bonefuck.zip
Totally taking a shot in the dark with that one.
Vig, I looked briefly over the link and the reaction manager. Slightly confused as if its dealing with morphs alone? Or could work for one bone getting its data from another's? The tutorial showed two objects, not bones interacting.
For me wire parameters is hard to work with and feels like what E-Mesh is to E-Poly.
At the top left of the reaction manager you have buttons to;
- Select the master object, this is the object you're going to pull data from.
- Select a slave object.
When you select the objects by clicking on them a pop up menu comes up and you choose the parameters you wish to watch/change. Then you create your states in the window below. I delete the states it creates automatically and build new ones so both objects are in the same state. Then find data extremes by moving those objects around and noting the data you want to watch/change. There are more complicated ways to capture the exact data but its convoluted and unnecessary for what you're doing.
- Drop that data into your states and watch the magic happen, or in case you get something wrong watch in horror as your rig destroys itself heh =P
I'm not sure this works so well with biped as it has some funky rules, but it looks like you're using a custom rig made up of default bones so you should be fine.
Anyhow, taking ideas from both. I got it to work I think correctly Rick? I did it with your expose transform helper, and then used the wire paramaters and made a connection from the ETH local rotation into the clavicles twist helper. Then adjusted the script below with the 50% value from your original script.
I attached a sample just to make sure this is the same idea you meant.
http://www.oxynary.com/downloads/bib_test.zip
Now just get to work on the skinning, remembering to concentrate on getting the skinning to work well WITHOUT the rollbones before you use them to make it work better.