Beispiel #1
0
void Solver::Solve(double dt)
{
	for (int i = 0; i < ray.size(); i++)
		ray[i]->setAABB();
	if (applyg)
		applyg(body);
	else
		applyG();
	BPT.Start();
	bp.sort();
	BPT.End();
	NPT.Start();
	checkCol();
	NPT.End();
	applyForces(dt);
	SLT.Start();
	solveVelocities(dt);
	SLT.End();
	MVT.Start();
	solvePositions(dt);
	MVT.End();
	clearForces();
}
Beispiel #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);
        }
    }
}