Fri, Jan 24, 5:02 PM CST

Renderosity Forums / Poser - OFFICIAL



Welcome to the Poser - OFFICIAL Forum

Forum Coordinators: RedPhantom

Poser - OFFICIAL F.A.Q (Last Updated: 2025 Jan 24 4:20 pm)



Subject: How do you hold back stacked JCMs in the cr2?


Paloth ( ) posted Sat, 02 April 2011 at 12:31 AM · edited Thu, 16 January 2025 at 9:52 AM

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


ockham ( ) posted Sat, 02 April 2011 at 6:36 AM

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


Paloth ( ) posted Sat, 02 April 2011 at 11:32 AM

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


lesbentley ( ) posted Sat, 02 April 2011 at 5:26 PM · edited Sat, 02 April 2011 at 5:28 PM

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°.


lesbentley ( ) posted Sat, 02 April 2011 at 5:48 PM · edited Sat, 02 April 2011 at 5:49 PM

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.


amy_aimei ( ) posted Sat, 02 April 2011 at 8:40 PM

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. 


Paloth ( ) posted Sat, 02 April 2011 at 10:49 PM

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


Paloth ( ) posted Sat, 02 April 2011 at 11:18 PM

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


lesbentley ( ) posted Sun, 03 April 2011 at 1:22 AM

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.


lesbentley ( ) posted Sun, 03 April 2011 at 1:29 AM

amy_aimei,

Just read your email. Have not had a chance to check the attached file yet. I will try to give you some feedback soon.


Paloth ( ) posted Sun, 03 April 2011 at 10:14 PM · edited Sun, 03 April 2011 at 10:16 PM

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


Paloth ( ) posted Sun, 03 April 2011 at 10:59 PM

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


amy_aimei ( ) posted Mon, 04 April 2011 at 12:53 AM

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
                        }


Paloth ( ) posted Mon, 04 April 2011 at 12:04 PM

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&amp;userid=323368


amy_aimei ( ) posted Sat, 09 April 2011 at 8:32 PM

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.


Paloth ( ) posted Wed, 13 April 2011 at 11:25 PM

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&amp;userid=323368


Paloth ( ) posted Fri, 24 June 2011 at 12:24 PM

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&amp;userid=323368


Paloth ( ) posted Fri, 24 June 2011 at 1:43 PM

I just figured it out. But can I explain it..?

Download my free stuff here: http://www.renderosity.com/homepage.php?page=2&amp;userid=323368


Paloth ( ) posted Sat, 25 June 2011 at 1:07 AM

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&amp;userid=323368


Privacy Notice

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.