Program Listing for File TimeIntegration.cpp
↰ Return to documentation for file (PositionBasedDynamics/TimeIntegration.cpp)
#include "TimeIntegration.h"
using namespace PBD;
// ----------------------------------------------------------------------------------------------
void TimeIntegration::semiImplicitEuler(
const Real h,
const Real mass,
Vector3r &position,
Vector3r &velocity,
const Vector3r &acceleration)
{
if (mass != 0.0)
{
velocity += acceleration * h;
position += velocity * h;
}
}
// ----------------------------------------------------------------------------------------------
void TimeIntegration::semiImplicitEulerRotation(
const Real h,
const Real mass,
const Matrix3r& invertiaW,
const Matrix3r &invInertiaW,
Quaternionr &rotation,
Vector3r &angularVelocity,
const Vector3r &torque)
{
if (mass != 0.0)
{
angularVelocity += h * invInertiaW * (torque - (angularVelocity.cross(invertiaW * angularVelocity)));
Quaternionr angVelQ(0.0, angularVelocity[0], angularVelocity[1], angularVelocity[2]);
rotation.coeffs() += h * 0.5 * (angVelQ * rotation).coeffs();
rotation.normalize();
}
}
// ----------------------------------------------------------------------------------------------
void TimeIntegration::velocityUpdateFirstOrder(
const Real h,
const Real mass,
const Vector3r &position,
const Vector3r &oldPosition,
Vector3r &velocity)
{
if (mass != 0.0)
velocity = (1.0 / h) * (position - oldPosition);
}
// ----------------------------------------------------------------------------------------------
void TimeIntegration::angularVelocityUpdateFirstOrder(
const Real h,
const Real mass,
const Quaternionr &rotation,
const Quaternionr &oldRotation,
Vector3r &angularVelocity)
{
if (mass != 0.0)
{
const Quaternionr relRot = (rotation * oldRotation.conjugate());
angularVelocity = relRot.vec() *(2.0 / h);
}
}
// ----------------------------------------------------------------------------------------------
void TimeIntegration::velocityUpdateSecondOrder(
const Real h,
const Real mass,
const Vector3r &position,
const Vector3r &oldPosition,
const Vector3r &positionOfLastStep,
Vector3r &velocity)
{
if (mass != 0.0)
velocity = (1.0 / h) * (1.5*position - 2.0*oldPosition + 0.5*positionOfLastStep);
}
// ----------------------------------------------------------------------------------------------
void TimeIntegration::angularVelocityUpdateSecondOrder(
const Real h,
const Real mass,
const Quaternionr &rotation,
const Quaternionr &oldRotation,
const Quaternionr &rotationOfLastStep,
Vector3r &angularVelocity)
{
// ToDo: is still first order
if (mass != 0.0)
{
const Quaternionr relRot = (rotation * oldRotation.conjugate());
angularVelocity = relRot.vec() *(2.0 / h);
}
}