Sat, Nov 30, 12:45 AM CST

Renderosity Forums / Poser - OFFICIAL



Welcome to the Poser - OFFICIAL Forum

Forum Coordinators: RedPhantom

Poser - OFFICIAL F.A.Q (Last Updated: 2024 Nov 29 7:57 am)



Subject: Morph to Joint (Reverse) JCMs?


Angelouscuitry ( ) posted Tue, 31 October 2006 at 10:11 PM · edited Thu, 08 August 2024 at 8:51 AM

I understand that a Joint Controlled Morph will increase in value as the joint it's connected to bends, like it's flexing.  Other than that I do'nt know much about JCMs though.  In fact I'm not even sure which morphs are?  Does David or Michael 2 come with them?  Are they something that needs to be configured, or just turned on?

What I'm wondering is; if we first set all of David's very muscular MTs, and then turn on JCMs, in Reverse, could we then make his joints bend?  I think this would give us a really nice look at what kind of excercises he would have needed to be doing to get his physique?

I'd like to do an animation of a Boy David turning into a Muscular Mature David, and if I could even get in what motion that would be correct by, I think this should be really interesting!


kuroyume0161 ( ) posted Wed, 01 November 2006 at 8:02 AM

JCM is a master-slave control.  The name is something of a misnomer as it should really be called Rotation Controlled Morph.  The valueOp (for slave control) is added to a morph channel in the file.  This valueOp points to one of the rotations of a bodypart.  When the bodypart is rotated (bent), the value of the morph is changed accordingly.  Note that the change does not need to be increased - it can be decreased even (valueOpDeltaAdd -1).

I'm not exactly sure about what you want to do.  Do you want the morph dials to control the bodypart bends?  You could do this, but you would have to edit the file (or use some third-party software that lets you set up master-slave controls) as the JCM settings are one way - the slave dial gets the valueOp section which points to its master dial.

C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, you blow your whole leg off.

 -- Bjarne Stroustrup

Contact Me | Kuroyume's DevelopmentZone


Angelouscuitry ( ) posted Thu, 02 November 2006 at 3:07 AM

Kuroyume0161 - Thank you very much for letting me know this is possible, allowing the Morph Dials to control the Bodypart Bends is exactly what I want to do! 

If you do'nt understand why I'll try to explain....

Joints are stonger(Can bear a greater load) when the are at a 90 degree angle.  So, to assume where a muscle is augemnted so too should the joint(Toward a bent position.)  Granted the natural evelution of a Joint is much slower than a muscle, but still keeping in mind what position a joint would need to have been, alot, to get certain muscles to develop handsomly is some food for thought.

In other words, It would be interesting to know which joints are involved with regard to where I prefer my figures muscles to be a little more advanced.  And the idea of approaching this with a science is really interesting.  When I'm adding muscles to a figure it is always to a static default position, with maybey a little tweaking from pose to pose, but the reality of the Bends/excercise/motion his muscles were formed from actually has nothing to do with th Poser Default Position, or any other Pose I know of for that matter...


kawecki ( ) posted Thu, 02 November 2006 at 6:13 AM · edited Thu, 02 November 2006 at 6:16 AM

You can do it, you need to add with a text editor to the channel of the bend, you have to discover if bend is rotateX, rotateY or rotateZ, usually is rotateX.

 valueOpDeltaAdd
 Figure 20                    (the number of the figure, look at the number BODY:1, BODY:2, BODY:20)
  BODY:20                    (The name of the body part where the morph is located and the figure number)
  MORPH_40                 (the name of the morph that will control the morph)
  deltaAddDelta 1.00   (the scale factor 90.00 or -90.00 to rotate 90 degrees for the morph dial in 1.00)

Put this in the bend channel before the end of channel ( } )

Good luck!

Stupidity also evolves!


kuroyume0161 ( ) posted Thu, 02 November 2006 at 9:43 AM

Not quite there, kawecki:

valueOpDeltaAdd
Figure 20  <-the name of the figure from the 'figure' section
...

I don't quite understand why the figure is even included considering that all of the relevant information is given by the bodypart:figure_number and dial/channel names.  That is enough to make the connection - and this is how my plugin does it (it ignores the figure line).

Remember that the bodypart and channel are the internal names:

actor lShldr:1 <- the is is the internal name
   {
   name Left Shoulder <-not this one
   ...
   }

