Hi,
For what it's worth, I would appreciate such a contribution. This is especially useful when saving/loading a simulation, in which case a joint's constraint is not necessarily satisfied at save time, complicating the reconstruction during load time, e.g. at the moment I have to:
1) position connected bodies "correctly" (i.e. so the joint is satisfied),
2) create the joint and set its anchor and/or axes,
3) move/rotate the bodies to their final positions.
For example, Bullet provides flexible constructors that allow you to specify the constraint's parameters relative to each connected body. Having said that, I do prefer ODE's simplified joint setup functions in general, so I'd consider your suggestion useful only for special cases like the saving/loading mentioned above.
As far as your implementation suggestions go, I would use "Body" (or even "BodyRelative" if it's not too unwieldy) instead of "Half" ("Half" does not describe the functions' intentions clearly i.m.o.), e.g.:
dJointSetUniversalBodyAxis1(joint,body,rel,x,y,z)
dJointSetUniversalBodyAxis2(joint,body,rel,x,y,z)
PS: If it weren't for the current use of "1" and "2" referring to body numbers (e.g. "dJointGetHingeAnchor2") or axis numbers (e.g. "dJointSetUniversalBodyAxis2") in different contexts, I would suggest using "A" and "B" for the bodies across the board (e.g. "dJointSetUniversalAxisA2(joint,x,y,z)").
Regards,