Ai
1 Star 0 Fork 2

FantasyVR/position-based-dynamic-GPU

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
TimeIntegration.cpp 2.56 KB
一键复制 编辑 原始数据 按行查看 历史
李开诚 提交于 2020-06-04 13:39 +08:00 . first commit
#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);
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/fantasyvr/position-based-dynamic-GPU.git
git@gitee.com:fantasyvr/position-based-dynamic-GPU.git
fantasyvr
position-based-dynamic-GPU
position-based-dynamic-GPU
master

搜索帮助