Forum Coordinators: RedPhantom
Poser - OFFICIAL F.A.Q (Last Updated: 2025 Jan 24 4:20 pm)
The word One just above the deltaAddDelta 0.05 doesn't look right. Maybe you inserted it as a "comment line" but didn't put // or # in front of it?
If that word was in the CR2, it would prevent Poser from reading things in the correct order after that.
My python page
My ShareCG freebies
Yeah, thanks. I think 'One' was a blunder and probably should have been the morph name RshldrSwing-30. Still, when I tried this out I didn't get any results.
Download my free stuff here: http://www.renderosity.com/homepage.php?page=2&userid=323368
Quote - I think I need to hold back each JCM until its closest JCM has reached 100% for this to work properly, but I'm not sure how to do this.
First you need a 'valueParm channel in the BODY named "one", with its 'initValue' and 'keys' value set to "1" and 'like this:
valueParm one
{
name one
initValue 1
hidden 1
forceLimits 1
min 1
max 1
trackingScale 0.004
keys
{
static 0
k 0 1
}
interpStyleLocked 0
}
Next in each of the targetgeom channels you need to set "forceLimits 1" and "min 0" to prevent the channel value going negative. Looks like you already did that.
Next, in adition to the slaving code that slaves the morph to a rotation you need to add an extra block of slaving code, slaving the targetgeom channel to "one" with a negative deltaAddDelta value. This holdes the morph back from expression untill it accumulates a greater value from the rotate channel than it is getting from the "one" channel, eg:
targetGeom RshldrSwing-30
{
name RshldrSwing-30
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.02
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure 1
A:1
yrot
deltaAddDelta -0.0333333
valueOpDeltaAdd
Figure 1
BODY:1
one
deltaAddDelta -1.0
indexes 1
numbDeltas 8
deltas
{
}
}
The above is just an example. You may need to vary the deltaAddDelta values in either or both blocks of slaving code, or even redo the morph with a diffrent strength to get the effect you want. In the above example the RshldrSwing-30 starts being expressed when yrot goes over -30°, and reaches full expression when yrot is -60°.
Attached Link: Some ERC Techniques
With the method in my last post the morphs can be stacked one on top of the other, each starting to come in at different value of the master channel (eg yrot). It's also possible to turn morphs on and off in sequence. See the thread above for details. I must admit I did not do a good job of explaining things in that thread, but perhaps you will be able to understand what I mean. Also in that thread, odf gives an example of an alternative way to do sequential morphs, and whilst I have not yet tried his method, it does look like it may be superior.
Wow! I think I missed many good JCM/ERC discussions.
@Paloth, the technique Les described works very well. I tried it.
@Les, did you received my e-mail?
I wonder if there is a workflow of making JCM that will work well with 2-axis rotation, for example, xrot and zrot. The purpose of that is to correct the issues of the existing JCMs.
Thanks for taking the time to post, lesbentley. I forgot to mention that these joint controlled morphs are partial body morphs, extending across more than one body part. Is the slaving code added to the targetGeom in each effected part or is there a place where this can all be accomplished at once?
Download my free stuff here: http://www.renderosity.com/homepage.php?page=2&userid=323368
By the way, I'm seeing results. This is working. Thanks again.
Download my free stuff here: http://www.renderosity.com/homepage.php?page=2&userid=323368
Quote - I forgot to mention that these joint controlled morphs are partial body morphs, extending across more than one body part. Is the slaving code added to the targetGeom in each effected part or is there a place where this can all be accomplished at once?
You could do it either way. If you put the slaving code in a value parm in the BODY:
valueParm SomeName
{
name SomeName
initValue 0
hidden 1
forceLimits 0
min -100000
max 100000
trackingScale 0.004
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure 1
A:1
yrot
deltaAddDelta -0.0333333
valueOpDeltaAdd
Figure 1
BODY:1
one
deltaAddDelta -1.0
}
You could then have one block of slaving code in each targetgeom channel, slaving it to "SomeName", with a 'deltaAddDelta' of "1.0". This could be an advantage if you want to experiment with the values in the slaving code, as you would only need to change the code in one channel. But if you don't think you will need to tweak the values, you might as well just put the two blocks in each targetgeom channel.
Just as a note in case someone is following this and runs into problems; My cr2 doesn't parent like the example posted in lesbentley's instructions. The children of valueOpDeltaAdd are merely added under valueOpDeltaAdd with no indentation. When I attempted to parent those listings to match the instructions it caused the body part to become unselectable.
Download my free stuff here: http://www.renderosity.com/homepage.php?page=2&userid=323368
I'm having no luck. I thought I was holding back a morph, but it seems to be unmovable.
I set up a channel in the BODY
valueParm one
{
name one
initValue 1
hidden 1
forceLimits 1
min 1
max 1
trackingScale 0.004
keys
{
static 0
k 0 1
}
interpStyleLocked 0
}
Then I attempted to hold back a shldr rotation JCM in the chest actor channel.
targetGeom RshldrSwing-20
{
name RshldrSwing-20
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure 1
A:1
yrot
deltaAddDelta 0.050000
Figure 1
BODY: 1
one
deltaAddDelta 0.1
indexes 616
numbDeltas 3994
deltas
{
This kills the RshldrSwing -20 morph completely, even when the limb has rotated to -50. I was trying to hold back the morph until the dial reached -10.
'A:1' was originally rShldr:1, but I changed it to A:1 to match the instructions. Later, I attempted to hold back the morph with a cr2 that contained rShldr:1 instead of A:1 and I couldn't effect the morph at all.
Download my free stuff here: http://www.renderosity.com/homepage.php?page=2&userid=323368
Hi Paloth,
Are you using DAZ Studio?
From your original goal: "I would like to hold back targetGeom RshldrSwing-30 until targetGeom RshldrSwing-20 has reached 100%."
You will have to do the following:
targetGeom RshldrSwing-20
{
name RshldrSwing-20
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
rShldr:1
yrot
deltaAddDelta -0.05
indexes 3
numbDeltas 1279
deltas
targetGeom RshldrSwing-30
{
name RshldrSwing-30
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
BODY:1
One
deltaAddDelta <span style="color:#00ff00;">-0.666667</span>
valueOpDeltaAdd
Figure
rShldr:1
yrot
deltaAddDelta -0.0333333
indexes 33
numbDeltas 1279
deltas
If -0.666667 is not working, try just -1.
@Les, I'm not sure about the value for "One" in Paloth's case. I think it is 20/30 = 0.666667 because Paloth wants to have no effect of RshldrSwing-30 until RshldrSwing-20 is 100%, i.e., 20. In RshldrSwing-30, 1 is 30, therefore 20 is 0.666667 in RshldrSwing-30. Am I right?
Paloth, for your references, the following is my example with kick forward at 30, 60 and 90 degree. Note that the actual deltas are omitted and replaced with "..."
targetGeom JCM-lThighKickForward1
{
name JCM-lThighKickForward1
initValue 0
hidden 1
forceLimits 1
min 0
max 1
trackingScale 0.004
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
lThigh
xrot
deltaAddDelta -0.03333333333333333
indexes 797
numbDeltas 1314
deltas
{
...
}
blendType 0
}
targetGeom JCM-lThighKickForward2
{
name JCM-lThighKickForward2
initValue 0
hidden 1
forceLimits 1
min 0
max 1
trackingScale 0.004
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
BODY
One
deltaAddDelta -1
valueOpDeltaAdd
Figure
lThigh
xrot
deltaAddDelta -0.03333333333333333
indexes 865
numbDeltas 1314
deltas
{
...
}
blendType 0
}
targetGeom JCM-lThighKickForward3
{
name JCM-lThighKickForward3
initValue 0
hidden 1
forceLimits 1
min 0
max 1
trackingScale 0.004
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
BODY
One
deltaAddDelta -2
valueOpDeltaAdd
Figure
lThigh
xrot
deltaAddDelta -0.03333333333333333
indexes 699
numbDeltas 1314
deltas
{
...
}
blendType 0
}
Thanks for the input, amy_aimei. To answer your question, I used Daz Studio to load the JCMs. The cr2 was exported from Daz Studio.
I tried to apply the script you posted, but I'm running into the same problem. The part cannot be selected when I indent or "parent" after valueOpDeltaAdd. If I include the data without the indent, the effected morph doesn't move at all.
Download my free stuff here: http://www.renderosity.com/homepage.php?page=2&userid=323368
Hi Paloth,
I'm using Daz Studio too.
I've found my thread about the JCM I tried to make, which is very similar to what you want to achieve. Please take a look at http://www.renderosity.com/mod/forumpro/showthread.php?thread_id=2795918
It is based on odf's idea as below.
Quote - I think this version of the knee bend might actually do for the first round. Encouraged by my success, I shall try the same technique on the hip bend to make it look good at up to 150 degrees or so.
I thought I'd give some more details on how I did it. In the following I'm assuming that you are familiar with how JCMs and, more generally, ERCs work.
The basic idea was to use cascading JCMs for the bend. So instead of one, I used three JCMs for this bend, lets call them A, B and C. So let's just talk about what I wanted to see, and then how I achieved it.
Up 90 degrees, only A is active and B and C stay at 0%. A reaches 100% at 90 degrees and then stays at 100%. Between 90 and 120 degrees, A and B are active. B reaches 100% at 120 degrees and then stays at 100%. You can now imagine what C does. In effect, I get a smooth transition between four shapes, including the normal one at 0 degrees.
In tabular form:
angle A B C > 0 0.0000 0.0 0.0 > 15 0.1667 0.0 0.0 > 30 0.3333 0.0 0.0 > 45 0.5000 0.0 0.0 > 60 0.6667 0.0 0.0 > 75 0.8333 0.0 0.0 > 90 1.0000 0.0 0.0 > 105 1.0000 0.5 0.0 > 120 1.0000 1.0 0.0 > 135 1.0000 1.0 0.5 > 150 1.0000 1.0 1.0 Get the idea?
So A needs to increase by 1.0 while the angle increases by 90, which means I slave it to the rotation channel with a factor of 1.0 / 90 = 0.011111. Then I just set the limits for A to 0.0 and 1.0, and A is done with. Now B is supposed to grow from 0.0 to 1.0 between 90 and 120 degrees, which means the factor for B must be 1.0 / 30 = 0.033333. So far, so simple.
But supposing that B starts with the value 0.0 at 0 degrees, with that factor it would already be at 3.0 when the angle is 90 degrees. Not good! So I have to make sure it starts with a nominal value of -3.0 at 0 degrees. Then when I set the limits for B to 0.0 and 1.0 as well, it will effectively stay at 0.0 until the angle reaches 90 degrees. But simply setting it to -3.0 as an initial value doesn't seem to work very well. So the trick I'm using at the moment is to add a channel with the name "one" to the BODY actor and set it up so its value is always ... wait for it ... 1.0. Then I slave my morph B to that channel as well with a factor of -3.0.
Okay, you see now where this is going. For morph C, I need a 100% increase between 120 and 150 degrees, so the factor is again 0.033333. That factor gives me a value of 4.0 at 120 degrees, so I slave my C morph to the "one" channel with a factor of -4.0. Et voila!
The beauty if this scheme is that it works for any number of intermediate shapes, and with the DAZ setup tools, it is in fact fairly easy to rig. I'm happy to go into more detail if anyone has questions.
Thanks for the explanation and the link. I may attempt to apply it if I can resolve other issues I'm having with gimbal lock and general burnout.
Download my free stuff here: http://www.renderosity.com/homepage.php?page=2&userid=323368
I’ve learned to hold back a JCM morph at this point. I can determine the deltaAddDelta value and correlate it to the parameter dial in order to hold back a JCM until its preceding JCM has reached 100%. What I would like to do is have the following JCM go from 0 to 100% within a defined area of the dial. In other words, after having held back by -85 a JCM designed for a limb that is posed on the x-axis at the rotation of 115, I would like the JCM to appear between 85 and 115. Unfortunately, the late start is making the second JCM less than 100% when it reaches 115 on the parameter dial. Maybe I can adjust this by changing the trackingScale? Is there an established method for dealing with this sort of thing?
Download my free stuff here: http://www.renderosity.com/homepage.php?page=2&userid=323368
I just figured it out. But can I explain it..?
Download my free stuff here: http://www.renderosity.com/homepage.php?page=2&userid=323368
For the record, and to solidify the process in my own mind, here is how you can precisely derive the deltaAddDelta values for JCMs that you wish to hold back.
Suppose that a Joint Controlled Morph was originally designed to be at full effect when the x rotation reaches 145 on the parameter dial, but you don’t want it to take effect until a prior JCM designed at 90 is 100% active. Subtract 90 from 145. There is a range of 55 for the second morph to load (between 90 and 145.) 1/55 = 0.0181818. This will be the first deltaAddDelta value for the JCM. You will now need to hold this JCM back until the first JCM reaches full force at 90 degrees. The negative value in the “One” section can be found precisely by dividing 145 by 90. -1.611111 is entered in the second deltaAddDelta channel that is slaved to “One.”
Download my free stuff here: http://www.renderosity.com/homepage.php?page=2&userid=323368
This site uses cookies to deliver the best experience. Our own cookies make user accounts and other features possible. Third-party cookies are used to display relevant ads and to analyze how Renderosity is used. By using our site, you acknowledge that you have read and understood our Terms of Service, including our Cookie Policy and our Privacy Policy.
I had some luck stacking JCMs and building a cr2 with Daz Studio's Morph Loader Pro and the Property Editor but I ran into a problem with the backward rotation morphs for the shoulders. There are numerous JCMs, distributed at ten degree intervals (except for the first that is at -20 degrees.) As the shoulder rotates backwards on the y axis, all of the JCMs begin to activate with differing proportions. For example, when the shoulder swings back to -20 on the parameter dial, the -20 morph is at 100%, the -30 morph is at 66.7%, the -40 morph is at 50%. The more distant a JCM is from the default pose, the more incorrect the distortions will appear in between the default and the target pose. These incorrect distortions are stacking and distorting the geometry in a way that undermines the morphs intended to correct the original distortion caused by the rigging.
I think I need to hold back each JCM until its closest JCM has reached 100% for this to work properly, but I'm not sure how to do this. There was an excellent thread in the Poser Technical Forum describing how this can be achieved for Full Body Morphs, but when I attempted to apply this techinque to my cr2 it had no effect. There might be a different method required for this to work when the morphs are joint-controlled.
Here is an excerpt of my cr2. I would like to hold back targetGeom RshldrSwing-30 until targetGeom RshldrSwing-20 has reached 100%.
targetGeom RshldrSwing-20
{
name RshldrSwing-20
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
rShldr:1
yrot
deltaAddDelta -0.05
indexes 3
numbDeltas 1279
deltas
targetGeom RshldrSwing-30
{
name RshldrSwing-30
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
rShldr:1
yrot
deltaAddDelta -0.0333333
indexes 33
numbDeltas 1279
deltas
In another cr2 I attempted and failed to hold back the second JCM with deltaAddDelta 0.05 included in the slaving code to hold the second morph back until the first morph had reached -0.05. Here's how it looked:-
targetGeom RshldrSwing-30
{
name RshldrSwing-30
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
valueOpDeltaAdd
Figure
rShldr:1
yrot
One
deltaAddDelta 0.05
indexes 33
numbDeltas 1279
interpStyleLocked 0
valueOpDeltaAdd
Figure
rShldr:1
yrot
deltaAddDelta -0.0333333
indexes 33
numbDeltas 1279
deltas
Is there anything wrong with this, aside from it not working? If the code is correct, then the problem might be elsewhere.
Download my free stuff here: http://www.renderosity.com/homepage.php?page=2&userid=323368