15 #ifndef BT_TRANSFORM_UTIL_H
16 #define BT_TRANSFORM_UTIL_H
19 #define ANGULAR_MOTION_THRESHOLD btScalar(0.5) * SIMD_HALF_PI
23 return btVector3(supportDir.x() <
btScalar(0.0) ? -halfExtents.x() : halfExtents.x(),
24 supportDir.y() <
btScalar(0.0) ? -halfExtents.y() : halfExtents.y(),
25 supportDir.z() <
btScalar(0.0) ? -halfExtents.z() : halfExtents.z());
34 predictedTransform.setOrigin(curTrans.getOrigin() + linvel * timeStep);
36 #ifdef QUATERNION_DERIVATIVE
38 predictedOrn += (angvel * predictedOrn) * (timeStep *
btScalar(0.5));
80 predictedTransform.setBasis(curTrans.getBasis());
86 linVel = (pos1 - pos0) / timeStep;
92 angVel = axis *
angle / timeStep;
96 angVel.setValue(0, 0, 0);
105 axis =
btVector3(dorn.x(), dorn.y(), dorn.z());
117 linVel = (transform1.getOrigin() - transform0.getOrigin()) / timeStep;
121 angVel = axis *
angle / timeStep;
126 btMatrix3x3 dmat = transform1.getBasis() * transform0.getBasis().inverse();
128 dmat.getRotation(dorn);
134 axis =
btVector3(dorn.x(), dorn.y(), dorn.z());
162 : m_boundingRadiusA(boundingRadiusA),
163 m_boundingRadiusB(boundingRadiusB),
164 m_separatingDistance(0.f)
170 return m_separatingDistance;
175 const btVector3& toPosA = transA.getOrigin();
176 const btVector3& toPosB = transB.getOrigin();
180 if (m_separatingDistance > 0.f)
182 btVector3 linVelA, angVelA, linVelB, angVelB;
185 btScalar maxAngularProjectedVelocity = angVelA.length() * m_boundingRadiusA + angVelB.length() * m_boundingRadiusB;
186 btVector3 relLinVel = (linVelB - linVelA);
187 btScalar relLinVelocLength = relLinVel.dot(m_separatingNormal);
188 if (relLinVelocLength < 0.f)
190 relLinVelocLength = 0.f;
193 btScalar projectedMotion = maxAngularProjectedVelocity + relLinVelocLength;
194 m_separatingDistance -= projectedMotion;
205 m_separatingDistance = separatingDistance;
207 if (m_separatingDistance > 0.f)
209 m_separatingNormal = separatingVector;
211 const btVector3& toPosA = transA.getOrigin();
212 const btVector3& toPosB = transB.getOrigin();
btMatrix3x3
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
SIMD_FORCE_INLINE btScalar btCos(btScalar x)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
SIMD_FORCE_INLINE btScalar btSin(btScalar x)
SIMD_FORCE_INLINE btScalar btSqrt(btScalar y)
#define SIMD_FORCE_INLINE
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
btScalar getConservativeSeparatingDistance()
void initSeparatingDistance(const btVector3 &separatingVector, btScalar separatingDistance, const btTransform &transA, const btTransform &transB)
btConvexSeparatingDistanceUtil(btScalar boundingRadiusA, btScalar boundingRadiusB)
void updateSeparatingDistance(const btTransform &transA, const btTransform &transB)
The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatr...
btScalar getAngle() const
Return the angle [0, 2Pi] of rotation represented by this quaternion.
btQuaternion & safeNormalize()
btScalar length2() const
Return the length squared of the quaternion.
btQuaternion inverse() const
Return the inverse of this quaternion.
SIMD_FORCE_INLINE btQuaternion nearest(const btQuaternion &qd) const
btQuaternion & normalize()
Normalize the quaternion Such that x^2 + y^2 + z^2 +w^2 = 1.
void setRotation(const btVector3 &axis, const btScalar &_angle)
Set the rotation using axis angle notation.