1 /* 2 * Copyright (c) 2005 Erwin Coumans http://continuousphysics.com/Bullet/ 3 * 4 * Permission to use, copy, modify, distribute and sell this software 5 * and its documentation for any purpose is hereby granted without fee, 6 * provided that the above copyright notice appear in all copies. 7 * Erwin Coumans makes no representations about the suitability 8 * of this software for any purpose. 9 * It is provided "as is" without express or implied warranty. 10 */ 11 #include "btWheelInfo.h" 12 #include "BulletDynamics/Dynamics/btRigidBody.h" // for pointvelocity 13 14 getSuspensionRestLength() const15btScalar btWheelInfo::getSuspensionRestLength() const 16 { 17 18 return m_suspensionRestLength1; 19 20 } 21 updateWheel(const btRigidBody & chassis,RaycastInfo & raycastInfo)22void btWheelInfo::updateWheel(const btRigidBody& chassis,RaycastInfo& raycastInfo) 23 { 24 (void)raycastInfo; 25 26 27 if (m_raycastInfo.m_isInContact) 28 29 { 30 btScalar project= m_raycastInfo.m_contactNormalWS.dot( m_raycastInfo.m_wheelDirectionWS ); 31 btVector3 chassis_velocity_at_contactPoint; 32 btVector3 relpos = m_raycastInfo.m_contactPointWS - chassis.getCenterOfMassPosition(); 33 chassis_velocity_at_contactPoint = chassis.getVelocityInLocalPoint( relpos ); 34 btScalar projVel = m_raycastInfo.m_contactNormalWS.dot( chassis_velocity_at_contactPoint ); 35 if ( project >= btScalar(-0.1)) 36 { 37 m_suspensionRelativeVelocity = btScalar(0.0); 38 m_clippedInvContactDotSuspension = btScalar(1.0) / btScalar(0.1); 39 } 40 else 41 { 42 btScalar inv = btScalar(-1.) / project; 43 m_suspensionRelativeVelocity = projVel * inv; 44 m_clippedInvContactDotSuspension = inv; 45 } 46 47 } 48 49 else // Not in contact : position wheel in a nice (rest length) position 50 { 51 m_raycastInfo.m_suspensionLength = this->getSuspensionRestLength(); 52 m_suspensionRelativeVelocity = btScalar(0.0); 53 m_raycastInfo.m_contactNormalWS = -m_raycastInfo.m_wheelDirectionWS; 54 m_clippedInvContactDotSuspension = btScalar(1.0); 55 } 56 } 57