But (and I will qualify this harshly at Poser's developers) I have seen cases where the 'name' is used instead of the internal name for the dial/channel - and it still works.  Endless fun with that. :)  Best to stick with the internal names as they are guaranteed not to change (the dial 'name' can be changed).

Now, with my interPoser Pro plugin, I've added a list to the 'Parameters' dialog that displays the masters and slaves of the particular dial.  This makes it fairly easy to see what is being affected by or affecting the dial (so you could check to see which morphs come into play when a particular rotation is applied to a body part).  You'd need a Python script in Poser to see these relationships outside of peering into the file itself.

Part of the problem of where I think you are going with this joint/muscle scenario is that you seem to be seeking a non-linear muscle morph over the joint's linear angle of bend.  Not saying that this is not possible - definitely possible.  The deltaAdd is basically linear (addition functions are linear).  There are a set of possible valueOp controls:

   valueOpDeltaAdd
   valueOpDivideInto
   valueOpDivideBy
   valueOpTimes
   valueOpMinus
   valueOpPlus
   LinkParms (this is a pre-valueOp command that goes into the figure section to link two bodypart-dials together)

valueOpDeltaAdd is the most ubiquitous, but VK has explored the others rather completely.  Arc1to4beta is VK's tutorial link on ERC code.

C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, you blow your whole leg off.

 -- Bjarne Stroustrup

Contact Me | Kuroyume's DevelopmentZone


kawecki ( ) posted Thu, 02 November 2006 at 10:37 AM · edited Thu, 02 November 2006 at 10:41 AM

"I don't quite understand why the figure is even included considering that all of the relevant information is given by the bodypart:figure_number and dial/channel names. "

The figure number can be different  of the BODY number in the case when the channel is controlled by other figure, at least is in theory if it works!
The problem is how you know the number of the figure that is the master and which figure is the slave?
Anyway it works for conformed figures, the master dials of the master figure controls the conformed clothes, but you need to load the master first and then the figure to be conformed.

valueOpDeltaAdd
   valueOpDivideInto
   valueOpDivideBy
   valueOpTimes
   valueOpMinus
   valueOpPlus

I don't know what exactly each one does, only what the name tells, but which is the difference between valueOpDeltaAdd and valueOpPlus?, it looks to be the same!
There are many functions inside Poser.exe, but I don't  know how to use or if are functional or only remains of an old Poser., such as curve or bend.

Stupidity also evolves!


kuroyume0161 ( ) posted Thu, 02 November 2006 at 11:19 AM

Yes, I've encountered cases where a 'master' figure is pointed to from a conforming figure for master controls.  Even then, it doesn't matter.  The figure number becomes irrelevant once the figure is loaded - as in Poser assigns numbers irregardless of what is stored in the file.  So, if you load a master figure and then a conforming figure which has dials expecting to be slaved to the master figure, it seems that two conditions will need to be met:

  • The conforming figure must reference a different figure number (in the valueOp) than the one it uses for itself in the file.
  • Poser must choose the figure that is relevant during load.  It may only consider the currently selected figure (?).

In my plugin, my solution is to check the figure number first (is it the same as the figure being imported), the ignore the figure number, then use the selected figure already existing in the document.  The guys who wrote Poser still won't give me all of the source code. ;D

This is the information that I have constructed (with the help of VK!):

Poser ValueOps:

    valueOpDeltaAdd            r =    c + (d * m)
    valueOpPlus                r =    c + m
    valueOpMinus            r =    c - m
    valueOpTimes            r =    c * m
    valueOpDivideBy            r =    c / m    where m != 0
    valueOpDivideInto        r =    m / c    where c != 0
    linkParms                s =    m

    where:

    r =                        result
    c =                        slave dial constant value (value on slider, stored in key)
    m =                        master dial value
    d =                        deltaAddDelta value
    s =                        slave dial value

    Multiple valueOps on a channel are evaluated top to bottom, passing the result along:

    r =    (...((((c op1[m1]) op2[m2]) op3[m3]) op4[m4])...opN[mN])

These are definitely still viable options.  Even linkParms can still be used in the latest versions of Poser.

C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, you blow your whole leg off.

 -- Bjarne Stroustrup

Contact Me | Kuroyume's DevelopmentZone


Angelouscuitry ( ) posted Thu, 02 November 2006 at 12:39 PM

Thank you guys for the technical details!

Befre I attempt this by hand I have a couple questions:

1.)  WIll I need to decide; which morphs effect which joints, in which directions, by which factor, myself?

2.)  Are there any V3, or David figures that already have standard JCM relationships laid out?

🆒


kuroyume0161 ( ) posted Thu, 02 November 2006 at 2:03 PM · edited Thu, 02 November 2006 at 2:04 PM

1.)   Yes, I think you will need to decide these yourself.  Currently, ERC (general term) is more of a programming language than something that can be set in Poser like the Joint Parameters.  There may be an application or two that give you a more graphic way of setting them, but it is difficult to separate them out from regular content (etc.) in the MP.  I couldn't find any quickly.  PBooost II "Deep File Editor" says it can do it, but is it graphical or just textual?

