00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef CGELSkeletonLinkH
00015 #define CGELSkeletonLinkH
00016
00017 #include "chai3d.h"
00018 #include "CGELSkeletonNode.h"
00019
00020
00021
00029
00030
00031
00039
00040 class cGELSkeletonLink
00041 {
00042 public:
00043
00044
00045
00046
00047
00049 cGELSkeletonLink(cGELSkeletonNode* a_node0, cGELSkeletonNode* a_node1);
00050
00052 ~cGELSkeletonLink();
00053
00054
00055
00056
00057
00058
00059
00065
00066 inline void render()
00067 {
00068
00069 glColor4fv( (const float *)&m_color);
00070 glBegin(GL_LINES);
00071 glVertex3dv( (const double *)&m_node0->m_pos);
00072 glVertex3dv( (const double *)&m_node1->m_pos);
00073 glEnd();
00074 }
00075
00076
00077
00083
00084 inline void computeForces()
00085 {
00086
00087 m_wLink01 = cSub(m_node1->m_pos, m_node0->m_pos);
00088 m_wLink10 = cMul(-1, m_wLink01);
00089 m_length = m_wLink01.length();
00090
00091 m_wzLink01 = cMul((m_node0->m_rot), m_nzLink01);
00092 m_wzLink10 = cMul((m_node1->m_rot), m_nzLink10);
00093
00094
00095
00096
00097
00098 if (m_length < 0.000001) { return; }
00099
00100
00101 double f = m_kSpringElongation * (m_length - m_length0);
00102
00103
00104 if (m_length > 0.000001)
00105 {
00106 cVector3d force = cMul(f/m_length, m_wLink01);
00107 m_node0->addForce(force);
00108 cVector3d tmpfrc = cMul(-1, force);
00109 m_node1->addForce(tmpfrc);
00110 }
00111
00112
00113
00114
00115
00116 cVector3d torqueDir0 = cCross(m_wzLink01, m_wLink01);
00117 cVector3d torqueDir1 = cCross(m_wzLink10, m_wLink10);
00118 double angle0 = cAngle(m_wzLink01, m_wLink01);
00119 double angle1 = cAngle(m_wzLink10, m_wLink10);
00120 double torqueMag0 = angle0 * m_kSpringFlexion;
00121 double torqueMag1 = angle1 * m_kSpringFlexion;
00122
00123 if ((m_length > 0.000001) && (m_enabled))
00124 {
00125 if (torqueMag0 > 0.0001)
00126 {
00127 cVector3d torque0 = cMul(torqueMag0, cNormalize(torqueDir0));
00128 m_node0->addTorque(torque0);
00129 cVector3d force1 = cMul((torqueMag0/m_length), cNormalize(cCross(m_wLink01, torque0)));
00130 m_node1->addForce(force1);
00131 cVector3d tmpfrc = cMul(-1,force1);
00132 m_node0->addForce(tmpfrc);
00133 }
00134
00135 if (torqueMag1 > 0.0001)
00136 {
00137 cVector3d torque1 = cMul(torqueMag1, cNormalize(torqueDir1));
00138 m_node1->addTorque(torque1);
00139 cVector3d force0 = cMul((torqueMag1/m_length), cNormalize(cCross(m_wLink10, torque1)));
00140 m_node0->addForce(force0);
00141 cVector3d tmpfrc = cMul(-1,force0);
00142 m_node1->addForce(tmpfrc);
00143 }
00144 }
00145
00146
00147
00148
00149
00150 if (m_enabled)
00151 {
00152
00153 m_node0->m_rot.mulr(m_A0, m_wA0);
00154 m_node0->m_rot.mulr(m_B0, m_wB0);
00155 m_node1->m_rot.mulr(m_A1, m_wA1);
00156
00157
00158 cVector3d v0, v1;
00159 m_wA0.crossr(m_wLink01, v0);
00160 m_wA1.crossr(m_wLink01, v1);
00161 v0.normalize();
00162 v1.normalize();
00163
00164 cVector3d torque;
00165 v0.crossr(v1, m_torsionAxisAngle);
00166 m_torsionAxisAngle.mulr(m_kSpringTorsion, torque);
00167
00168 m_node0->addTorque(torque);
00169 cVector3d tmptrq = -1.0 * torque;
00170 m_node1->addTorque(tmptrq);
00171 }
00172 }
00173
00174
00175
00176
00177
00178
00180 cGELSkeletonNode *m_node0;
00181
00183 cGELSkeletonNode *m_node1;
00184
00185
00186
00187
00188
00189
00191 cColorf m_color;
00192
00193
00194
00195
00196
00197
00199 double m_kSpringElongation;
00200
00202 double m_kSpringFlexion;
00203
00205 double m_kSpringTorsion;
00206
00208 bool m_enabled;
00209
00211
00212
00214
00215
00217
00218
00219
00220 public:
00221
00222
00223
00224
00225
00226
00228 cVector3d m_nzLink01;
00229
00231 cVector3d m_wzLink01;
00232
00234 cVector3d m_nzLink10;
00235
00237 cVector3d m_wzLink10;
00238
00240 cVector3d m_wLink01;
00241
00243 cVector3d m_wLink10;
00244
00246 cVector3d m_torsionAxisAngle;
00247
00249 cVector3d m_A0;
00250
00252 cVector3d m_wA0;
00253
00255 cVector3d m_B0;
00256
00258 cVector3d m_wB0;
00259
00261 cVector3d m_A1;
00262
00264 cVector3d m_wA1;
00265
00267 double m_length0;
00268
00270 double m_length;
00271
00272
00273 public:
00274
00275
00276
00277
00278
00280 static double default_kSpringElongation;
00281
00283 static double default_kSpringFlexion;
00284
00286 static double default_kSpringTorsion;
00287
00289 static cColorf default_color;
00290 };
00291
00292
00293 #endif
00294
00295