mirror of
https://github.com/bulletphysics/bullet3.git
synced 2026-09-05 01:48:30 +00:00
103 lines
2.9 KiB
C++
103 lines
2.9 KiB
C++
#include "btReducedSoftBodySolver.h"
|
|
#include "../btDeformableMultiBodyDynamicsWorld.h"
|
|
|
|
btReducedSoftBodySolver::btReducedSoftBodySolver()
|
|
{
|
|
m_dampingAlpha = 0;
|
|
m_dampingBeta = 0;
|
|
}
|
|
|
|
void btReducedSoftBodySolver::setDamping(btScalar alpha, btScalar beta)
|
|
{
|
|
m_dampingAlpha = alpha;
|
|
m_dampingBeta = beta;
|
|
}
|
|
|
|
void btReducedSoftBodySolver::predictMotion(btScalar solverdt)
|
|
{
|
|
applyForce();
|
|
|
|
// apply rigid motion
|
|
for (int i = 0; i < m_softBodies.size(); ++i)
|
|
{
|
|
btReducedSoftBody* rsb = static_cast<btReducedSoftBody*>(m_softBodies[i]);
|
|
|
|
// rsb->predictIntegratedTransform(solverdt, rsb->getInterpolationWorldTransform());
|
|
}
|
|
}
|
|
|
|
void btReducedSoftBodySolver::applyForce()
|
|
{
|
|
for (int i = 0; i < m_softBodies.size(); ++i)
|
|
{
|
|
btReducedSoftBody* rsb = static_cast<btReducedSoftBody*>(m_softBodies[i]);
|
|
|
|
// get reduced force
|
|
btAlignedObjectArray<btScalar> reduced_force;
|
|
reduced_force.resize(rsb->m_reducedDofs.size(), 0);
|
|
|
|
// add internal force (elastic force & damping force)
|
|
rsb->applyReducedInternalForce(reduced_force, m_dampingAlpha, m_dampingBeta);
|
|
|
|
// apply impulses to reduced deformable objects
|
|
static btScalar sim_time = 0;
|
|
static int apply_impulse = 0;
|
|
if (rsb->m_reducedModel && apply_impulse < 4)
|
|
{
|
|
if (sim_time > 1 && apply_impulse == 0)
|
|
{
|
|
rsb->applyFullSpaceImpulse(btVector3(0, 1, 0), 0, 2.0 * m_dt, reduced_force);
|
|
apply_impulse++;
|
|
}
|
|
if (sim_time > 2 && apply_impulse == 1)
|
|
{
|
|
rsb->applyFullSpaceImpulse(btVector3(0, -1.2, 0), 0, 2.0 * m_dt, reduced_force);
|
|
apply_impulse++;
|
|
}
|
|
if (sim_time > 3 && apply_impulse == 2)
|
|
{
|
|
rsb->applyFullSpaceImpulse(btVector3(1.1, 0, 0), 0, 2.0 * m_dt, reduced_force);
|
|
apply_impulse++;
|
|
}
|
|
if (sim_time > 4 && apply_impulse == 3)
|
|
{
|
|
rsb->applyFullSpaceImpulse(btVector3(-1, 0, 0), 0, 2.0 * m_dt, reduced_force);
|
|
apply_impulse++;
|
|
}
|
|
}
|
|
|
|
// update reduced velocity
|
|
for (int r = 0; r < rsb->m_reducedDofs.size(); ++r)
|
|
{
|
|
btScalar mass_inv = (rsb->m_Mr[r] == 0) ? 0 : 1.0 / rsb->m_Mr[r];
|
|
btScalar delta_v = m_dt * mass_inv * reduced_force[r];
|
|
|
|
sim_time += m_dt;
|
|
rsb->m_reducedVelocity[r] -= delta_v;
|
|
}
|
|
}
|
|
}
|
|
|
|
void btReducedSoftBodySolver::applyExplicitForce()
|
|
{
|
|
applyForce();
|
|
}
|
|
|
|
void btReducedSoftBodySolver::applyTransforms(btScalar timeStep)
|
|
{
|
|
for (int i = 0; i < m_softBodies.size(); ++i)
|
|
{
|
|
btReducedSoftBody* rsb = static_cast<btReducedSoftBody*>(m_softBodies[i]);
|
|
|
|
for (int r = 0; r < rsb->m_reducedDofs.size(); ++r)
|
|
rsb->m_reducedDofs[r] += timeStep * rsb->m_reducedVelocity[r];
|
|
|
|
// rigid motion
|
|
rsb->predictIntegratedTransform(timeStep, rsb->getInterpolationWorldTransform());
|
|
|
|
rsb->proceedToTransform(rsb->getInterpolationWorldTransform());
|
|
|
|
// map reduced dof back to full space
|
|
rsb->updateFullDofs();
|
|
}
|
|
} |