Пример #1
0
void
NewtonSolution::init(const Manager &manager) 
{
  _y = manager.getActiveY();
  _z = manager.getCurrentZ();
  warmStart(manager);

  if (manager.inPhase2()) {
    _ss = manager.getPointGen()._ss;
    _zs = manager.getPointGen()._zs;
    /* double f2 = manager.getSmoothObj();
    _zs = f2;//std::max(f2*(1 + 1e-10), 1.0);
    _ss = 100;//_zs - f2;
    _s0 = 100;  */
  } else {
    _ss = manager.getPointGen()._ss;
    _zs = manager.getPointGen()._zs;
  }
}
Пример #2
0
void PhysicsWorld::solve()
{
    if (m_narrowphase->contacts().empty())
    {
        return;
    }

    /**
     * Warm starting
     */
    for (auto & contact : m_narrowphase->contacts())
    {
        warmStart(*contact);
    }

    /**
     * Iterative solving
     */

//    std::cout << "Solve velocities:" << std::endl;
    for (auto i = 0; i < m_numVelocityIterations; i++)
    {
        for (auto & contact : m_narrowphase->contacts())
        {
            solveContactVelocities(*contact);
        }
    }

    std::cout << "Solve positions:" << std::endl;
    for (auto i = 0; i < m_numPositionIterations; i++)
    {
        for (auto & contact : m_narrowphase->contacts())
        {
            solvePositions(*contact);
        }
    }
}