Orienting joints with MEL?

Become a member of the CGSociety

Connect, Share, and Learn with our Large Growing CG Art Community. It's Free!

THREAD CLOSED
 
Thread Tools Search this Thread Display Modes
Old 11 November 2002   #1
Orienting joints with MEL?

Hi all-
Lately Ive been writing a script that takes an existing joint chain and creates a series of control arms for it. Initially, my idea was to take the existing chain and recreate a control chain on top of it, using the position, joint orient, and rotation axis of the existing chain to re-align the new chain I created. HOWEVER, this never gave predictable results; it only gave correct results when the chain was initially created in a certain way (all joint lying on one axis, for example). In my case, the script had to work in ALL cases.

Try this as an example to see what I mean:
-Create a random chain with 3-4 joints.
-Rotate each joint randomly.
-Freeze rotations on all joints.
-reorient the chain (joint -e -zso -ch -oj xyz <jointname>)
-Now orient the local rotational axis manually in some way (for example, say you were creating an arm).

-Now try and create a new chain on top of this chain, using the position, joint orient, and rotation axis of the first chain as input variables to create the second chain.

This NEVER produces predictable results for me in a consistent way. Sometimes it works, but rarely. Which leads me to the following question: is it even possible in MEL to create a joint chain and make sure the joint orientations are aligned correctly?
It seems the answer is NO. :( I would appreciate comments here.

HOWEVER, I did finally get my script working by simply duplicating the existing chain, and reworking some of the joints to fit my control rig. This was the only way scripting a control rig worked for me.

If you guys have tried this Id appreciate hearing your feedback.


-david
 
Old 11 November 2002   #2
Hi David,

i did the same, I just duplicated the chain and modified it, never thought about something else.
I guess, the reason why you don`t get the same result by setting the attribs, is you dont` t really set --all-- attribs.
the joint Node is inherited from the transformNode. if you see the Node Doku, transform has some more attributes.
if you freeze transformation for example your translate values are 0 0 0. but your "real translation" is the translate minus transMinusRotatePivot. this compensates your frozen values.
try your script again, make shure all the translate values are copied.

tell me please if it works

cheers

t
 
Old 11 November 2002   #3
If you want to orient joints to a predefined position. You could do this with an aim constraints.

1. De-parent the joint, so it's standing alone (no children)
2. Aim constraint it to it's previous child joint, using either a locator as an upvector or a world axis.
3. Delete the aim constraint (and up vector object if any).
4. Set the joint orient attributes of the joint to it's rotate values.
5. Set the rotate values to zero.

This, of course, depends on some kind of up vector. Though that might be easy to define.

Here's a snippet from the sciprt I'm working on that does this (it won't run as written here, as it needs the rest of the script, but might give you some idea):


	// Create joints at even intervals along the curve
	string $spine[];
	for ($i=0;$i<101;$i=$i+10)
	{
		currentTime $i;
		float $x = `getAttr ($group +".tx")`;
		float $y = `getAttr ($group +".ty")`;
		float $z = `getAttr ($group +".tz")`;
		select -cl;
		$spine[$i/10] = `joint -name ("spine_"+ $i/10) -position $x $y $z`;
		setAttr .displayLocalAxis 1; // !!! Debug, remove later
	}
	// Orient joints correctly
	for ($i=0;$i<10;$i++)
	{
		string $tempAim[] = `aimConstraint -worldUpVector 0 0 -1 -worldUpType "vector" $spine[$i+1] $spine[$i]`;
		delete $tempAim;
		float $rot[] = `getAttr ($spine[$i]+".r")`;
		//setAttr ($spine[$i]+".ra") $rot[0] $rot[1] $rot[2];
		setAttr ($spine[$i]+".jo") $rot[0] $rot[1] $rot[2];
		setAttr ($spine[$i]+".r") 0 0 0;
	}
	// Parent the joints together
	for ($i=0;$i<10;$i++)
	{
		parent $spine[$i+1] $spine[$i];	
	}


Ragnar
 
Old 11 November 2002   #4
Hi Ragnar-

Quote: constraint it to it's previous child joint


Dont you mean "successive joint" here? Ill have to see if this works in my case. What I want to do is get the joint orientation from an existing chain in which the joints have already been oriented correctly. Currently my script works by duplicating the original chain and removing joints to create a more simplified chain (joint orientations are therefore preserved).


David
 
Old 01 January 2006   #5
Thread automatically closed

This thread has been automatically closed as it remained inactive for 12 months. If you wish to continue the discussion, please create a new thread in the appropriate forum.
__________________
CGTalk Policy/Legalities
Note that as CGTalk Members, you agree to the terms and conditions of using this website.
 
Thread Closed share thread



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
CGSociety
Society of Digital Artists
www.cgsociety.org

Powered by vBulletin
Copyright 2000 - 2006,
Jelsoft Enterprises Ltd.
Minimize Ads
Forum Jump
Miscellaneous

All times are GMT. The time now is 05:08 AM.


Powered by vBulletin
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.