Revision: 20874 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20874 Author: ben2610 Date: 2009-06-14 15:50:34 +0200 (Sun, 14 Jun 2009)
Log Message: ----------- iTaSC: joint limit taken into account in automatic timestep adjustement. Modified Paths: -------------- branches/ge_dev/intern/itasc/Armature.cpp branches/ge_dev/intern/itasc/Scene.cpp branches/ge_dev/source/blender/ikplugin/intern/itasc_plugin.cpp Modified: branches/ge_dev/intern/itasc/Armature.cpp =================================================================== --- branches/ge_dev/intern/itasc/Armature.cpp 2009-06-14 12:53:47 UTC (rev 20873) +++ branches/ge_dev/intern/itasc/Armature.cpp 2009-06-14 13:50:34 UTC (rev 20874) @@ -496,8 +496,45 @@ // then search through the joint limit for (JointConstraintList::const_iterator it=m_constraints.begin(); it != m_constraints.end(); it++) { JointConstraint_struct* cs = *it; - - + if (cs->function == JointLimitCallback) { + // this is a joint limit constraint, + LimitConstraintParam_struct* pLimit = (LimitConstraintParam_struct*)cs->param; + double qdot = m_qdot(cs->segment->second.q_nr); + if (fabs(qdot) > KDL::epsilon) { + double q = m_qKdl(cs->segment->second.q_nr); + double dq = qdot*timestep; + double newq = q+dq; + double alpha = cs->values.alpha; + double newalpha; + if (q > pLimit->maxThreshold || q < pLimit->minThreshold || + newq > pLimit->maxThreshold || newq < pLimit->minThreshold) { + if (q > pLimit->maxThreshold) { + if (q < pLimit->max || dq < 0.0) { + newalpha = (alpha>2.0)?(alpha*((dq>0.0)?1.5:0.666)):(alpha+((dq>0.0)?1.0:-1.0)); + if (newalpha > 0.0) + newq = pLimit->max-pLimit->threshold*(pLimit->maxWeight-newalpha)/(newalpha*pLimit->slope+pLimit->maxWeight); + } + } else if (q < pLimit->minThreshold) { + if (q > pLimit->min || dq > 0.0) { + newalpha = (alpha>2.0)?(alpha*((dq<0.0)?1.5:0.666)):(alpha+((dq<0.0)?1.0:-1.0)); + if (newalpha > 0.0) + newq = pLimit->min+pLimit->threshold*(pLimit->maxWeight-newalpha)/(newalpha*pLimit->slope+pLimit->maxWeight); + } + } else if (newq > pLimit->maxThreshold) { + newalpha = 1.0; + newq = pLimit->max-pLimit->threshold*(pLimit->maxWeight-newalpha)/(newalpha*pLimit->slope+pLimit->maxWeight); + } else { + newalpha = 1.0; + newq = pLimit->min+pLimit->threshold*(pLimit->maxWeight-newalpha)/(newalpha*pLimit->slope+pLimit->maxWeight); + } + double newdq = fabs(newq-q); + dq = fabs(dq); + if (newdq < dq) { + timestep *= newdq/dq; + } + } + } + } } return timestep; } Modified: branches/ge_dev/intern/itasc/Scene.cpp =================================================================== --- branches/ge_dev/intern/itasc/Scene.cpp 2009-06-14 12:53:47 UTC (rev 20873) +++ branches/ge_dev/intern/itasc/Scene.cpp 2009-06-14 13:50:34 UTC (rev 20874) @@ -397,7 +397,7 @@ ConstraintSet_struct* cs = it->second; cs->task->getMaxTimestep(timesubstep); } - // use substep that are dividers of timestep for more regularity + // use substep that are even dividers of timestep for more regularity maxsubstep = 2.0*floor(timestep/2.0/timesubstep-0.66666); timesubstep = (maxsubstep < 0.0) ? timestep : timestep/(2.0+maxsubstep); if (timesubstep >= timeleft-(m_minstep/2.0)) { Modified: branches/ge_dev/source/blender/ikplugin/intern/itasc_plugin.cpp =================================================================== --- branches/ge_dev/source/blender/ikplugin/intern/itasc_plugin.cpp 2009-06-14 12:53:47 UTC (rev 20873) +++ branches/ge_dev/source/blender/ikplugin/intern/itasc_plugin.cpp 2009-06-14 13:50:34 UTC (rev 20874) @@ -692,19 +692,19 @@ if ((flag & IK_XDOF) && (pchan->ikflag & BONE_IK_XLIMIT)) { joint = bone->name; joint += ":RX"; - if (arm->addLimitConstraint(joint, KDL::deg2rad*pchan->limitmin[0], KDL::deg2rad*pchan->limitmax[0], KDL::deg2rad*5.0, 10.0, 2.0) < 0) + if (arm->addLimitConstraint(joint, pchan->limitmin[0], pchan->limitmax[0], 5.0, 50.0, 5.0) < 0) break; } if ((flag & IK_YDOF) && (pchan->ikflag & BONE_IK_YLIMIT)) { joint = bone->name; joint += ":RY"; - if (arm->addLimitConstraint(joint, KDL::deg2rad*pchan->limitmin[1], KDL::deg2rad*pchan->limitmax[1], KDL::deg2rad*5.0, 10.0, 2.0) < 0) + if (arm->addLimitConstraint(joint, pchan->limitmin[1], pchan->limitmax[1], 5.0, 50.0, 5.0) < 0) break; } if ((flag & IK_ZDOF) && (pchan->ikflag & BONE_IK_ZLIMIT)) { joint = bone->name; joint += ":RZ"; - if (arm->addLimitConstraint(joint, KDL::deg2rad*pchan->limitmin[2], KDL::deg2rad*pchan->limitmax[2], KDL::deg2rad*5.0, 10.0, 2.0) < 0) + if (arm->addLimitConstraint(joint, pchan->limitmin[2], pchan->limitmax[2], 5.0, 50.0, 5.0) < 0) break; } // no error, so restore _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs