3D Projectile - просчет на 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 ответ

Проблема в том, что вы увеличиваете 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();
}

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

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

Другие вопросы по тегам