diff options
author | Joshua Leung <aligorith@gmail.com> | 2010-02-06 01:03:19 +0300 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2010-02-06 01:03:19 +0300 |
commit | 29a6465ed4e08e4bdf1bc53bace2be1774d6fd38 (patch) | |
tree | e5e8a58649894056d789698998859af41bead58d | |
parent | 5affc83eb2ab59b5946a34a7ed40c014861599c6 (diff) |
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.
-rw-r--r-- | intern/iksolver/intern/IK_QSegment.cpp | 40 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/drawarmature.c | 12 |
2 files changed, 26 insertions, 26 deletions
diff --git a/intern/iksolver/intern/IK_QSegment.cpp b/intern/iksolver/intern/IK_QSegment.cpp index c52f1e596b9..b84f11a03e2 100644 --- a/intern/iksolver/intern/IK_QSegment.cpp +++ b/intern/iksolver/intern/IK_QSegment.cpp @@ -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; diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c index fd6d2d36b63..9e5d20fca7f 100644 --- a/source/blender/editors/space_view3d/drawarmature.c +++ b/source/blender/editors/space_view3d/drawarmature.c @@ -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; |