/// <summary>
        /// Obtiene los contactos para el momento actual
        /// </summary>
        private void GenerateContacts()
        {
            // Preparar datos de colisión
            this.m_ContactData.Reset();
            this.m_ContactData.Friction    = 0.75f;
            this.m_ContactData.Restitution = 0.1f;
            this.m_ContactData.Tolerance   = 0.1f;

            // Generadores de contactos
            foreach (ContactGenerator contactGenerator in this.m_ContactGenerators)
            {
                if (this.m_ContactData.HasFreeContacts())
                {
                    contactGenerator.AddContact(ref this.m_ContactData, 0);
                }
                else
                {
                    return;
                }
            }

            // Colisiones de cada proyectil y cada vehículo contra el suelo
            if (this.m_SceneryPrimitive != null)
            {
                // Recorrer los proyectiles
                foreach (AmmoRound projectileObj in this.m_ProjectileData)
                {
                    // Si hay contactos libres
                    if (this.m_ContactData.HasFreeContacts())
                    {
                        // Comprobar si el proyectil está activo
                        if (projectileObj.IsActive)
                        {
                            // Obtener las primitivas del proyectil y del terreno
                            CollisionPrimitive projectileObjPrimitive = projectileObj.Primitive;
                            CollisionPrimitive sceneryPrimitive       = this.m_SceneryPrimitive.GetContactedPrimitive(projectileObj);
                            if (CollisionDetector.BetweenObjects(ref projectileObjPrimitive, ref sceneryPrimitive, ref m_ContactData))
                            {
                                // Generar la explosión
                                if (projectileObj.GenerateExplosion)
                                {
                                    // Explosión
                                    Explosion explosion = Explosion.CreateArtilleryExplosion(projectileObjPrimitive.Position);

                                    this.m_ExplosionData.Add(explosion);

                                    this.FireExplosionStartsEvent(explosion);
                                }

                                // Informar de la colisión entre la bala y el suelo
                                projectileObj.SetContactedWith(this.m_SceneryPrimitive);
                            }
                        }
                    }
                    else
                    {
                        // Fin de la detección
                        return;
                    }
                }

                // Recorrer los vehículos
                foreach (IPhysicObject vehicleObj in this.m_ObjectData)
                {
                    // Si hay contactos libres
                    if (this.m_ContactData.HasFreeContacts())
                    {
                        // Comprobar si el vehículo está activo
                        if (vehicleObj.IsActive)
                        {
                            // Obtener las primitivas del vehículo y del terreno
                            CollisionPrimitive vehicleObjPrimitive = vehicleObj.Primitive;
                            CollisionPrimitive sceneryPrimitive    = this.m_SceneryPrimitive.GetContactedPrimitive(vehicleObj);
                            if (CollisionDetector.BetweenObjects(ref vehicleObjPrimitive, ref sceneryPrimitive, ref this.m_ContactData))
                            {
                                // Informar de la colisión entre el vehículo y el terreno
                                vehicleObj.SetContactedWith(this.m_SceneryPrimitive);
                            }
                        }
                    }
                    else
                    {
                        // Fin de la detección
                        return;
                    }
                }
            }

            // Chequear colisiones de los vehículos y los proyectiles
            foreach (AmmoRound projectileObj in this.m_ProjectileData)
            {
                // Si hay contactos libres
                if (this.m_ContactData.HasFreeContacts())
                {
                    if (projectileObj.IsActive)
                    {
                        CollisionPrimitive projectileObjPrimitive = projectileObj.Primitive;

                        // Recorrer los vehículos
                        foreach (IPhysicObject vehicleObj in this.m_ObjectData)
                        {
                            // Si hay contactos libres
                            if (this.m_ContactData.HasFreeContacts())
                            {
                                CollisionPrimitive vehicleObjPrimitive = vehicleObj.GetContactedPrimitive(projectileObj);
                                if (CollisionDetector.BetweenObjects(ref vehicleObjPrimitive, ref projectileObjPrimitive, ref m_ContactData))
                                {
                                    if (projectileObj.GenerateExplosion)
                                    {
                                        // Explosión
                                        Explosion explosion = Explosion.CreateArtilleryExplosion(projectileObjPrimitive.Position);

                                        this.m_ExplosionData.Add(explosion);

                                        this.FireExplosionStartsEvent(explosion);
                                    }

                                    // Informar de la colisión entre la caja y la bala
                                    vehicleObj.SetContactedWith(projectileObj);
                                    projectileObj.SetContactedWith(vehicleObj);
                                }
                            }
                            else
                            {
                                // Fin de la detección
                                return;
                            }
                        }
                    }
                }
                else
                {
                    // Fin de la detección
                    return;
                }
            }

            // Chequear colisiones entre vehículos
            for (int i = 0; i < this.m_ObjectData.Count; i++)
            {
                if (this.m_ContactData.HasFreeContacts())
                {
                    // Obtener la primitiva de colisión
                    CollisionPrimitive primitive1 = this.m_ObjectData[i].Primitive;

                    for (int x = i + 1; x < this.m_ObjectData.Count; x++)
                    {
                        if (this.m_ContactData.HasFreeContacts())
                        {
                            if (this.m_ObjectData[i].IsActive || this.m_ObjectData[x].IsActive)
                            {
                                // Obtener la segunda primitiva de colisión
                                CollisionPrimitive primitive2 = this.m_ObjectData[x].GetContactedPrimitive(this.m_ObjectData[i]);
                                if (CollisionDetector.BetweenObjects(ref primitive1, ref primitive2, ref this.m_ContactData))
                                {
                                    // Informar de la colisión entre cajas
                                    this.m_ObjectData[i].SetContactedWith(this.m_ObjectData[x]);
                                    this.m_ObjectData[x].SetContactedWith(this.m_ObjectData[i]);
                                }
                            }
                        }
                        else
                        {
                            return;
                        }
                    }
                }
                else
                {
                    return;
                }
            }
        }