2017-01-07 3 views
0

Je construis un petit moteur de physique qui lance un projectile avec une vélocité donnée, une vitesse de gravité et un intervalle de temps, et suit et affiche les vecteurs de vitesse/position à chaque intervalle de temps.3D Projectile - erreur de calcul sur X & Z?

Actuellement, lorsque j'exécute mon programme, mes coordonnées y se mettent à jour correctement. Cependant mes coordonnées x et z agissent de la même manière, et je suis à peu près sûr que mes calculs de coordonnées z sont incorrects. (Mais je peux me tromper)

Ce problème est le même pour les vecteurs de position et de vitesse sur les axes x et z.

Voici mon code:

include <iostream> 

using namespace std; 

struct velocityVector { 

    float vx = 10.0; 
    float vy = 14.14; 
    float vz = 10.0; 

}; 

struct gravityVector { 

    float gx = 0.0; 
    float gy = -9.81; 
    float gz = 0.0; 

}; 

struct positionVector { 

    float px = 0; 
    float py = 0; 
    float pz = 0; 

}; 

int main() { 

    float deltaT = 0.01; 

    positionVector posAccess; // object for positionVectors 
    gravityVector gravAccess; // object for gravityVectors 
    velocityVector velAccess; // object for velocityVectors 

    while (deltaT < 1) { 

     deltaT += 0.01;  // increment deltaT 

     cout << "Velocity vector = "; 
     // Display Velocity x,y,z 
     cout << velAccess.vx << " "; 
     cout << velAccess.vy << " "; 
     cout << velAccess.vz << " "; 
     cout << '\n'; 

     cout << "Position vector = "; 
     // Display Position x,y,z 
     cout << posAccess.px << " "; 
     cout << posAccess.py << " "; 
     cout << posAccess.pz << " "; 
     cout << '\n' << endl; 

     // Update Velocity 
     velAccess.vx += deltaT * gravAccess.gx; 
     velAccess.vy += deltaT * gravAccess.gy; 
     velAccess.vz += deltaT * gravAccess.gz; 

     // Update Position 
     posAccess.px += deltaT * velAccess.vx; 
     posAccess.py += deltaT * velAccess.vy; 
     posAccess.pz += deltaT * velAccess.vz; 

     getchar();  // so I can go through each interval manually 
    } 
} 

Si ça aide. Voici ma tâche:

Une trajectoire en 3D pour un projectile qui a un vecteur de vitesse de lancement de (10.0,14.14, - 10.0). Pas de temps = 0,01 seconde. Le vecteur de gravité est (0,0, -9,81, 0,0).

Afficher les vecteurs de position et vecteurs de vitesse sur une console à des fins de démonstration.

+1

Pourquoi le résultat est-il suspect? – user2864740

+0

Votre tâche indique que la vélocité Z doit être de -10,0 mais que votre code a la valeur 10,0 (donc, bien sûr, elle agit de la même manière que la vélocité de 10,0 X). – TheUndeadFish

Répondre

0

Le problème est que vous augmentez le deltaT (le temps qui passe à chaque étape physique). Cela devrait rester le même et vous devriez ajouter une autre variable pour garder une trace du temps écoulé depuis le début de la simulation. Par exemple:

float time = 0.0; 
while (time < 1.0) // make sure that this STAYS a float 
{ 
    // Physics code here 
    time += deltaT; // increment the time AFTER physics is simulated 
    getchar(); 
} 

Ceci devrait vous permettre d'obtenir ce que vous voulez. Editer: Pour encore plus de précision, vous devez ajuster la position par la moyenne de la vitesse au début du pas de temps et la vitesse à la fin du pas de temps.

+1

Cela a du sens, seule chose est maintenant, mon projectile prend beaucoup plus de temps à frapper le sol comme il le faisait avant, est-ce normal? –

+0

Oui, c'est normal. –