Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Dec 13, 2008, 11:45:51 PM (16 years ago)
Author:
rgrieder
Message:

Updated to Bullet 2.73 (first part).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/physics/src/bullet/LinearMath/btTransformUtil.h

    r2192 r2430  
    101101        }
    102102
     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
    103135        static void     calculateVelocity(const btTransform& transform0,const btTransform& transform1,btScalar timeStep,btVector3& linVel,btVector3& angVel)
    104136        {
     
    112144        static void calculateDiffAxisAngle(const btTransform& transform0,const btTransform& transform1,btVector3& axis,btScalar& angle)
    113145        {
    114        
    115         #ifdef USE_QUATERNION_DIFF
    116                 btQuaternion orn0 = transform0.getRotation();
    117                 btQuaternion orn1a = transform1.getRotation();
    118                 btQuaternion orn1 = orn0.farthest(orn1a);
    119                 btQuaternion dorn = orn1 * orn0.inverse();
    120 #else
    121146                btMatrix3x3 dmat = transform1.getBasis() * transform0.getBasis().inverse();
    122147                btQuaternion dorn;
    123148                dmat.getRotation(dorn);
    124 #endif//USE_QUATERNION_DIFF
    125        
     149
    126150                ///floating point inaccuracy can lead to w component > 1..., which breaks
    127 
    128151                dorn.normalize();
    129152               
     
    141164};
    142165
     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
     169class   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
     182public:
     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
    143246#endif //SIMD_TRANSFORM_UTIL_H
    144247
Note: See TracChangeset for help on using the changeset viewer.