Changeset View
Changeset View
Standalone View
Standalone View
intern/iksolver/extern/IK_solver.h
| Show All 18 Lines | |||||
| */ | */ | ||||
| /** \file | /** \file | ||||
| * \ingroup iksolver | * \ingroup iksolver | ||||
| */ | */ | ||||
| /** | /** | ||||
| * Copyright (C) 2001 NaN Technologies B.V. | |||||
| * | |||||
| * \page IK - Blender inverse kinematics module. | * \page IK - Blender inverse kinematics module. | ||||
| * | * | ||||
| * \section about About the IK module | * \section about About the IK module | ||||
| * | * | ||||
| * This module allows you to create segments and form them into | * This module allows you to create segments and form them into | ||||
| * tree. You can then define a goal points that the end of a given | * tree. You can then define a goal points that the end of a given | ||||
| * segment should attempt to reach - an inverse kinematic problem. | * segment should attempt to reach - an inverse kinematic problem. | ||||
| * This module will then modify the segments in the tree in order | * This module will then modify the segments in the tree in order | ||||
| * to get the as near as possible to the goal. This solver uses an | * to get the as near as possible to the goal. This solver uses an | ||||
| * inverse jacobian method to find a solution. | * inverse jacobian method to find a solution. | ||||
| * | * | ||||
| * \section issues Known issues with this IK solver. | * \section issues Known issues with this IK solver. | ||||
| * | * | ||||
| * - There is currently no support for joint constraints in the | * - There is currently no support for joint constraints in the | ||||
| * solver. This is within the realms of possibility - please ask | * solver. This is within the realms of possibility - please ask | ||||
| * if this functionality is required. | * if this functionality is required. | ||||
| * - The solver is slow, inverse jacobian methods in general give | * - The solver is slow, inverse jacobian methods in general give | ||||
| * 'smooth' solutions and the method is also very flexible, it | * 'smooth' solutions and the method is also very flexible, it | ||||
| * does not rely on specific angle parameterization and can be | * does not rely on specific angle parameterization and can be | ||||
| * extended to deal with different joint types and joint | * extended to deal with different joint types and joint | ||||
| * constraints. However it is not suitable for real time use. | * constraints. However it is not suitable for real time use. | ||||
| * Other algorithms exist which are more suitable for real-time | * Other algorithms exist which are more suitable for real-time | ||||
| * applications, please ask if this functionality is required. | * applications, please ask if this functionality is required. | ||||
| * | * | ||||
| * \section dependencies Dependencies | * \section dependencies Dependencies | ||||
| * | * | ||||
| * This module only depends on Moto. | * This module only depends on Moto. | ||||
| */ | */ | ||||
| #ifndef __IK_SOLVER_H__ | #ifndef __IK_SOLVER_H__ | ||||
| #define __IK_SOLVER_H__ | #define __IK_SOLVER_H__ | ||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||
| extern "C" { | extern "C" { | ||||
| #endif | #endif | ||||
| /** | /** | ||||
| * Typical order of calls for solving an IK problem: | * Typical order of calls for solving an IK problem: | ||||
| * | * | ||||
| * - create number of IK_Segment's and set their parents and transforms | * - create number of IK_Segment's and set their parents and transforms | ||||
| * - create an IK_Solver | * - create an IK_Solver | ||||
| * - set a number of goals for the IK_Solver to solve | * - set a number of goals for the IK_Solver to solve | ||||
| * - call IK_Solve | * - call IK_Solve | ||||
| * - free the IK_Solver | * - free the IK_Solver | ||||
| * - get basis and translation changes from segments | * - get basis and translation changes from segments | ||||
| * - free all segments | * - free all segments | ||||
| */ | */ | ||||
| /** | /** | ||||
| * IK_Segment defines a single segment of an IK tree. | * IK_Segment defines a single segment of an IK tree. | ||||
| * - Individual segments are always defined in local coordinates. | * - Individual segments are always defined in local coordinates. | ||||
| * - The segment is assumed to be oriented in the local | * - The segment is assumed to be oriented in the local | ||||
| * y-direction. | * y-direction. | ||||
| * - start is the start of the segment relative to the end | * - start is the start of the segment relative to the end | ||||
| * of the parent segment. | * of the parent segment. | ||||
| * - rest_basis is a column major matrix defineding the rest | * - rest_basis is a column major matrix defineding the rest | ||||
| * position (w.r.t. which the limits are defined), must | * position (w.r.t. which the limits are defined), must | ||||
| * be a pure rotation | * be a pure rotation | ||||
| * - basis is a column major matrix defining the current change | * - basis is a column major matrix defining the current change | ||||
| * from the rest basis, must be a pure rotation | * from the rest basis, must be a pure rotation | ||||
| * - length is the length of the bone. | * - length is the length of the bone. | ||||
| * | * | ||||
| * - basis_change and translation_change respectively define | * - basis_change and translation_change respectively define | ||||
| * the change in rotation or translation. basis_change is a | * the change in rotation or translation. basis_change is a | ||||
| * column major 3x3 matrix. | * column major 3x3 matrix. | ||||
| * | * | ||||
| * The local transformation is then defined as: | * The local transformation is then defined as: | ||||
| * start * rest_basis * basis * basis_change * translation_change * translate(0,length,0) | * start * rest_basis * basis * basis_change * translation_change * translate(0,length,0) | ||||
| */ | */ | ||||
| typedef void IK_Segment; | typedef void IK_Segment; | ||||
| enum IK_SegmentFlag { | enum IK_SegmentFlag { | ||||
| IK_XDOF = 1, | IK_XDOF = 1, | ||||
| IK_YDOF = 2, | IK_YDOF = 2, | ||||
| IK_ZDOF = 4, | IK_ZDOF = 4, | ||||
| Show All 19 Lines | |||||
| extern void IK_SetLimit(IK_Segment *seg, IK_SegmentAxis axis, float lmin, float lmax); | extern void IK_SetLimit(IK_Segment *seg, IK_SegmentAxis axis, float lmin, float lmax); | ||||
| extern void IK_SetStiffness(IK_Segment *seg, IK_SegmentAxis axis, float stiffness); | extern void IK_SetStiffness(IK_Segment *seg, IK_SegmentAxis axis, float stiffness); | ||||
| extern void IK_GetBasisChange(IK_Segment *seg, float basis_change[][3]); | extern void IK_GetBasisChange(IK_Segment *seg, float basis_change[][3]); | ||||
| extern void IK_GetTranslationChange(IK_Segment *seg, float *translation_change); | extern void IK_GetTranslationChange(IK_Segment *seg, float *translation_change); | ||||
| /** | /** | ||||
| * An IK_Solver must be created to be able to execute the solver. | * An IK_Solver must be created to be able to execute the solver. | ||||
| * | * | ||||
| * An arbitray number of goals can be created, stating that a given | * An arbitray number of goals can be created, stating that a given | ||||
| * end effector must have a given position or rotation. If multiple | * end effector must have a given position or rotation. If multiple | ||||
| * goals are specified, they can be weighted (range 0..1) to get | * goals are specified, they can be weighted (range 0..1) to get | ||||
| * some control over their importance. | * some control over their importance. | ||||
| * | * | ||||
| * IK_Solve will execute the solver, that will run until either the | * IK_Solve will execute the solver, that will run until either the | ||||
| * system converges, or a maximum number of iterations is reached. | * system converges, or a maximum number of iterations is reached. | ||||
| * It returns 1 if the system converged, 0 otherwise. | * It returns 1 if the system converged, 0 otherwise. | ||||
| */ | */ | ||||
| typedef void IK_Solver; | typedef void IK_Solver; | ||||
| IK_Solver *IK_CreateSolver(IK_Segment *root); | IK_Solver *IK_CreateSolver(IK_Segment *root); | ||||
| void IK_FreeSolver(IK_Solver *solver); | void IK_FreeSolver(IK_Solver *solver); | ||||
| void IK_SolverAddGoal(IK_Solver *solver, IK_Segment *tip, float goal[3], float weight); | void IK_SolverAddGoal(IK_Solver *solver, IK_Segment *tip, float goal[3], float weight); | ||||
| void IK_SolverAddGoalOrientation(IK_Solver *solver, IK_Segment *tip, float goal[][3], float weight); | void IK_SolverAddGoalOrientation(IK_Solver *solver, IK_Segment *tip, float goal[][3], float weight); | ||||
| void IK_SolverSetPoleVectorConstraint(IK_Solver *solver, IK_Segment *tip, float goal[3], float polegoal[3], float poleangle, int getangle); | void IK_SolverSetPoleVectorConstraint(IK_Solver *solver, IK_Segment *tip, float goal[3], float polegoal[3], float poleangle, int getangle); | ||||
| float IK_SolverGetPoleAngle(IK_Solver *solver); | float IK_SolverGetPoleAngle(IK_Solver *solver); | ||||
| int IK_Solve(IK_Solver *solver, float tolerance, int max_iterations); | int IK_Solve(IK_Solver *solver, float tolerance, int max_iterations); | ||||
| #define IK_STRETCH_STIFF_EPS 0.01f | #define IK_STRETCH_STIFF_EPS 0.01f | ||||
| #define IK_STRETCH_STIFF_MIN 0.001f | #define IK_STRETCH_STIFF_MIN 0.001f | ||||
| #define IK_STRETCH_STIFF_MAX 1e10 | #define IK_STRETCH_STIFF_MAX 1e10 | ||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||
| } | } | ||||
| #endif | #endif | ||||
| #endif // __IK_SOLVER_H__ | #endif // __IK_SOLVER_H__ | ||||