12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- /*
- * Copyright (c) 2005 Erwin Coumans http://continuousphysics.com/Bullet/
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies.
- * Erwin Coumans makes no representations about the suitability
- * of this software for any purpose.
- * It is provided "as is" without express or implied warranty.
- */
- #include "btWheelInfo.h"
- #include "BulletDynamics/Dynamics/btRigidBody.h" // for pointvelocity
- btScalar btWheelInfo::getSuspensionRestLength() const
- {
- return m_suspensionRestLength1;
- }
- void btWheelInfo::updateWheel(const btRigidBody& chassis, RaycastInfo& raycastInfo)
- {
- (void)raycastInfo;
- if (m_raycastInfo.m_isInContact)
- {
- btScalar project = m_raycastInfo.m_contactNormalWS.dot(m_raycastInfo.m_wheelDirectionWS);
- btVector3 chassis_velocity_at_contactPoint;
- btVector3 relpos = m_raycastInfo.m_contactPointWS - chassis.getCenterOfMassPosition();
- chassis_velocity_at_contactPoint = chassis.getVelocityInLocalPoint(relpos);
- btScalar projVel = m_raycastInfo.m_contactNormalWS.dot(chassis_velocity_at_contactPoint);
- if (project >= btScalar(-0.1))
- {
- m_suspensionRelativeVelocity = btScalar(0.0);
- m_clippedInvContactDotSuspension = btScalar(1.0) / btScalar(0.1);
- }
- else
- {
- btScalar inv = btScalar(-1.) / project;
- m_suspensionRelativeVelocity = projVel * inv;
- m_clippedInvContactDotSuspension = inv;
- }
- }
- else // Not in contact : position wheel in a nice (rest length) position
- {
- m_raycastInfo.m_suspensionLength = this->getSuspensionRestLength();
- m_suspensionRelativeVelocity = btScalar(0.0);
- m_raycastInfo.m_contactNormalWS = -m_raycastInfo.m_wheelDirectionWS;
- m_clippedInvContactDotSuspension = btScalar(1.0);
- }
- }
|