代码拉取完成,页面将自动刷新
同步操作将从 李开诚/position-based-dynamic-GPU 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#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 &invInertiaW,
Quaternionr &rotation,
Vector3r &angularVelocity,
const Vector3r &torque)
{
if (mass != 0.0)
{
// simple form without nutation effect
angularVelocity += h * invInertiaW * torque;
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);
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。