Initial revision
[blender.git] / intern / iksolver / intern / IK_Segment.h
1 /**
2  * $Id$
3  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version. The Blender
9  * Foundation also sells licenses for use in proprietary software under
10  * the Blender License.  See http://www.blender.org/BL/ for information
11  * about this.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): none yet.
28  *
29  * ***** END GPL/BL DUAL LICENSE BLOCK *****
30  */
31
32 #ifndef NAN_INCLUDED_Segment_h
33
34 #define NAN_INCLUDED_Segment_h
35
36 /**
37  * @author Laurence Bourn
38  * @date 28/6/2001
39  */
40
41
42 #include "MT_Vector3.h"
43 #include "MT_Transform.h"
44 #include <vector>
45
46 class IK_Segment {
47
48 public :
49
50         /**
51          * Constructor.
52      * @warning This class uses axis angles for it's parameterization.
53      * Axis angles are a poor representation for joints of more than 1 DOF
54      * because they suffer from Gimbal lock. This becomes noticeable in 
55          * IK solutions. A better solution is to do use a quaternion to represent
56      * angles with 3 DOF 
57      */ 
58
59         IK_Segment(
60                 const MT_Point3 tr1,
61                 const MT_Matrix3x3 A,
62                 const MT_Scalar length,
63                 const bool pitch_on,
64                 const bool yaw_on,
65                 const bool role_on
66         );
67
68
69         IK_Segment(
70         );
71
72
73         /**
74      * @return The length of the segment
75      */
76
77         const
78                 MT_Scalar
79         Length(
80         ) const ;
81
82         /**
83      * @return The transform from adjacent
84          * coordinate systems in the chain.
85      */
86
87         const 
88                 MT_Transform &
89         LocalTransform(
90         ) const ;
91
92         
93         /** 
94      * Get the segment to compute it's 
95          * global transform given the global transform
96          * of the parent. This method also updtes the
97          * global segment start
98          */
99
100                 void
101         UpdateGlobal(
102                 const MT_Transform & global
103         );
104         
105         /**
106          * @return A const reference to the global trnasformation 
107          */
108
109         const 
110                 MT_Transform &
111         GlobalTransform(
112         ) const;
113                 
114         /**
115          * @return A const Reference to start of segment in global 
116      * coordinates
117          */
118         
119         const   
120                 MT_Vector3 &
121         GlobalSegmentStart(
122         ) const;
123
124         /**  
125          * Computes the number of degrees of freedom of this segment
126          */
127
128                 int
129         DoF(
130         ) const;
131
132
133         /**
134          * Increment the active angles (at most DoF()) by 
135          * d_theta. Which angles are incremented depends 
136          * on which are active. 
137      * @return DoF()
138          * @warning Bad interface
139      */
140
141                 int
142         IncrementAngles(
143                 MT_Scalar *d_theta
144         );
145
146         
147         // FIXME - interface bloat
148
149         /**
150      * @return the vectors about which the active
151          * angles operate
152          */
153
154         const
155                 std::vector<MT_Vector3> &
156         AngleVectors(
157         ) const;
158
159         /**
160          * @return the ith active angle
161          */
162
163                 MT_Scalar
164         ActiveAngle(
165                 int i
166         ) const;
167
168         /**
169          * @return the ith angle
170          */
171                 MT_Scalar
172         Angle(
173                 int i
174         ) const;
175
176
177         /**
178          * Set the active angles from the array
179          * @return the number of active angles
180          */
181
182                 int
183         SetAngles(
184                 const MT_Scalar *angles
185         );
186
187
188 private :
189         
190                 void
191         UpdateLocalTransform(
192         );
193
194
195
196 private :
197
198         /** The user defined transformation, composition of the 
199          * translation and rotation from constructor.
200      */
201
202         MT_Transform m_transform;
203         MT_Scalar m_angles[3];
204         MT_Scalar m_length;
205
206         MT_Transform m_local_transform;
207         MT_Transform m_global_transform;
208
209         bool m_active_angles[3];
210
211         MT_Vector3 m_seg_start;
212
213         std::vector<MT_Vector3> m_angle_vectors;
214
215 };
216
217 #endif