Exemple #1
0
        public static void Update(Particle[] particles)
        {
            int particlesCount = particles.Length;

            for (int i = 0; i < particlesCount - 1; i++)
            {
                for (int j = i + 1; j < particlesCount; j++)
                {
                    Vector p1 = particles[i].position;
                    Vector p2 = particles[j].position;
                    Vector penetrationDirection    = (p2 - p1);
                    float  penetrationSquareLength = penetrationDirection.SquareLength();
                    if (penetrationSquareLength < Math.Sqrt(particles[i].radius + particles[j].radius))
                    {
                        penetrationDirection.Normalize();
                        float penetrationLength = (float)Math.Sqrt(penetrationSquareLength);
                        float penetrationDepth  = 0.5f * (particles[i].radius + particles[j].radius - penetrationLength);

                        particles[i].position -= penetrationDirection * penetrationDepth;
                        particles[j].position += penetrationDirection * penetrationDepth;
                    }
                }
            }
        }