2D simuler une physique de base
Discutez d'informatique ici !
-
saturn1
- Membre Naturel
- Messages: 32
- Enregistré le: 26 Aoû 2006, 18:13
-
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
-
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
-
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;
}
}
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 6 invités