Forum Coordinators: RedPhantom
Poser - OFFICIAL F.A.Q (Last Updated: 2024 Nov 20 6:12 am)
off axis rigging angles? like the front forks/wheel of a bike scoot etc?
A word is not the same with one writer as with another. One tears it from his guts. The other pulls it out of his overcoat pocket
Charles Péguy
Heat and animosity, contest and conflict, may sharpen the wits, although they rarely do;they never strengthen the understanding, clear the perspicacity, guide the judgment, or improve the heart
Walter Savage Landor
So is that TTFN or TANSTAAFL?
Sometimes Poser's internal calculations on a joint's xrotate yrotate zrotate angles (e.g. in switching between IK-in and IK-off) need Poser to call inverse trig functions (arcsin etc). Inverse trig functions have multiple answers, and sometimes Poser chooses a wrong answer, and this is shown by distorted joint blending in the affected joint. I wrote a Python script that is called on a prop or a character part, and it does this:-
(1) Add 180 deg to all the angles
(2) Change the sign of the middle angle in rotation order, as found by ((i,j,k),(px,py,pz)) = act.Gimbal()
(3) Normalize all angles to between -180 deg and +180 deg
That has often cured distorted joint blending in my Poser posing work.
...I can see where that actually would be VERY useful, although it's been a while since I've encountered it I've had very meticulous poses basically ruined by what you talk about, or at least very tedious to fix joint by joint. Especially if you can use it on a select few joints...
Have you considered sharing your script work?
<code>
import poser
import string
import os
import sys
#import aasubrs
import math
def spar(ac,pn,v): # set parameter; 999 = leave unchanged
p=ac.ParameterByCode(pn)
if (p!=None) and (v!=999):
p.SetValue(v)
scn = poser.Scene()
act = scn.CurrentActor()
fig = act.ItsFigure()
if fig==None: print "working on ",act.Name();
else: print "working on ",fig.Name(),"'s ",act.Name();
xyz="xyz"
#(x,y,z) = act.AlignmentRotationXYZ()
((i,j,k),(px,py,pz)) = act.Gimbal()
x=px.Value(); y=py.Value(); z=pz.Value();
print "angle rotation order is ",xyz[i],xyz[j],xyz[k]
print "old angles: ",x,y,z," degrees";
x1=x; y1=y; z1=z;
while (x<=-180): x+=360; # normalize angles to between +-180deg
while (y<=-180): y+=360;
while (z<=-180): z+=360;
while (x>180): x-=360;
while (y>180): y-=360;
while (z>180): z-=360;
if(x!=x1) or (y!=y1) or (z!=z1): print "I have normalized the angles to:",x,y,z," degrees";
if j==0: x=-x; # the middle angle in rotation order
elif j==1: y=-y;
elif j==2: z=-z;
x2=x+180;
y2=y+180;
z2=z+180;
x3=x2; y3=y2; z3=z2;
while (x3<=-180): x3+=360; # normalize angles to between +-180deg
while (y3<=-180): y3+=360;
while (z3<=-180): z3+=360;
while (x3>180): x3-=360;
while (y3>180): y3-=360;
while (z3>180): z3-=360;
spar(act,1,x3);
spar(act,2,y3);
spar(act,3,z3);
# print x,y,z;
# print x2,y2,z2;
print "new angles:",x3,y3,z3," degrees";
oldssq=x*x+y*y+z*z;
newssq=x3*x3+y3*y3+z3*z3;
if newssq<oldssq: print "the new angles are better for the joint blending."
else: print "the old angles were better for the joint blending."
print "~~~~~~~~~~~~~~~~~~~~~~~~~~";
poser.ProcessCommand(1559)
scn.DrawAll();
</code>
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.
The method of posing a joint by rotating in x and y and z, that is used in Poser, is called Euler angles: https://en.wikipedia.org/wiki/Euler_angles . It can be proved that if at a joint the rotations are (say) p q r, then, if I add or subtract 180deg to/from all the 3 angles, and then I change the sign of the angle which is in the middle in rotation order, then the positions of the parts linked by the joint stay the same. (But the effects of joint blending will likely change.)