コード例 #1
0
    /// <summary>
    /// Main physics loop, find collisions, resolve them and move the bodies.
    /// </summary>
    /// <param name="delta"> amount of time for this simulation step</param>
    public void Step(Fix32 delta)
    {
        if (!simulate)
        {
            return;
        }

        contacts.Clear();
        Fix32 invDelta = (delta > Fix32.Zero) ? (Fix32)1 / delta : Fix32.Zero;

        //integrate forces
        Profiler.BeginSample("Integrate forces");
        foreach (DBody body in bodies)
        {
            if (body.IsFixed())
            {
                continue;
            }

            integrator.IntegrateForces(body, delta);
        }
        Profiler.EndSample();

        Profiler.BeginSample("Find collisions");
        detector.FindCollisions(contacts);
        Profiler.EndSample();

        //init collision manifolds
        foreach (Manifold contact in contacts)
        {
            contact.Init(invDelta);
        }

        //resolve collisions
        for (uint i = 0; i < ITERATIONS; i++)
        {
            foreach (Manifold contact in contacts)
            {
                contact.ApplyImpulse();
            }
        }

        //integrate velocities
        foreach (DBody body in bodies)
        {
            if (body.IsFixed())
            {
                continue;
            }

            Profiler.BeginSample("Remove-Integrate-Insert");
            detector.Remove(body);
            integrator.IntegrateVelocities(body, delta);
            detector.Insert(body);
            Profiler.EndSample();
        }
    }