0

我正在构建一个小型物理引擎,它以给定的速度、重力速度和时间间隔发射弹丸,并在每个时间间隔跟踪和显示速度/位置矢量。

目前,当我运行我的程序时,我的y坐标更新得很好。但是我的坐标xz坐标的作用相同,我很确定我的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
    }
}

如果有帮助。这是我的任务:

发射速度矢量为 (10.0,14.14,- 10.0) 的射弹的 3D 轨迹。时间步长 = 0.01 秒。重力矢量为 (0.0, -9.81, 0.0)。

出于演示目的,在控制台上显示位置矢量和速度矢量。

4

1 回答 1

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

这应该可以得到你想要的。

编辑:为了更准确,您应该通过时间步开始时的速度和时间步结束时的速度的平均值来调整位置。

于 2017-01-08T00:24:01.940 回答