blender/intern/iksolver/intern/IK_QJacobianSolver.h
Brecht Van Lommel c5d2be76d7 IK
==

Solving is now done independent of scale, by scaling the chain to have a
size of about 1.0. This solves some issues with small or big chains, and
also makes the IK stretch setting independent of scale. The latter breaks
backwards compatibility somewhat, but is an improvement over what it did
before.
2007-11-01 12:40:46 +00:00

102 lines
2.6 KiB
C++

/**
* $Id$
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version. The Blender
* Foundation also sells licenses for use in proprietary software under
* the Blender License. See http://www.blender.org/BL/ for information
* about this.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Original Author: Laurence
* Contributor(s): Brecht
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
#ifndef NAN_INCLUDED_IK_QJacobianSolver_h
#define NAN_INCLUDED_IK_QJacobianSolver_h
/**
* @author Laurence Bourn
* @date 28/6/2001
*/
#include <vector>
#include <list>
#include "MT_Vector3.h"
#include "MT_Transform.h"
#include "IK_QJacobian.h"
#include "IK_QSegment.h"
#include "IK_QTask.h"
class IK_QJacobianSolver
{
public:
IK_QJacobianSolver();
~IK_QJacobianSolver() {};
// setup pole vector constraint
void SetPoleVectorConstraint(IK_QSegment *tip, MT_Vector3& goal,
MT_Vector3& polegoal, float poleangle, bool getangle);
float GetPoleAngle() { return m_poleangle; };
// call setup once before solving, if it fails don't solve
bool Setup(IK_QSegment *root, std::list<IK_QTask*>& tasks);
// returns true if converged, false if max number of iterations was used
bool Solve(
IK_QSegment *root,
std::list<IK_QTask*> tasks,
const MT_Scalar tolerance,
const int max_iterations
);
private:
void AddSegmentList(IK_QSegment *seg);
bool UpdateAngles(MT_Scalar& norm);
void ConstrainPoleVector(IK_QSegment *root, std::list<IK_QTask*>& tasks);
MT_Scalar ComputeScale();
void Scale(float scale, std::list<IK_QTask*>& tasks);
private:
IK_QJacobian m_jacobian;
IK_QJacobian m_jacobian_sub;
bool m_secondary_enabled;
std::vector<IK_QSegment*> m_segments;
MT_Transform m_rootmatrix;
bool m_poleconstraint;
bool m_getpoleangle;
MT_Vector3 m_goal;
MT_Vector3 m_polegoal;
float m_poleangle;
IK_QSegment *m_poletip;
};
#endif