- Timestamp:
- Dec 13, 2008, 11:45:51 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/physics/src/bullet/LinearMath/btTransformUtil.h
r2192 r2430 101 101 } 102 102 103 static void calculateVelocityQuaternion(const btVector3& pos0,const btVector3& pos1,const btQuaternion& orn0,const btQuaternion& orn1,btScalar timeStep,btVector3& linVel,btVector3& angVel) 104 { 105 linVel = (pos1 - pos0) / timeStep; 106 btVector3 axis; 107 btScalar angle; 108 if (orn0 != orn1) 109 { 110 calculateDiffAxisAngleQuaternion(orn0,orn1,axis,angle); 111 angVel = axis * angle / timeStep; 112 } else 113 { 114 angVel.setValue(0,0,0); 115 } 116 } 117 118 static void calculateDiffAxisAngleQuaternion(const btQuaternion& orn0,const btQuaternion& orn1a,btVector3& axis,btScalar& angle) 119 { 120 btQuaternion orn1 = orn0.farthest(orn1a); 121 btQuaternion dorn = orn1 * orn0.inverse(); 122 ///floating point inaccuracy can lead to w component > 1..., which breaks 123 dorn.normalize(); 124 angle = dorn.getAngle(); 125 axis = btVector3(dorn.x(),dorn.y(),dorn.z()); 126 axis[3] = btScalar(0.); 127 //check for axis length 128 btScalar len = axis.length2(); 129 if (len < SIMD_EPSILON*SIMD_EPSILON) 130 axis = btVector3(btScalar(1.),btScalar(0.),btScalar(0.)); 131 else 132 axis /= btSqrt(len); 133 } 134 103 135 static void calculateVelocity(const btTransform& transform0,const btTransform& transform1,btScalar timeStep,btVector3& linVel,btVector3& angVel) 104 136 { … … 112 144 static void calculateDiffAxisAngle(const btTransform& transform0,const btTransform& transform1,btVector3& axis,btScalar& angle) 113 145 { 114 115 #ifdef USE_QUATERNION_DIFF116 btQuaternion orn0 = transform0.getRotation();117 btQuaternion orn1a = transform1.getRotation();118 btQuaternion orn1 = orn0.farthest(orn1a);119 btQuaternion dorn = orn1 * orn0.inverse();120 #else121 146 btMatrix3x3 dmat = transform1.getBasis() * transform0.getBasis().inverse(); 122 147 btQuaternion dorn; 123 148 dmat.getRotation(dorn); 124 #endif//USE_QUATERNION_DIFF 125 149 126 150 ///floating point inaccuracy can lead to w component > 1..., which breaks 127 128 151 dorn.normalize(); 129 152 … … 141 164 }; 142 165 166 167 ///The btConvexSeparatingDistanceUtil can help speed up convex collision detection 168 ///by conservatively updating a cached separating distance/vector instead of re-calculating the closest distance 169 class btConvexSeparatingDistanceUtil 170 { 171 btQuaternion m_ornA; 172 btQuaternion m_ornB; 173 btVector3 m_posA; 174 btVector3 m_posB; 175 176 btVector3 m_separatingNormal; 177 178 btScalar m_boundingRadiusA; 179 btScalar m_boundingRadiusB; 180 btScalar m_separatingDistance; 181 182 public: 183 184 btConvexSeparatingDistanceUtil(btScalar boundingRadiusA,btScalar boundingRadiusB) 185 :m_boundingRadiusA(boundingRadiusA), 186 m_boundingRadiusB(boundingRadiusB), 187 m_separatingDistance(0.f) 188 { 189 } 190 191 btScalar getConservativeSeparatingDistance() 192 { 193 return m_separatingDistance; 194 } 195 196 void updateSeparatingDistance(const btTransform& transA,const btTransform& transB) 197 { 198 const btVector3& toPosA = transA.getOrigin(); 199 const btVector3& toPosB = transB.getOrigin(); 200 btQuaternion toOrnA = transA.getRotation(); 201 btQuaternion toOrnB = transB.getRotation(); 202 203 if (m_separatingDistance>0.f) 204 { 205 206 207 btVector3 linVelA,angVelA,linVelB,angVelB; 208 btTransformUtil::calculateVelocityQuaternion(m_posA,toPosA,m_ornA,toOrnA,btScalar(1.),linVelA,angVelA); 209 btTransformUtil::calculateVelocityQuaternion(m_posB,toPosB,m_ornB,toOrnB,btScalar(1.),linVelB,angVelB); 210 btScalar maxAngularProjectedVelocity = angVelA.length() * m_boundingRadiusA + angVelB.length() * m_boundingRadiusB; 211 btVector3 relLinVel = (linVelB-linVelA); 212 btScalar relLinVelocLength = (linVelB-linVelA).dot(m_separatingNormal); 213 if (relLinVelocLength<0.f) 214 { 215 relLinVelocLength = 0.f; 216 } 217 218 btScalar projectedMotion = maxAngularProjectedVelocity +relLinVelocLength; 219 m_separatingDistance -= projectedMotion; 220 } 221 222 m_posA = toPosA; 223 m_posB = toPosB; 224 m_ornA = toOrnA; 225 m_ornB = toOrnB; 226 } 227 228 void initSeparatingDistance(const btVector3& separatingVector,btScalar separatingDistance,const btTransform& transA,const btTransform& transB) 229 { 230 m_separatingNormal = separatingVector; 231 m_separatingDistance = separatingDistance; 232 233 const btVector3& toPosA = transA.getOrigin(); 234 const btVector3& toPosB = transB.getOrigin(); 235 btQuaternion toOrnA = transA.getRotation(); 236 btQuaternion toOrnB = transB.getRotation(); 237 m_posA = toPosA; 238 m_posB = toPosB; 239 m_ornA = toOrnA; 240 m_ornB = toOrnB; 241 } 242 243 }; 244 245 143 246 #endif //SIMD_TRANSFORM_UTIL_H 144 247
Note: See TracChangeset
for help on using the changeset viewer.