Bending body part via script
Slosh
Posts: 2,391
I am trying to write this bit of code, but cannot find any references to acceptable syntax. I would like to do the following:
While having Genesis 2 Female selected (or any part of her body), I would like to bend her forearm, say 16.5 units. So I need to be able to tell the script that G2F is selected, find her left forearm, get it's current z rotation and assign that to a variable.
Please help. The current documentation is incomplete, and I don't know what to do or where to find some examples.
Thanks,
Slosh
Comments
Never mind, I figured it out. Thanks anyway!
OK, I'm still having a problem. In my script, I can apply an action to the selected figure, for example Genesis. I can make her move in the Z direction 1 unit. What I would like to do is select Genesis, then have the script assign her forearm to a variable, which I would then bend via a function. At this point, I don't know how to tell the script to select her forearm.
I am using Scene.findNodeByLabel("Left Forearm") which does select her forearm. The problem is, by using "Scene", the script applies the function to the first listed object in the scene, not the selected object. More specifically, if I have 2 Genesis figures in the scene, no matter which Genesis I have selected, it applies the forearm bend to the first listed Genesis. How do I use the "findNodeByLabel" command on the selected figure?
This is for a script that will be very useful, so I would really like to get it worked out. The script works great if you only have one figure in the scene, but we all know that is often not the case when setting up our scenes.
Use DzNode.findNodeChild( name, true ) on the selected figure - name being the name, not the label, of the bone you want and the true telling it to scan through the figure's hierarchy rather than just looking at the immediate children (which would be the hip only).
Thank you, Richard. Also, the array info you gave me the other day worked out great. I have a new issue, which I can't figure out. When I use a function to add a value to the ZRotation of a bone, the math is not working out. Specifically, I have a bone whose ZRotate (Bend) is originally set at (-11.86) and I want to add (16.31) to it, which should make the new value (4.45), but instead it is adding (4.45) to (-11.86) and giving me (-7.41). How is that happening? I do notice that the bone already has a set minimum limit of -10, but I turned limits off for the figure.
Other rotations, such as Twist and Side-Side are computing properly, and sometimes Bend does, too. But other times, it comes out wrong. Any ideas?
If you have the skeleton for the selected figure, you can do something like this:
Richard's method with the findNodeChild() would work also, but is different, because it searches the whole hierarchy. That means it will also search in child objects that do not belong to the currently selected figure (e.g. a clothing item also might have a "Left Hand"), so even if you have only one selected figure, you might have multiple "Left Hands". Which might be a problem or not, depending on the circumstances and what you want to do with it.
I think I love you, millighost. That worked perfectly! Thank you so much.
I want to thank Richard, too. Although his method did not work for me, the script did not like me using DzNode. I'm sure I used it wrong, but thankfully millighost's method workd.
Anyone have any ideas on the funky math?
How do you add the to the rotation? To simulate something like the user does when sliding the sliders, it should look more or less like this:
The figure is a DzNode, so you'd just use the findChildNode function on that - no need to create a separate DzNode (if that's what you were doing). Though millighost's alternative is more efficient anyway.
As for the weird maths, is there any ERC on the parameter with the master control set?
Thanks to millighost, my script is doing exactly what I wanted it to do, as well as overcoming that "math" problem, which stemmed from the raw values being factored into the equation.
I wish there was a developers' chatroom. I feel like I could learn a lot from talking to people like millighost and Richard. Sometimes PM and forum posts are a bit like snail mail and it would be great to share ideas and knowledge on a more direct level.
But until that day, I am still grateful for the forum and helpful people.
My aim is to select rCollar bone from the entire body then move it. So I am using help from the discussion here. I can move the select the bone and run the script using Scene.getSelectedNodeList();. But I want the script to automatically find the bone and do the processing and save my result.
When I am trying to use the statement print ("found a hand: ", bone.name);
I am getting an error
Script Error: Line 21
TypeError: Result of expression 'bone' [null] is not an object.
Stack Trace: ()@:21
I dont know how to correct it.
us
if ( bone.inherits( "DzBone" ) {
print ("found a hand: ", bone.name);
}
to check you have a valid retunrn object before trying to do anything with it. I try to check everything, even if there's not much chance of its failing, to be on the safe side.
That still assumes that the
bone
variable is notundefined
ornull
. You'll want to at least check that thebone
variable is a truthy value before you attempt to callinherits
on it:You can go a little further and even test for inequality with
undefined
andnull
, or use atry...catch
statement:-Rob