forked from bartvdbraak/blender
Bugfix #20971: IK Joints Inexplicably Stiff In Recent Blender 2.5 Builds
- IK-Solver interfaces were still converting units from degrees to radians. Made these all use radians now. - Tried to fix the DOF limits drawing. This is still not totally functional again yet, but at least there are visible lines now.
This commit is contained in:
parent
5affc83eb2
commit
29a6465ed4
@ -368,21 +368,21 @@ void IK_QSphericalSegment::SetLimit(int axis, MT_Scalar lmin, MT_Scalar lmax)
|
||||
return;
|
||||
|
||||
if (axis == 1) {
|
||||
lmin = MT_clamp(lmin, -180, 180);
|
||||
lmax = MT_clamp(lmax, -180, 180);
|
||||
lmin = MT_clamp(lmin, -M_PI, M_PI);
|
||||
lmax = MT_clamp(lmax, -M_PI, M_PI);
|
||||
|
||||
m_min_y = MT_radians(lmin);
|
||||
m_max_y = MT_radians(lmax);
|
||||
m_min_y = lmin;
|
||||
m_max_y = lmax;
|
||||
|
||||
m_limit_y = true;
|
||||
}
|
||||
else {
|
||||
// clamp and convert to axis angle parameters
|
||||
lmin = MT_clamp(lmin, -180, 180);
|
||||
lmax = MT_clamp(lmax, -180, 180);
|
||||
lmin = MT_clamp(lmin, -M_PI, M_PI);
|
||||
lmax = MT_clamp(lmax, -M_PI, M_PI);
|
||||
|
||||
lmin = sin(MT_radians(lmin)*0.5);
|
||||
lmax = sin(MT_radians(lmax)*0.5);
|
||||
lmin = sin(lmin*0.5);
|
||||
lmax = sin(lmax*0.5);
|
||||
|
||||
if (axis == 0) {
|
||||
m_min[0] = -lmax;
|
||||
@ -611,11 +611,11 @@ void IK_QRevoluteSegment::SetLimit(int axis, MT_Scalar lmin, MT_Scalar lmax)
|
||||
return;
|
||||
|
||||
// clamp and convert to axis angle parameters
|
||||
lmin = MT_clamp(lmin, -180, 180);
|
||||
lmax = MT_clamp(lmax, -180, 180);
|
||||
lmin = MT_clamp(lmin, -M_PI, M_PI);
|
||||
lmax = MT_clamp(lmax, -M_PI, M_PI);
|
||||
|
||||
m_min = MT_radians(lmin);
|
||||
m_max = MT_radians(lmax);
|
||||
m_min = lmin;
|
||||
m_max = lmax;
|
||||
|
||||
m_limit = true;
|
||||
}
|
||||
@ -750,11 +750,11 @@ void IK_QSwingSegment::SetLimit(int axis, MT_Scalar lmin, MT_Scalar lmax)
|
||||
return;
|
||||
|
||||
// clamp and convert to axis angle parameters
|
||||
lmin = MT_clamp(lmin, -180, 180);
|
||||
lmax = MT_clamp(lmax, -180, 180);
|
||||
lmin = MT_clamp(lmin, -M_PI, M_PI);
|
||||
lmax = MT_clamp(lmax, -M_PI, M_PI);
|
||||
|
||||
lmin = sin(MT_radians(lmin)*0.5);
|
||||
lmax = sin(MT_radians(lmax)*0.5);
|
||||
lmin = sin(lmin*0.5);
|
||||
lmax = sin(lmax*0.5);
|
||||
|
||||
// put center of ellispe in the middle between min and max
|
||||
MT_Scalar offset = 0.5*(lmin + lmax);
|
||||
@ -896,11 +896,11 @@ void IK_QElbowSegment::SetLimit(int axis, MT_Scalar lmin, MT_Scalar lmax)
|
||||
return;
|
||||
|
||||
// clamp and convert to axis angle parameters
|
||||
lmin = MT_clamp(lmin, -180, 180);
|
||||
lmax = MT_clamp(lmax, -180, 180);
|
||||
lmin = MT_clamp(lmin, -M_PI, M_PI);
|
||||
lmax = MT_clamp(lmax, -M_PI, M_PI);
|
||||
|
||||
lmin = MT_radians(lmin);
|
||||
lmax = MT_radians(lmax);
|
||||
lmin = lmin;
|
||||
lmax = lmax;
|
||||
|
||||
if (axis == 1) {
|
||||
m_min_twist = lmin;
|
||||
|
@ -1479,8 +1479,8 @@ static void draw_pose_dofs(Object *ob)
|
||||
float amin[3], amax[3];
|
||||
|
||||
for (i=0; i<3; i++) {
|
||||
amin[i]= (float)sin(pchan->limitmin[i]*M_PI/360.0);
|
||||
amax[i]= (float)sin(pchan->limitmax[i]*M_PI/360.0);
|
||||
amin[i]= (float)sin(pchan->limitmin[i]);
|
||||
amax[i]= (float)sin(pchan->limitmax[i]);
|
||||
}
|
||||
|
||||
glScalef(1.0f, -1.0f, 1.0f);
|
||||
@ -1498,7 +1498,7 @@ static void draw_pose_dofs(Object *ob)
|
||||
|
||||
/* arcs */
|
||||
if (pchan->ikflag & BONE_IK_ZLIMIT) {
|
||||
theta= 0.5f*(pchan->limitmin[2]+pchan->limitmax[2]);
|
||||
theta= 0.5f*(pchan->limitmin[2]+pchan->limitmax[2]) * (float)(180.0f/M_PI);
|
||||
glRotatef(theta, 0.0f, 0.0f, 1.0f);
|
||||
|
||||
glColor3ub(50, 50, 255); // blue, Z axis limit
|
||||
@ -1506,7 +1506,7 @@ static void draw_pose_dofs(Object *ob)
|
||||
for (a=-16; a<=16; a++) {
|
||||
float fac= ((float)a)/16.0f;
|
||||
|
||||
phi= fac * (float)(M_PI/360.0f) * (pchan->limitmax[2] - pchan->limitmin[2]);
|
||||
phi= fac * (pchan->limitmax[2] - pchan->limitmin[2]);
|
||||
|
||||
i= (a == -16) ? 0 : 1;
|
||||
corner[i][0]= (float)sin(phi);
|
||||
@ -1520,14 +1520,14 @@ static void draw_pose_dofs(Object *ob)
|
||||
}
|
||||
|
||||
if (pchan->ikflag & BONE_IK_XLIMIT) {
|
||||
theta= 0.5f * (pchan->limitmin[0] + pchan->limitmax[0]);
|
||||
theta= 0.5f * (pchan->limitmin[0] + pchan->limitmax[0]) * (float)(180.0f/M_PI);
|
||||
glRotatef(theta, 1.0f, 0.0f, 0.0f);
|
||||
|
||||
glColor3ub(255, 50, 50); // Red, X axis limit
|
||||
glBegin(GL_LINE_STRIP);
|
||||
for (a=-16; a<=16; a++) {
|
||||
float fac= ((float)a)/16.0f;
|
||||
phi= (float)(0.5*M_PI) + fac * (float)(M_PI/360.0f) * (pchan->limitmax[0] - pchan->limitmin[0]);
|
||||
phi= (float)(0.5*M_PI) + fac * (pchan->limitmax[0] - pchan->limitmin[0]);
|
||||
|
||||
i= (a == -16) ? 2 : 3;
|
||||
corner[i][0]= 0.0f;
|
||||
|
Loading…
Reference in New Issue
Block a user