Forum Coordinators: RedPhantom
Poser - OFFICIAL F.A.Q (Last Updated: 2024 Nov 21 6:06 am)
Assuming that your ERC code is correct, you need to remember that your second and third JCM are added on top of the ones already in effect. So for things to work correctly, you'll have to subtract your first morph from the second and the original second from the third.
Alternatively, if you use DAZ Studio's MorphLoaderPro plugin, you just set up your first morph with limits in place, then load the second one on top of that, set the limits again and subtract the appropriate constant value, then do the same with the third morph.
I can give more detail if necessary, but it wouldn't make much sense without knowing your workflow.
-- I'm not mad at you, just Westphalian.
Also, in P8 you can use the Dependent Parameters feature to set up the
exact sequence of motion rather painlessly, without math. The resulting CR2 will work
in both P7 and P8.
My python page
My ShareCG freebies
OK ... I've created 2 JCMS at this point. Something is wrong.
I'm using DS Figure Setup Tools: Morph Loader Pro. What happens is that there are some polys that now get distorted until the joint bends to negative 70 degrees. Not all of them.
I've tried adding the JCMs several times to make sure that I followed the most important steps:
Any advice is much appreciated.
I don't know what the ERC freeze does. I don't use it. Reverse Deformation = Yes is of course essential, though.
Here's how I'd set things up:
0) Create a channel "One" in the body actor which has the constant value 1 (d'oh!).
1) Load JCM1 and set to 100% at -40 degrees.
2) Set limits for JCM1 to 0 and 1 and enable limits.
3) Load JCM2 to reach 100% at -30 degrees (which is the difference between -40 and -70). That means "CustomValue" will be 1 / -30 = -0.033333.
4) Set limits for JCM2 to 0 and 1 and enable limits.
5) Now you need to slave JCM2 to the One channel with a deltaAddDelta value that makes it 0 at -40 degrees, or in other words -(-40 / -30) = -4/3 = -1.33333. Do that for all the actors that JCM2 is meant to affect.
That's all. Rinse and repeat.
PS: You can see a setup like that in action in Antonia's knees. Just follow the link in my signature.
-- I'm not mad at you, just Westphalian.
OK, it's still not quite working for me. Here is what I have set up:
hip
targetGeom JCMlThbendFwd
{
name JCMlThbendFwd
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
lThigh:1
xrot
deltaAddDelta -0.025
indexes 140
numbDeltas 10862
deltas ...
targetGeom JCMlThbendFwd2
{
name JCMlThbendFwd2
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpMinus
Figure
lThigh:1
JCMlThbendFwd
valueOpDeltaAdd
Figure
lThigh:1
xrot
deltaAddDelta -0.033333
indexes 246
numbDeltas 10862
deltas ...
targetGeom JCMlThbendFwd3
{
name JCMlThbendFwd3
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpMinus
Figure
lThigh:1
JCMlThbendFwd
valueOpMinus
Figure
lThigh:1
JCMlThbendFwd2
valueOpDeltaAdd
Figure
lThigh:1
xrot
deltaAddDelta -0.0333333
indexes 237
numbDeltas 10862
deltas ...
lThigh
targetGeom JCMlThbendFwd
{
name JCMlThbendFwd
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
lThigh:1
xrot
deltaAddDelta -0.025
indexes 345
numbDeltas 4518
deltas ...
targetGeom JCMlThbendFwd2
{
name JCMlThbendFwd2
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpMinus
Figure
lThigh:1
JCMlThbendFwd
valueOpDeltaAdd
Figure
lThigh:1
xrot
deltaAddDelta -0.03333
indexes 1195
numbDeltas 4518
deltas ...
targetGeom JCMlThbendFwd3
{
name JCMlThbendFwd3
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpMinus
Figure
lThigh:1
JCMlThbendFwd
valueOpMinus
Figure
lThigh:1
JCMlThbendFwd2
valueOpDeltaAdd
Figure
lThigh:1
xrot
deltaAddDelta -0.03333
indexes 1349
numbDeltas 4518
deltas ...
JCMlThBendFwd goes from 0 to -40
JCMlThBendFwd2 goes from -40 to -70
JCMlThBendFwd3 goes from -70 to -100
However,
When I bend the joint to -40 degrees, the JCMs read:
lThigh
JCMlThBendFwd 100%
JCMlThBendFwd2 33.33%
hip
JCMlThBendFwd 100%
JCMlThBendFwd2 33.33%
JCMlThBendFwd3 0.013%
Channing3D: Yes, that's what I'd expect to happen. At -40 degrees, the value of JCMlThBendFwd is 1, so the effective value of JCMlThBendFwd2 given your setup is -40 * -0.03333 - 1 = 1.3333 - 1 = 0.3333. Since JCMlThBendFwd2 reacts faster to the bending of the thigh - one third faster, to be precise - subtracting the value of JCMlThBendFwd from it is not enough. You have to subtract it with the factor 1.3333.
Otherwise, doing arithmetic with the existing channels instead of the extra channel in the body actor that I suggested is not a bad idea. It becomes tedious though as soon as you use more than two or three JCM stages.
-- I'm not mad at you, just Westphalian.
OK, so
body
valueParm One
{
name One
initValue 1
hidden 0
forceLimits 1
min 1
max 1
trackingScale 0.01
keys
{
static 0
k 0 1
}
interpStyleLocked 0
}
hip
}
name JCMlThbendFwd2
initValue -0.03333
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
BODY
One
deltaAddDelta -1.033333
indexes 246
numbDeltas 10862
deltas ...
I don't think that is right. What is the "CustomValue" and where is it located in the cr2 code?
The "CustomValue" is what Poser calls "deltaAddDelta". But that last version you posted is confused. Where did the dependence on xrot go?
I'll go back to the code you posted before and tell you how you can fix it, because that's closer to working.
Wherever you have this:
valueOpMinus<br></br>
Figure<br></br>
lThigh:1<br></br>
JCMlThbendFwd<br></br><br></br>
instead use this:
valueOpDeltaAdd<br></br>
Figure<br></br>
lThigh:1<br></br>
JCMlThbendFwd<br></br>
deltaAddDelta -1.33333<br></br>
That should do the trick.
-- I'm not mad at you, just Westphalian.
name JCMlThbendFwd2
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
lThigh:1
JCMlThbendFwd
deltaAddDelta -1.33333
valueOpDeltaAdd
Figure
lThigh:1
xrot
deltaAddDelta -0.03333
indexes 1195
numbDeltas 4518
deltas ...
but where do I use the valueParm One?
OK, I'm still doing something wrong ... here's the code now.
hip:1
targetGeom JCMlThbendFwd2
{
name JCMlThbendFwd2
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
lThigh:1
JCMlThBendFwd
deltaAddDelta -1.33333
valueOpDeltaAdd
Figure
lThigh:1
xrot
deltaAddDelta -0.03333
indexes 246
numbDeltas 10862
deltas ...
lThigh:1
targetGeom JCMlThbendFwd2
{
name JCMlThbendFwd2
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
lThigh:1
JCMlThbendFwd
deltaAddDelta -1.33333
valueOpDeltaAdd
Figure
lThigh:1
xrot
deltaAddDelta -0.03333
indexes 1195
numbDeltas 4518
deltas ...
At -40 degrees:
lThigh
JCMThBendFwd: 100%
JCMThBendFwd3: 33.3%
hip
JCMthBendFwd:100%
JCMThBendFwd2: 100%
JCMThBendFwd3: 33.3%
OK. Got it. Here's the code that works:
targetGeom JCMrThbendFwd
{
name JCMrThbendFwd
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
rThigh:1
xrot
deltaAddDelta -0.025
indexes 471
numbDeltas 4462
deltas ...
}
targetGeom JCMrThbendFwd2
{
name JCMrThbendFwd2
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
rThigh:1
JCMrThbendFwd
deltaAddDelta -1.33
valueOpDeltaAdd
Figure
rThigh:1
xrot
deltaAddDelta -0.033333
indexes 946
numbDeltas 4462
deltas ...
}
targetGeom JCMrThbendFwd3
{
name JCMrThbendFwd3
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
rThigh:1
JCMrThbendFwd
deltaAddDelta -1.33
valueOpDeltaAdd
Figure
rThigh:1
JCMrThbendFwd2
deltaAddDelta -1
valueOpDeltaAdd
Figure
rThigh:1
xrot
deltaAddDelta -0.033333
indexes 1542
numbDeltas 4462
deltas ...
}
THANK YOU!!!!
Yes, I'm pretty sure there are ways. But it's complicated, and so far I've been avoiding that kind of thing. One other thing you could try, although it's tedious as well and might not always work, is to make an additional JCM for that pose and apply it at half strength to both channels on top of the existing JCMs.
-- I'm not mad at you, just Westphalian.
Is that the dependent parameters from Poser 8? I've got it, but I'm sorry to say I haven't installed it. Would it be able to deal with a JCM that only activates as there is both xrot and zrot positive values?
In other words, if zrot is at -15 degrees and xrot is at -100 degrees, then JCM_X is at 100%.
Quote - This tool might be a little easier:
Add something that works like MorphLoaderPro, only without all the bugs and other annoyances, and you have a winner.
Also, it would be very neat to be able to back-port ERC setups for P7/P8 so that they work with older versions of Poser and also with other software that can load Poser files but doesn't yet support its latest extensions.
-- I'm not mad at you, just Westphalian.
OK. Installed Poser 8. WOW. I really love the new interface. I'm looking over the manual, and I think I have a vague idea of how this could work.
So, I did create the JCMs for both thighs to deal with the pokethrough. Is it possible to set up a dependency where both zrot and xrot have to be active to cause the JCM to activate? In my mind, I would think of that as 2 masters with one slave. Which I know is impossible, so there has to be some other way of making it work.
Quote - OK. Installed Poser 8. WOW. I really love the new interface. I'm looking over the manual, and I think I have a vague idea of how this could work.
So, I did create the JCMs for both thighs to deal with the pokethrough. Is it possible to set up a dependency where both zrot and xrot have to be active to cause the JCM to activate? In my mind, I would think of that as 2 masters with one slave. Which I know is impossible, so there has to be some other way of making it work.
I think your idea of using ValueOpTimes should work.
-- I'm not mad at you, just Westphalian.
Alright, I just don't know how to use Dependent Parameters to set that up. LOL.
A new problem has come up. This doesn't occur in DS. In Poser, a single point refuses to move on the left thigh whether I move the thigh forwards or backwards. However, if I break all the links to the JCMs, the problem goes away. This only happens on the left thigh, not the right. ????
BUMP.
Alright, the issue with the single point that wouldn't move is solved. In the most odd way I could imagine. With some invaluable help, I checked the innermatsphere on the lthigh. By adjusting its yscale value upwards by .3%, the point problem disappeared. I'm just glad it worked, and I learned something new.
As far as dealing with my new issue, I've gotten this far. I've created a JCM for the pokethrough that occurs when rotating inwards on the z axis and upwards on the x axis in the thigh. Now, to control the JCM, I figure on making a channel that is controlled by both the xrot and zrot values in the thigh, such that the value of the xrot and zrot are converted to a number between zero and 1, then multipled together to give a master value of zero to 1. Multiplying that against the value of the JCM should control the value from 0 to 1.
Now, to see if my ideas work!
OK, now I've gotten the JCM to work partially. However, I need to know some method to prevent "negative" values from affecting the JCM.
targetGeom JCMlThBdSdSdIn
{
name JCMlThBdSdSdIn
initValue 1
hidden 0
forceLimits 4
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 1
}
interpStyleLocked 0
valueOpTimes
Figure
lThigh
LeftSideIn
valueOpTimes
Figure
lThigh
LeftBendFwd
indexes 595
numbDeltas 4518
deltas ...
blendType 0
}
targetGeom LeftSideIn
{
name LeftSideIn
initValue 0
hidden 0
forcelimits 4
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
lThigh
zrot
deltaAddDelta -0.06667
}
targetGeom LeftBendFwd
{
name LeftBendFwd
initValue 0
hidden 0
forcelimits 4
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
lThigh
xrot
deltaAddDelta -0.01
}
Does anyone have a suggestion for altering these existing channels to only return values for 0 to -15 degrees on the zrotation and 0 to -100 degrees on the xrotation?
Just set the limits for the LeftSideIn and LeftBendFwd channels to the appropriate values. From what I understand about ERC, the limits are applied after the 'raw' value for a channel is calculated, and then the value after applying the limits is used in all further dependent channels.
-- I'm not mad at you, just Westphalian.
So,
If I understand right,
since zrot on the thigh is from -15 to 75 degrees, or 90 degrees total, then the minimum of 0 for LeftSideIn equal -15 degrees, and 1 equals 90 degrees? So, since I want the channel to only report from -15 degrees to 0 degrees, then I can set the limits for LeftSideIn to 0 to .16667?
Actually, I've looked at your setup again, and now I'm not quite sure anymore what you're trying to do. With the deltaAddDelta set to -0.06667 as you have it, LeftSideIn channel should be 0 for xrot = 0 and at 1 for zrot = -15. You are setting the limits to 0 and 1, which should give you what I thought you wanted: the channel stays at 0 for any zrot values larger than 0 and at 1 for any zrot values smaller than -15. So what is not working?
-- I'm not mad at you, just Westphalian.
Quote - I'm working on it more ... and what I'm finding is that for some reason those limits of 0 to 1 were not being respected in DS. So, once I changed forcelimits from 4 to 1, it worked like you are describing.
Good to know! I can never quite remember what that 4 is supposed to do.
-- I'm not mad at you, just Westphalian.
I still need to test that in Poser though ... I thought the 4 was to absolutely protect against the user removing limits ...
So, it does work now with that change from forcelimits 4 to forcelimits 1. Working on this though I've discovered pokethrough at the other extremes of xrot/zrot combinations, so since I figured this out, might as well do the same for those! :lol:
OK, now I have all JCMs, including the multi-joint controlled JCMs. New problem. Because this is clothing, once it's conformed, the multi-joint controlled JCMS no longer activated because they depend on joint rotation IN THE CLOTHING. Does anyone have suggestions for having these JCMS activate based on the joint rotation of V4, rather than the clothing itself?
I think that I may need to revise the channel setup, but I'm not sure ... I wonder if the problem is that the control goes xrot-->Intermediate channel (returns a value of 0 to 1) and zrot--> intermediate channel (returns a value of 0 to 1). Then the JCM is at a value 1 multiplied against both of the intermediate channel values. Works perfectly when I just rotate the clothing itself.
I'm working on the FBMs now, so I can set aside this issue for the moment.
Figured it out. The k 0 1 line had been altered to k 0 0, which inactivated the JCM.
So the final code is:
targetGeom RightSideIn
{
name RightSideIn
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
rThigh
zrot
deltaAddDelta 0.06667
indexes 0
numbDeltas 0
deltas
{
}
}
targetGeom RightBendFwd
{
name RightBendFwd
initValue 0
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 0
}
interpStyleLocked 0
valueOpDeltaAdd
Figure
rThigh
xrot
deltaAddDelta -0.01
indexes 0
numbDeltas 0
deltas
{
}
}
targetGeom JCMrThBdSdSdIn
{
name JCMrThBdSdSdIn
initValue 1
hidden 0
forceLimits 1
min 0
max 1
trackingScale 0.01
keys
{
static 0
k 0 1
}
interpStyleLocked 0
valueOpTimes
Figure
rThigh
RightSideIn
valueOpTimes
Figure
rThigh
RightBendFwd
indexes 501
numbDeltas 4462
deltas
{
}
}
So, what this does is:
<br></br><br></br><br></br>
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'm working to smooth the polygons in a piece of conforming clothing as V4's thigh bends forward. I am having troubles getting the results I want with a single JCM.
I looked around in some other cr2s and noticed a multi-JCM setup, but I wasn't quite sure how it was devised. As the joint rotates, there are three JCMs activated. The first reaches 100% at about 40 degrees and stays there. The second reaches 100% at about 70 degrees. The third and final JCM reaches 100% at 100 degrees.
My question is if I need to start over and create them in order. I had created my JCM to reach 100% at 100 degrees which would be the third in a series. I tried a test JCM for 40 degrees, but when I use them together, there are now distortions.