00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _taoABNode_h
00024 #define _taoABNode_h
00025
00026 #include "taoABJoint.h"
00027 #include "deMath.h"
00028
00029 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00030
00037 class taoABNode
00038 {
00039 public:
00040 taoABNode() { _V.zero(); _A.zero(); _H.zero(), _Omega.zero(); }
00041
00042 virtual ~taoABNode() {}
00043
00044 virtual void setFlag(deInt v) = 0;
00045 virtual const deInt getFlag() const = 0;
00046
00047 virtual deVector6* Pa() = 0;
00048
00049 virtual const deMatrix6* I() const = 0;
00050
00051 virtual deMatrix6* Omega() { return &_Omega; }
00052 virtual deVector6* H() { return &_H; }
00053 virtual deVector6* V() { return &_V; }
00054 virtual deVector6* A() { return &_A; }
00055
00056
00057 virtual void abInertiaInit(deMatrix6& Ia) = 0;
00058
00059
00060
00061
00062 virtual void impulseInit(const deVector3& point, const deVector3& impulse) = 0;
00063
00064
00065
00066
00067
00068 virtual void inertia(const deFloat* mass, const deVector3* centerOfMass, const deMatrix3* inertiaTensor) = 0;
00069
00070
00071
00072 virtual void biasForce(deVector6& P, const deVector6& V, const deVector3& WxV) = 0;
00073
00074
00075
00076
00077
00078
00079 virtual void _abInertia(deMatrix6& Iah, const deMatrix6& L, const deMatrix6& Ia, const deTransform& X) = 0;
00080
00081
00082 virtual void _abBiasForce(deVector6& Pah, const deMatrix6& L, const deMatrix6& Ia, const deVector6& C, const deVector6& Pa) = 0;
00083
00084 virtual void netForce(deVector6& F, const deVector6& A, const deVector6& P) = 0;
00085
00086 virtual void externalForce(deVector6& Pa, const deVector6& G, const deVector6& Fext) = 0;
00087
00088 virtual void updateLocalX(const deFrame& homeFrame, const deFrame& localFrame) = 0;
00089
00090 virtual void getFrameLocal(deFrame& localFrame) = 0;
00091
00092 virtual void abImpulse(deVector6& Yah, deInt propagate) = 0;
00093
00094
00095
00096
00097
00098 virtual void globalJacobian(const deFrame& globalFrame) = 0;
00099
00100 virtual void plusEq_Jg_ddQ(deVector6& Ag) = 0;
00101
00102 virtual void add2Tau_JgT_F(const deVector6& Fg) = 0;
00103
00104
00105
00106 virtual void gravityForce(deVector6& Fext, deVector3& g, const deVector3& gh) = 0;
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 virtual void velocity(deVector6& V, deVector3& WxV, const deVector6& Vh, const deVector3& WhxVh) = 0;
00118 virtual void velocityOnly(deVector6& V, const deVector6& Vh) = 0;
00119
00120 virtual void biasAcceleration(deVector6& H, const deVector6& Hh) = 0;
00121
00122
00123 virtual deFloat kineticEnergy(deVector6& V, const deVector6& Vh) = 0;
00124
00125 virtual deFloat potentialEnergy(const deVector3& gh, const deFrame& globalFrame, const deFloat mass, const deVector3& centerOfMass) = 0;
00126
00127
00128
00129
00130 virtual void acceleration(deVector6& A, const deVector6& Ah) = 0;
00131 virtual void accelerationOnly(deVector6& A, const deVector6& Ah) = 0;
00132
00133
00134
00135
00136 virtual void velocityDelta(deVector6& dV, const deVector6& dVh, const deInt dist) = 0;
00137
00138 virtual void force(deVector6& Fh, deInt propagate) = 0;
00139
00140
00141
00142 virtual void abBiasForceConfig(deVector6& Pah, deInt propagate) = 0;
00143 virtual void abInertiaDepend(deMatrix6& Iah, deVector6& Pah, deMatrix6& Ia, deInt propagate) = 0;
00144
00145 virtual void osInertiaInv(deMatrix6& Oa, const deMatrix6& Oah) = 0;
00146
00147 virtual void setABJoint(taoABJoint* joint, deInt i = 0) = 0;
00148 virtual taoABJoint* getABJoint(deInt i = 0) = 0;
00149
00150 virtual void setNOJ(deInt n) = 0;
00151 virtual const deInt getNOJ() const = 0;
00152
00153 private:
00154 deVector6 _V;
00155 deVector6 _A;
00156 deVector6 _H;
00157 deMatrix6 _Omega;
00158 };
00159
00160 class taoABNodeRoot : public taoABNode
00161 {
00162 public:
00163 virtual const deInt getFlag() const { return 0; }
00164 virtual void setFlag(deInt v) {}
00165
00166 virtual deVector6* Pa() { return NULL; }
00167 virtual const deMatrix6* I() const { return NULL; }
00168
00169 virtual void abInertiaInit(deMatrix6& Ia) {}
00170 virtual void impulseInit(const deVector3& point, const deVector3& impulse) {}
00171
00172 virtual void inertia(const deFloat* mass, const deVector3* centerOfMass, const deMatrix3* inertiaTensor) {}
00173 virtual void biasForce(deVector6& P, const deVector6& V, const deVector3& WxV) {}
00174 virtual void _abInertia(deMatrix6& Iah, const deMatrix6& L, const deMatrix6& Ia, const deTransform& X) {}
00175 virtual void _abBiasForce(deVector6& Pah, const deMatrix6& L, const deMatrix6& Ia, const deVector6& C, const deVector6& Pa) {}
00176 virtual void netForce(deVector6& F, const deVector6& A, const deVector6& P) {}
00177 virtual void externalForce(deVector6& Pa, const deVector6& G, const deVector6& Fext) {}
00178
00179 virtual void updateLocalX(const deFrame& homeFrame, const deFrame& localFrame) {}
00180 virtual void getFrameLocal(deFrame& localFrame) {}
00181
00182 virtual void abImpulse(deVector6& Yah, deInt propagate) {}
00183 virtual void globalJacobian(const deFrame& globalFrame) {}
00184 virtual void plusEq_Jg_ddQ(deVector6& Ag) {}
00185 virtual void add2Tau_JgT_F(const deVector6& Fg) {}
00186
00187 virtual void gravityForce(deVector6& Fext, deVector3& g, const deVector3& gh) { g = gh; }
00188 virtual void velocity(deVector6& V, deVector3& WxV, const deVector6& Vh, const deVector3& WhxVh) { WxV.crossMultiply(V[1], V[0]); }
00189 virtual void velocityOnly(deVector6& V, const deVector6& Vh) {}
00190 virtual void biasAcceleration(deVector6& H, const deVector6& Hh) { H.zero(); }
00191 virtual deFloat kineticEnergy(deVector6& V, const deVector6& Vh) { return 0; }
00192 virtual deFloat potentialEnergy(const deVector3& gh, const deFrame& globalFrame, const deFloat mass, const deVector3& centerOfMass) { return 0; }
00193 virtual void acceleration(deVector6& A, const deVector6& Ah) {}
00194 virtual void accelerationOnly(deVector6& A, const deVector6& Ah) {}
00195 virtual void velocityDelta(deVector6& dV, const deVector6& dVh, const deInt dist) { dV.zero(); }
00196
00197 virtual void force(deVector6& Fh, deInt propagate) {}
00198
00199 virtual void abBiasForceConfig(deVector6& Pah, deInt propagate) {}
00200 virtual void abInertiaDepend(deMatrix6& Iah, deVector6& Pah, deMatrix6& Ia, deInt propagate) {}
00201 virtual void osInertiaInv(deMatrix6& Oa, const deMatrix6& Oah) {}
00202
00203 virtual void setABJoint(taoABJoint* joint, deInt i = 0) {}
00204 virtual taoABJoint* getABJoint(deInt i = 0) { return NULL; }
00205
00206 virtual void setNOJ(deInt n) {}
00207 virtual const deInt getNOJ() const { return 0; }
00208 };
00209
00210 class taoABNodeNOJ : public taoABNode
00211 {
00212 public:
00213 taoABNodeNOJ()
00214 {
00215 _flag = 0;
00216 _Ic.zero();
00217 _I.zero();
00218 }
00219 virtual const deInt getFlag() const { return _flag; }
00220 virtual void setFlag(deInt v) { _flag = v; }
00221
00222 virtual const deMatrix3* Ic() const { return &_Ic; }
00223 virtual const deMatrix6* I() const { return &_I;}
00224
00225 virtual deVector6* Pa() { return &(getABJoint(getNOJ() - 1)->Pa()); }
00226
00227 virtual void abInertiaInit(deMatrix6& Ia);
00228 virtual void impulseInit(const deVector3& point, const deVector3& impulse);
00229
00230 virtual void inertia(const deFloat* mass, const deVector3* centerOfMass, const deMatrix3* inertiaTensor);
00231 virtual void biasForce(deVector6& P, const deVector6& V, const deVector3& WxV);
00232 virtual void _abInertia(deMatrix6& Iah, const deMatrix6& L, const deMatrix6& Ia, const deTransform& X);
00233 virtual void _abBiasForce(deVector6& Pah, const deMatrix6& L, const deMatrix6& Ia, const deVector6& C, const deVector6& Pa);
00234 virtual void externalForce(deVector6& Pa, const deVector6& G, const deVector6& Fext);
00235 virtual deFloat kineticEnergy(deVector6& V, const deVector6& Vh);
00236 virtual deFloat potentialEnergy(const deVector3& gh, const deFrame& globalFrame, const deFloat mass, const deVector3& centerOfMass);
00237
00238 virtual void setABJoint(taoABJoint* joint, deInt i = 0) = 0;
00239 virtual taoABJoint* getABJoint(deInt i = 0) = 0;
00240
00241 virtual void setNOJ(deInt n) = 0;
00242 virtual const deInt getNOJ() const = 0;
00243
00244 private:
00245 deInt _flag;
00246 deMatrix3 _Ic;
00247 deMatrix6 _I;
00248 };
00249
00250 class taoABNodeNOJ1 : public taoABNodeNOJ
00251 {
00252 public:
00253 taoABNodeNOJ1() : _joint(NULL) {}
00254
00255 virtual void updateLocalX(const deFrame& homeFrame, const deFrame& localFrame);
00256 virtual void getFrameLocal(deFrame& localFrame);
00257 virtual void abImpulse(deVector6& Yah, deInt propagate);
00258 virtual void globalJacobian(const deFrame& globalFrame);
00259 virtual void plusEq_Jg_ddQ(deVector6& Ag);
00260 virtual void add2Tau_JgT_F(const deVector6& Fg);
00261
00262 virtual void gravityForce(deVector6& Fext, deVector3& g, const deVector3& gh);
00263 virtual void velocity(deVector6& V, deVector3& WxV, const deVector6& Vh, const deVector3& WhxVh);
00264 virtual void velocityOnly(deVector6& V, const deVector6& Vh);
00265
00266 virtual void biasAcceleration(deVector6& H, const deVector6& Hh);
00267 virtual void acceleration(deVector6& A, const deVector6& Ah);
00268 virtual void accelerationOnly(deVector6& A, const deVector6& Ah);
00269 virtual void velocityDelta(deVector6& dV, const deVector6& dVh, const deInt dist);
00270
00271 virtual void netForce(deVector6& F, const deVector6& A, const deVector6& P);
00272 virtual void force(deVector6& Fh, deInt propagate);
00273
00274 virtual void abBiasForceConfig(deVector6& Pah, deInt propagate);
00275 virtual void abInertiaDepend(deMatrix6& Iah, deVector6& Pah, deMatrix6& Ia, deInt propagate);
00276 virtual void osInertiaInv(deMatrix6& Oa, const deMatrix6& Oah);
00277
00278 virtual void setABJoint(taoABJoint* joint, deInt i = 0) { _joint = joint; }
00279 virtual taoABJoint* getABJoint(deInt i = 0) { return _joint; }
00280
00281 virtual void setNOJ(deInt n) {}
00282 virtual const deInt getNOJ() const { return 1; }
00283
00284 virtual ~taoABNodeNOJ1() { delete _joint; }
00285
00286 private:
00287 taoABJoint* _joint;
00288 };
00289
00290 class taoABNodeNOJn : public taoABNodeNOJ
00291 {
00292 public:
00293 taoABNodeNOJn() : _noj(0), _joint(NULL) {}
00294
00295 virtual void updateLocalX(const deFrame& homeFrame, const deFrame& localFrame);
00296 virtual void getFrameLocal(deFrame& localFrame);
00297 virtual void abImpulse(deVector6& Yah, deInt propagate);
00298 virtual void globalJacobian(const deFrame& globalFrame);
00299 virtual void plusEq_Jg_ddQ(deVector6& Ag);
00300 virtual void add2Tau_JgT_F(const deVector6& Fg);
00301
00302 virtual void gravityForce(deVector6& Fext, deVector3& g, const deVector3& gh);
00303 virtual void velocity(deVector6& V, deVector3& WxV, const deVector6& Vh, const deVector3& WhxVh);
00304 virtual void velocityOnly(deVector6& V, const deVector6& Vh);
00305
00306 virtual void biasAcceleration(deVector6& H, const deVector6& Hh);
00307 virtual void acceleration(deVector6& A, const deVector6& Ah);
00308 virtual void accelerationOnly(deVector6& A, const deVector6& Ah);
00309 virtual void velocityDelta(deVector6& dV, const deVector6& dVh, const deInt dist);
00310
00311 virtual void netForce(deVector6& F, const deVector6& A, const deVector6& P);
00312 virtual void force(deVector6& Fh, deInt propagate);
00313
00314 virtual void abBiasForceConfig(deVector6& Pah, deInt propagate);
00315 virtual void abInertiaDepend(deMatrix6& Iah, deVector6& Pah, deMatrix6& Ia, deInt propagate);
00316 virtual void osInertiaInv(deMatrix6& Oa, const deMatrix6& Oah);
00317
00318 virtual void setABJoint(taoABJoint* joint, deInt i = 0) { _joint[i] = joint; }
00319 virtual taoABJoint* getABJoint(deInt i = 0) { return _joint[i]; }
00320
00321 virtual void setNOJ(deInt n) { _noj = n; _joint = new (taoABJoint*[_noj]); }
00322 virtual const deInt getNOJ() const { return _noj; }
00323
00324 virtual ~taoABNodeNOJn()
00325 {
00326 for (int i = 0; i < _noj; i++)
00327 delete _joint[i];
00328 delete[] _joint;
00329 }
00330
00331 private:
00332 deInt _noj;
00333 taoABJoint** _joint;
00334 };
00335
00336 #endif // DOXYGEN_SHOULD_SKIP_THIS
00337
00338 #endif // _taoABNode_h
00339