Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/iksolver/intern/IK_Segment.h')
-rw-r--r--intern/iksolver/intern/IK_Segment.h217
1 files changed, 217 insertions, 0 deletions
diff --git a/intern/iksolver/intern/IK_Segment.h b/intern/iksolver/intern/IK_Segment.h
new file mode 100644
index 00000000000..35018df7859
--- /dev/null
+++ b/intern/iksolver/intern/IK_Segment.h
@@ -0,0 +1,217 @@
+/**
+ * $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.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#ifndef NAN_INCLUDED_Segment_h
+
+#define NAN_INCLUDED_Segment_h
+
+/**
+ * @author Laurence Bourn
+ * @date 28/6/2001
+ */
+
+
+#include "MT_Vector3.h"
+#include "MT_Transform.h"
+#include <vector>
+
+class IK_Segment {
+
+public :
+
+ /**
+ * Constructor.
+ * @warning This class uses axis angles for it's parameterization.
+ * Axis angles are a poor representation for joints of more than 1 DOF
+ * because they suffer from Gimbal lock. This becomes noticeable in
+ * IK solutions. A better solution is to do use a quaternion to represent
+ * angles with 3 DOF
+ */
+
+ IK_Segment(
+ const MT_Point3 tr1,
+ const MT_Matrix3x3 A,
+ const MT_Scalar length,
+ const bool pitch_on,
+ const bool yaw_on,
+ const bool role_on
+ );
+
+
+ IK_Segment(
+ );
+
+
+ /**
+ * @return The length of the segment
+ */
+
+ const
+ MT_Scalar
+ Length(
+ ) const ;
+
+ /**
+ * @return The transform from adjacent
+ * coordinate systems in the chain.
+ */
+
+ const
+ MT_Transform &
+ LocalTransform(
+ ) const ;
+
+
+ /**
+ * Get the segment to compute it's
+ * global transform given the global transform
+ * of the parent. This method also updtes the
+ * global segment start
+ */
+
+ void
+ UpdateGlobal(
+ const MT_Transform & global
+ );
+
+ /**
+ * @return A const reference to the global trnasformation
+ */
+
+ const
+ MT_Transform &
+ GlobalTransform(
+ ) const;
+
+ /**
+ * @return A const Reference to start of segment in global
+ * coordinates
+ */
+
+ const
+ MT_Vector3 &
+ GlobalSegmentStart(
+ ) const;
+
+ /**
+ * Computes the number of degrees of freedom of this segment
+ */
+
+ int
+ DoF(
+ ) const;
+
+
+ /**
+ * Increment the active angles (at most DoF()) by
+ * d_theta. Which angles are incremented depends
+ * on which are active.
+ * @return DoF()
+ * @warning Bad interface
+ */
+
+ int
+ IncrementAngles(
+ MT_Scalar *d_theta
+ );
+
+
+ // FIXME - interface bloat
+
+ /**
+ * @return the vectors about which the active
+ * angles operate
+ */
+
+ const
+ std::vector<MT_Vector3> &
+ AngleVectors(
+ ) const;
+
+ /**
+ * @return the ith active angle
+ */
+
+ MT_Scalar
+ ActiveAngle(
+ int i
+ ) const;
+
+ /**
+ * @return the ith angle
+ */
+ MT_Scalar
+ Angle(
+ int i
+ ) const;
+
+
+ /**
+ * Set the active angles from the array
+ * @return the number of active angles
+ */
+
+ int
+ SetAngles(
+ const MT_Scalar *angles
+ );
+
+
+private :
+
+ void
+ UpdateLocalTransform(
+ );
+
+
+
+private :
+
+ /** The user defined transformation, composition of the
+ * translation and rotation from constructor.
+ */
+
+ MT_Transform m_transform;
+ MT_Scalar m_angles[3];
+ MT_Scalar m_length;
+
+ MT_Transform m_local_transform;
+ MT_Transform m_global_transform;
+
+ bool m_active_angles[3];
+
+ MT_Vector3 m_seg_start;
+
+ std::vector<MT_Vector3> m_angle_vectors;
+
+};
+
+#endif \ No newline at end of file