2017-01-07 4 views
0

Я создаю небольшой физический движок, который запускает снаряд с заданной скоростью, скоростью и временем силы тяжести и отслеживает и отображает векторы скорости/положения на каждом временном интервале.3D-снаряды - просчет на X и Z?

В настоящий момент, когда я запускаю свою программу, мои координаты y прекрасно меняются. Однако мои координаты x и z действуют одинаково, и я уверен, что мои координаты координат z неверны. (Но я мог ошибаться)

Эта проблема одинакова для векторов положения и скорости на оси x и z.

Вот мой код:

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 
    } 
} 

Если это помогает. Вот моя задача:

Траектория в 3D снарядом, который имеет скорость запуска вектор (10.0,14.14, - 10,0). Шаг времени = 0,01 секунды. Вектор силы тяжести равен (0,0, -9,81, 0,0).

Показать позиции векторов и векторов скорости на пульте демонстрации.

+1

Почему в результате возникает подозрение? – user2864740

+0

В вашей задаче указано, что скорость Z должна быть -10.0, но ваш код имеет 10,0 (и, следовательно, он действует так же, как скорость 10,0 Х). – TheUndeadFish

ответ

0

Проблема в том, что вы увеличиваете deltaT (количество времени, которое проходит с каждым шагом физики). Это должно оставаться неизменным, и вы должны добавить другую переменную, чтобы отслеживать, сколько времени прошло с момента начала моделирования. Например:

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(); 
} 

Это должно получить то, что вы хотите.

Редактировать: Для большей точности вы должны отрегулировать положение на в среднем скорости в начале шага времени и скорости в конце шага времени.

+1

Это имеет смысл, только теперь вещь, мой снаряд уходит далеко до земли, как это было раньше, это нормально? –

+0

Да, это нормально. –

Смежные вопросы