Blender V2.61 - r43446
|
00001 /* 00002 Bullet Continuous Collision Detection and Physics Library 00003 Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ 00004 00005 This software is provided 'as-is', without any express or implied warranty. 00006 In no event will the authors be held liable for any damages arising from the use of this software. 00007 Permission is granted to anyone to use this software for any purpose, 00008 including commercial applications, and to alter it and redistribute it freely, 00009 subject to the following restrictions: 00010 00011 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 00012 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 00013 3. This notice may not be removed or altered from any source distribution. 00014 */ 00015 00016 #ifndef JACOBIAN_ENTRY_H 00017 #define JACOBIAN_ENTRY_H 00018 00019 #include "LinearMath/btVector3.h" 00020 #include "BulletDynamics/Dynamics/btRigidBody.h" 00021 00022 00023 //notes: 00024 // Another memory optimization would be to store m_1MinvJt in the remaining 3 w components 00025 // which makes the btJacobianEntry memory layout 16 bytes 00026 // if you only are interested in angular part, just feed massInvA and massInvB zero 00027 00031 ATTRIBUTE_ALIGNED16(class) btJacobianEntry 00032 { 00033 public: 00034 btJacobianEntry() {}; 00035 //constraint between two different rigidbodies 00036 btJacobianEntry( 00037 const btMatrix3x3& world2A, 00038 const btMatrix3x3& world2B, 00039 const btVector3& rel_pos1,const btVector3& rel_pos2, 00040 const btVector3& jointAxis, 00041 const btVector3& inertiaInvA, 00042 const btScalar massInvA, 00043 const btVector3& inertiaInvB, 00044 const btScalar massInvB) 00045 :m_linearJointAxis(jointAxis) 00046 { 00047 m_aJ = world2A*(rel_pos1.cross(m_linearJointAxis)); 00048 m_bJ = world2B*(rel_pos2.cross(-m_linearJointAxis)); 00049 m_0MinvJt = inertiaInvA * m_aJ; 00050 m_1MinvJt = inertiaInvB * m_bJ; 00051 m_Adiag = massInvA + m_0MinvJt.dot(m_aJ) + massInvB + m_1MinvJt.dot(m_bJ); 00052 00053 btAssert(m_Adiag > btScalar(0.0)); 00054 } 00055 00056 //angular constraint between two different rigidbodies 00057 btJacobianEntry(const btVector3& jointAxis, 00058 const btMatrix3x3& world2A, 00059 const btMatrix3x3& world2B, 00060 const btVector3& inertiaInvA, 00061 const btVector3& inertiaInvB) 00062 :m_linearJointAxis(btVector3(btScalar(0.),btScalar(0.),btScalar(0.))) 00063 { 00064 m_aJ= world2A*jointAxis; 00065 m_bJ = world2B*-jointAxis; 00066 m_0MinvJt = inertiaInvA * m_aJ; 00067 m_1MinvJt = inertiaInvB * m_bJ; 00068 m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ); 00069 00070 btAssert(m_Adiag > btScalar(0.0)); 00071 } 00072 00073 //angular constraint between two different rigidbodies 00074 btJacobianEntry(const btVector3& axisInA, 00075 const btVector3& axisInB, 00076 const btVector3& inertiaInvA, 00077 const btVector3& inertiaInvB) 00078 : m_linearJointAxis(btVector3(btScalar(0.),btScalar(0.),btScalar(0.))) 00079 , m_aJ(axisInA) 00080 , m_bJ(-axisInB) 00081 { 00082 m_0MinvJt = inertiaInvA * m_aJ; 00083 m_1MinvJt = inertiaInvB * m_bJ; 00084 m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ); 00085 00086 btAssert(m_Adiag > btScalar(0.0)); 00087 } 00088 00089 //constraint on one rigidbody 00090 btJacobianEntry( 00091 const btMatrix3x3& world2A, 00092 const btVector3& rel_pos1,const btVector3& rel_pos2, 00093 const btVector3& jointAxis, 00094 const btVector3& inertiaInvA, 00095 const btScalar massInvA) 00096 :m_linearJointAxis(jointAxis) 00097 { 00098 m_aJ= world2A*(rel_pos1.cross(jointAxis)); 00099 m_bJ = world2A*(rel_pos2.cross(-jointAxis)); 00100 m_0MinvJt = inertiaInvA * m_aJ; 00101 m_1MinvJt = btVector3(btScalar(0.),btScalar(0.),btScalar(0.)); 00102 m_Adiag = massInvA + m_0MinvJt.dot(m_aJ); 00103 00104 btAssert(m_Adiag > btScalar(0.0)); 00105 } 00106 00107 btScalar getDiagonal() const { return m_Adiag; } 00108 00109 // for two constraints on the same rigidbody (for example vehicle friction) 00110 btScalar getNonDiagonal(const btJacobianEntry& jacB, const btScalar massInvA) const 00111 { 00112 const btJacobianEntry& jacA = *this; 00113 btScalar lin = massInvA * jacA.m_linearJointAxis.dot(jacB.m_linearJointAxis); 00114 btScalar ang = jacA.m_0MinvJt.dot(jacB.m_aJ); 00115 return lin + ang; 00116 } 00117 00118 00119 00120 // for two constraints on sharing two same rigidbodies (for example two contact points between two rigidbodies) 00121 btScalar getNonDiagonal(const btJacobianEntry& jacB,const btScalar massInvA,const btScalar massInvB) const 00122 { 00123 const btJacobianEntry& jacA = *this; 00124 btVector3 lin = jacA.m_linearJointAxis * jacB.m_linearJointAxis; 00125 btVector3 ang0 = jacA.m_0MinvJt * jacB.m_aJ; 00126 btVector3 ang1 = jacA.m_1MinvJt * jacB.m_bJ; 00127 btVector3 lin0 = massInvA * lin ; 00128 btVector3 lin1 = massInvB * lin; 00129 btVector3 sum = ang0+ang1+lin0+lin1; 00130 return sum[0]+sum[1]+sum[2]; 00131 } 00132 00133 btScalar getRelativeVelocity(const btVector3& linvelA,const btVector3& angvelA,const btVector3& linvelB,const btVector3& angvelB) 00134 { 00135 btVector3 linrel = linvelA - linvelB; 00136 btVector3 angvela = angvelA * m_aJ; 00137 btVector3 angvelb = angvelB * m_bJ; 00138 linrel *= m_linearJointAxis; 00139 angvela += angvelb; 00140 angvela += linrel; 00141 btScalar rel_vel2 = angvela[0]+angvela[1]+angvela[2]; 00142 return rel_vel2 + SIMD_EPSILON; 00143 } 00144 //private: 00145 00146 btVector3 m_linearJointAxis; 00147 btVector3 m_aJ; 00148 btVector3 m_bJ; 00149 btVector3 m_0MinvJt; 00150 btVector3 m_1MinvJt; 00151 //Optimization: can be stored in the w/last component of one of the vectors 00152 btScalar m_Adiag; 00153 00154 }; 00155 00156 #endif //JACOBIAN_ENTRY_H