2.)   Almost all of the DAZ figures have either bend-type JCMs or corrective JCMs (morphs to correct earlier flubs, one might say).  You can certainly use these as examples in your learning and development process.

C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, you blow your whole leg off.

 -- Bjarne Stroustrup

Contact Me | Kuroyume's DevelopmentZone


kawecki ( ) posted Thu, 02 November 2006 at 6:12 PM

I think that I've discovered the secret of the figure numbers, it is the way how Poser works.
Poser was created as a scripting 3d application like PovRay, I have no idea how Poser 1 was.
The figure number is used for one figure control another one and we can create complex machines if we write the script by hand (pz3, cr2, etc).
The problem began when was added the GUI interface, now Poser not only has to read one script, he has to read many and all the user input in the graphic interface and create a big script that will be used to rencer/preview the scene.
Th GUI has some bugs as the crosstalk, but it you write by hand the cr2 or pz3 for all the figures will not be crosstalk, the bug is created by the GUI that puts the wrong figure number in the script.
This opens a new Universe, with an external application you can create very complex machines and Poser only will need to load the complex cr2.

Another interesting thing is that with valueOpTimes you can create non linear functions using a polynomical expansion, probably splines used by Poser are created in this way.
With valueOpDivideBy  and  valueOpDivideInto you can have rational functions and of course NURBS too!
Only remains if exist a way to store a temporary variable with some script instruction, anyway you can always use a fake hidden channel to store temporary variables.

Stupidity also evolves!


kawecki ( ) posted Thu, 02 November 2006 at 6:52 PM · edited Thu, 02 November 2006 at 6:59 PM

Despite the success of Poser, Poser was something that always had bad luck.
It's amazing to see how many times passed from one hand to another, one company purchased and a little later sold it again, nobody wanted it!
I have no idea who wrote Poser and created its structure, beside the graphic interface and better meshes, most of all the functions exist before Poser 0 and only the guy that created Poser knows which are and what they do. For the companies only remains what exist in the documentation and for us, what we can discover.
I don't remember who discovered the ERC and JCM, it was a great discovering and nobody knew that this existed before, but the guy who created Poser knew it very well, if he hasn't known it he would never have created the instruction DeltaAddDelta.

Stupidity also evolves!


kuroyume0161 ( ) posted Thu, 02 November 2006 at 6:58 PM

Larry Weinberg is the ultimate creator of Poser.  Of course, Kai's interface is the one adopted by Poser.  It was then owned by MetaCreations.  And we know the story from there. :)

C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, you blow your whole leg off.

 -- Bjarne Stroustrup

Contact Me | Kuroyume's DevelopmentZone


kawecki ( ) posted Thu, 02 November 2006 at 7:04 PM

I only know  the history from Metacreations and what appears in Metacreation Poser screen, but the origen of Poser is lost in time.

Stupidity also evolves!


Angelouscuitry ( ) posted Thu, 02 November 2006 at 11:06 PM

kawecki - In the Poser 6 Help > Links menu there is a link to site called "Ghost"...something...or/and something...this is the Creator of Poser's Web Page!

Anybody interested in adding some Reverse JCMs to V3 with me?


elenorcoli ( ) posted Sat, 04 November 2006 at 12:52 AM

i am working on that right now in fact.  good thread.  give me a shout whenever, sounds fun

 


Angelouscuitry ( ) posted Sat, 04 November 2006 at 4:15 AM

I wonder where to start? 

My first intuition is to test some of the current Bend to Morph flex value relationtionships. 

I use V3 alot, but I've never noticed her bicept flex when I bend her elbow? 


kuroyume0161 ( ) posted Sat, 04 November 2006 at 10:24 AM · edited Sat, 04 November 2006 at 10:26 AM

V3 does have a Bicep Flex morph.  You have to 'inject' these though.

Check out the morph dials on V3's left and right shoulder body parts afterwards.  And their slaved to boot - Ah, but their slaved to a PBM and not the bend of the forearm.  This would give you a place to start for certain! :)

C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, you blow your whole leg off.

 -- Bjarne Stroustrup

Contact Me | Kuroyume's DevelopmentZone


Jim Burton ( ) posted Sat, 04 November 2006 at 2:59 PM

Quote - I don't remember who discovered the ERC and JCM, it was a great discovering and nobody knew that this existed before, but the guy who created Poser knew it very well, if he hasn't known it he would never have created the instruction DeltaAddDelta.

Nerd and rbtwhiz.  The code is what make Full Body morphs run, of course.

 


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.