2D simuler une physique de base

Discutez d'informatique ici !
saturn1
Membre Naturel
Messages: 32
Enregistré le: 26 Aoû 2006, 18:13

2D simuler une physique de base

par saturn1 » 05 Mar 2010, 21:19

Bonjour j'essaie de simuler une physique de base avec des rectangle.
J'ai un rectangle qui doit rebondir sur un autre rectangle.

Le rectangle du sol ne s'update jamais.
J'applique la gravite a chaque update comme ceci :
Code: Tout sélectionner
        public void applyStrength(myRectangle body)
        {
            // apply the gravity for the moment
            body.vForces = Vector3.Zero;
            body.vForces.Y += body.fMass * this.fGravity;
        }


J'update mon rectangle comme ceci

Code: Tout sélectionner
     public void UpdateBody(GameTime gameTime)
        {
            myRectangle tmpcpy;
            Vector3 Ae;
            Vector3 k1;
            Vector3 k2;

            tmpcpy = this;
            applyStrength(tmpcpy);
            Ae = tmpcpy.vForces / tmpcpy.fMass;
            k1 = Ae / tmpcpy.fMass;
            k1 = Ae * this.previousTime;
            tmpcpy.vVelocity += k1;
            applyStrength(tmpcpy);
            Ae = tmpcpy.vForces / tmpcpy.fMass;
            k2 = Ae / tmpcpy.fMass;

            this.vVelocity += (k1 + k2) / 2;
            this.vPosition += this.vVelocity * this.previousTime;
            this.fSpeed = this.vVelocity.Length();
}


Puis je tente en vain d'appliquer des collisions + un effets de rebond comme ceci :
r1 = box qui rebondit
r2 = sol.

Code: Tout sélectionner
        public void checkForCollision(myRectangle r1, myRectangle r2)
        {
            if (new Rectangle((int)r1.vPosition.X, (int)r1.vPosition.Y, (int)r1.fWidth, (int)r1.fHeight)
                .Intersects(new Rectangle((int)r2.vPosition.X, (int)r2.vPosition.Y, (int)r2.fWidth, (int)r2.fHeight)))
            {
                Vector3 vr = (r1.vVelocity - r2.vVelocity);
                this.n = r1.vPosition - r2.vPosition;
                this.n.Normalize();
                this.J = -vr * (e + 1) / (1 / r1.fMass + 1 / r2.fMass);
                Vector3 newVeloc = (this.J * this.n) / r1.fMass + new Vector3(0, r1.fSpeed, 0);
                r1.vVelocity -= newVeloc;
            }
        }


Ca rebondit bien .. mais le probleme c'est lorsque le rebond = 0. ma box qui rebondissait glisse peu a peu dans le sol.

Si vous avez des idees :)

Merci bien



Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 05 Mar 2010, 21:51

salut,

pour ma part aucune idée.
Je comprends rien. Jte fais pas l'inventaire de tout ce qu'il faut deviner.

Pas d'algorithme, pas de spécif de fonctions, aucune ligne commentée.
Mais pe que quelqu'un d'autre comprend (???) ce que tu as tenté de faire.

PS : un rectangle qui rebondit sur un autre rectangle...genre casse brique?
pis squoi le rapport entre le sol et le rectangle.

bref :triste:
la vie est une fête :)

saturn1
Membre Naturel
Messages: 32
Enregistré le: 26 Aoû 2006, 18:13

re

par saturn1 » 05 Mar 2010, 21:56

Il y a deux rectangles un rectangle qui rebondit et l'autre rectangle qui represente le sol.

Apres si tu peux me dire ce que tu ne comprends pas stp ...
En attendant je vais commenter

Merci bien ;)
Code: Tout sélectionner
//ici j'applique des forces sur le rectangle qui rebondit
//ici j'applique la gravite
public void applyStrength(myRectangle body)
        {
            // apply the gravity for the moment
            body.vForces = Vector3.Zero;
            body.vForces.Y += body.fMass * this.fGravity;
        }


Code: Tout sélectionner
 
//ici j'update mon rectangle qui rebondit
//avec la methode d'euler ( c'est pas de moi j'ai lu ca dans un bouquin^^

    public void UpdateBody(GameTime gameTime)
        {
            myRectangle tmpcpy;
            Vector3 Ae;
            Vector3 k1;
            Vector3 k2;

            tmpcpy = this;
            applyStrength(tmpcpy);
            Ae = tmpcpy.vForces / tmpcpy.fMass;
            k1 = Ae / tmpcpy.fMass;
            k1 = Ae * this.previousTime;
            tmpcpy.vVelocity += k1;
            applyStrength(tmpcpy);
            Ae = tmpcpy.vForces / tmpcpy.fMass;
            k2 = Ae / tmpcpy.fMass;

            this.vVelocity += (k1 + k2) / 2;
            this.vPosition += this.vVelocity * this.previousTime;
            this.fSpeed = this.vVelocity.Length();
}


Code: Tout sélectionner
//si les rectangles intersect
// n = vecteur qui traverse les 2 centres de gravite de mon rectangle qui rebondit et le sol
// j represente le vecteur impulsion avec e l'elasticite

public void checkForCollision(myRectangle r1, myRectangle r2)
        {
            if (new Rectangle((int)r1.vPosition.X, (int)r1.vPosition.Y, (int)r1.fWidth, (int)r1.fHeight)
                .Intersects(new Rectangle((int)r2.vPosition.X, (int)r2.vPosition.Y, (int)r2.fWidth, (int)r2.fHeight)))
            {
                Vector3 vr = (r1.vVelocity - r2.vVelocity);
                this.n = r1.vPosition - r2.vPosition;
                this.n.Normalize();
                this.J = -vr * (e + 1) / (1 / r1.fMass + 1 / r2.fMass);
                Vector3 newVeloc = (this.J * this.n) / r1.fMass + new Vector3(0, r1.fSpeed, 0);
                r1.vVelocity -= newVeloc;
            }
        }

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 6 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite