Getting rid of transform nodes within a skeletal hierarchy

I am working in maya and during the course of rigging, transform nodes were added to my skeleton. I believe this was caused by un-parenting and re-parenting bones along the way. This would normally not be an issue, but the rig is for a game character for use with Unreal 3 engine. When we import the skeleton into Unreal, the entire rig blows up. I believe these transform nodes are the cause. We have imported two rigs into the engine without a problem (and without transform nodes) so I deductive reasoning tells me to fix this issue first. I have attached a screenshot of my hypergraph so you guys can see what I’m talking about with the transform nodes. So, is there an easy way to remove these nodes without messing up the entire rig?

Thanks in advance,

Steve Tomei

You can use the connectJoint command to parent the joints back without the extra transform node.

I didn’t even think about that! It should definitely work.

Also keep your scales in mind. Usually the transforms are added when you scale a joints parent and then re-parent it under a joint that has a different scale.

Yeah, also sometimes your scales might show up as 1.0 in the outliner, but if you do a getAttr on them, you find that they are really somthing like 0.999999999998 :slight_smile:

Does anyone know of a reason Maya would create transforms at parent besides the joints having different scales? I think that’s the only reason, but it’d be good to be aware of in case not.

So I fixed my transform node problem but my rig is still messed up in the engine. For some reason the skeleton is not even inside the mesh. I’ve attached a pic of my problem. Have any of you guys seen anything like this?

Btw, thanks for the help guys!

I don’t know. Are you exclusively exporting joints? I think you can run into issues when moving rigs with IKs, Nurbs Curves, Transforms, etc. Although I’m no expert at moving rigs into a game engine.

Yes, I’m only exporting the joints. I’ll have to just mess around a little more. I wish I had more experience…

I mean, and you have have answered this, I’m just trying to clarify. Is the joint chain your exporting only containing joints? Or are there any other nodes mixed into it at any point?

Nope no other nodes. Only joints. I have found my problem and it is fixed. Bad rotational values were causing the engine to misread the skeleton.

Thanks for your help!

most of the time these transform issues are because of non-frozen nodes. I guess the reason u got that transform node “transform15” was bcoze the node was not frozen outside the spine0_5, in other words u froze spine1 first and then parented it with spine0_5. I’m not so sure abot the export issue, but I think it has something to do with geometry. Make sure u check for transformations on the root bone, and the geometry. Skeleton is not up which gives an impression that ur up-axis is not the same. check for the axis too. Lemme know if that helped.

LOKO. Thanks for the advice. Your information did not help me solve my current problem as I already fixed it. However, your information was very helpful and I’m sure it will aid me in the future to help me avoid the problem!

zhaiyuanwhAdminkhz4mbs3pfxfolzt05pjmkqi

Issue: select a joint under a transform node. Press SHIFT+P to Unparent:

AfterSHIFTP

It creates an other Transform node…

Hi, I just made a really simple script to solve this issue:

def DeletePhantomTransformNode():
    sel = cmds.ls(selection=True)
    for item in sel:
        cmds.select(clear=True)
        cmds.select(item)
        mel.eval("pickWalk -d up")
        transformSel = cmds.ls(selection=True)
        cmds.setAttr("{}.scaleX".format(transformSel[0]),1)
        cmds.setAttr("{}.scaleY".format(transformSel[0]),1)
        cmds.setAttr("{}.scaleZ".format(transformSel[0]),1)
        
        mel.eval("pickWalk -d down")
        jointSel = cmds.ls(selection=True)
        cmds.setAttr("{}.scaleX".format(jointSel[0]),1)
        cmds.setAttr("{}.scaleY".format(jointSel[0]),1)
        cmds.setAttr("{}.scaleZ".format(jointSel[0]),1)
        
        cmds.parent(w=True)
        
        cmds.select(clear=True)
        
        cmds.select(transformSel[0])
        
        cmds.delete()

Just Select the joint with the undesired node, the code will:

Save the joint selected, pickwalk Up to the transform, set it’s scale to 1, then it will go to the joint, set it scales to 1. Lastly it will parent the joint to the world and DELETE the transform node. Hope it Helps =D

This is usually the issue.