2D 射弹 - 速度和位置向量
2D projectile - Velocity and Position Vectors
我正在构建一个小型物理引擎,它以给定的角度和速度发射射弹,并在每个时间间隔跟踪和显示 velocity/position 矢量,但我的程序遇到了一些问题.
当我 运行 我的程序时,它没有循环,并且 position 变量保持为 0。我知道我在某处数学错误,只是不知道在哪里。
这是我的程序:
#include <iostream>
using namespace std;
#define PI 3.14159265359
struct vecVariables {
float v = 0, a = -9.81;
float posNew = 0, posOld = 0;
float x, y;
float theta = 45; // our start angle is 45
float u = 20; // our start velocity is 20
};
int main() {
int deltaT = 0.01;
int test;
vecVariables vars; // creates an object for Variables to be used
while (deltaT <= 1) {
deltaT += 0.01;
vars.v = vars.u + vars.a * deltaT; // gets the velocity V
vars.posNew = vars.posOld + vars.v * deltaT; // gets position D
vars.x = vars.u * cos(vars.theta * PI / 180);
vars.y = vars.u * sin(vars.theta* PI / 180);
cout << "velocity vec = [" << vars.x << " , " << vars.y << "]" << endl; // velocity on x, y
cout << "pos = "<< vars.posNew << endl; // display position
vars.posOld = vars.posNew;
getchar();
}
}
将 int deltaT = 0.01;
更改为 float deltaT = 0.01f;
或 double deltaT = 0.01;
。发生的事情是您的“.01”在转换为整数时被截断了。你想要一个 float
或 double
因为它们告诉编译器期望一个非整数值。现在,你告诉它期望一个整数值,因为它没有得到一个整数,它会删除小数点后的所有内容以强制它成为一个整数。
你将delta T声明为int,然后将其设置为0.01,即转换为0。将delta T的声明更改为float。
除了已经引用的 int deltaT
内容外,代码中还有一些错误。
首先,如果不正确,你计算速度的方式。实际上,这里您的 vars.u
是恒定的,因此速度 vars.v
将始终相同。
vars.v = vars.u + vars.a * deltaT; // gets the velocity V
您可以做两件事来解决这个问题:
删除 vars.u
并仅使用 vars.v
(如果需要,可以将其初始化为 20),这会将代码更改为 vars.v += deltaT * a;
做与职位相同的事情:vars.v = vars.u + deltaT * a; vars.u = vars.v;
你对 vars.x
和 vars.y
的计算仍然是错误的,theta
也应该每帧更新一次。
我不太确定你为什么选择这个方向来解决你的问题,但我建议沿着 x 和 y 轴解决所有问题,它看起来像这样(这应该编译,但我没有尝试它,可能有拼写错误)
#include <iostream>
#include <cmath>
using namespace std;
#define PI 3.14159265359
struct vecVariables {
float startAngle = 45;
float startVelocity = 20;
float vx = 0;
float vy = 0;
float px = 0;
float py = 0;
float ax = 0;
float ay = -9.81;
};
int main() {
float deltaT = 0.01;
vecVariables vars; // creates an object for Variables to be used
vars.vx = vars.startVelocity * cos(vars.startAngle * PI / 180);
vars.vy = vars.startVelocity * sin(vars.startAngle * PI / 180);
while (deltaT <= 1) {
deltaT += 0.01;
// Update velocity
vars.vx += deltaT * vars.ax;
vars.vy += deltaT * vars.ay;
// Update position
vars.px += deltaT * vars.vx;
vars.py += deltaT * vars.vy;
cout << "velocity vec = [" << vars.vx << " , " << vars.vy << "]" << endl; // velocity
cout << "position vec = [" << vars.px << " , " << vars.py << "]" << endl; // position
cout << endl;
}
return 0;
}
我正在构建一个小型物理引擎,它以给定的角度和速度发射射弹,并在每个时间间隔跟踪和显示 velocity/position 矢量,但我的程序遇到了一些问题.
当我 运行 我的程序时,它没有循环,并且 position 变量保持为 0。我知道我在某处数学错误,只是不知道在哪里。
这是我的程序:
#include <iostream>
using namespace std;
#define PI 3.14159265359
struct vecVariables {
float v = 0, a = -9.81;
float posNew = 0, posOld = 0;
float x, y;
float theta = 45; // our start angle is 45
float u = 20; // our start velocity is 20
};
int main() {
int deltaT = 0.01;
int test;
vecVariables vars; // creates an object for Variables to be used
while (deltaT <= 1) {
deltaT += 0.01;
vars.v = vars.u + vars.a * deltaT; // gets the velocity V
vars.posNew = vars.posOld + vars.v * deltaT; // gets position D
vars.x = vars.u * cos(vars.theta * PI / 180);
vars.y = vars.u * sin(vars.theta* PI / 180);
cout << "velocity vec = [" << vars.x << " , " << vars.y << "]" << endl; // velocity on x, y
cout << "pos = "<< vars.posNew << endl; // display position
vars.posOld = vars.posNew;
getchar();
}
}
将 int deltaT = 0.01;
更改为 float deltaT = 0.01f;
或 double deltaT = 0.01;
。发生的事情是您的“.01”在转换为整数时被截断了。你想要一个 float
或 double
因为它们告诉编译器期望一个非整数值。现在,你告诉它期望一个整数值,因为它没有得到一个整数,它会删除小数点后的所有内容以强制它成为一个整数。
你将delta T声明为int,然后将其设置为0.01,即转换为0。将delta T的声明更改为float。
除了已经引用的 int deltaT
内容外,代码中还有一些错误。
首先,如果不正确,你计算速度的方式。实际上,这里您的 vars.u
是恒定的,因此速度 vars.v
将始终相同。
vars.v = vars.u + vars.a * deltaT; // gets the velocity V
您可以做两件事来解决这个问题:
删除
vars.u
并仅使用vars.v
(如果需要,可以将其初始化为 20),这会将代码更改为vars.v += deltaT * a;
做与职位相同的事情:
vars.v = vars.u + deltaT * a; vars.u = vars.v;
你对 vars.x
和 vars.y
的计算仍然是错误的,theta
也应该每帧更新一次。
我不太确定你为什么选择这个方向来解决你的问题,但我建议沿着 x 和 y 轴解决所有问题,它看起来像这样(这应该编译,但我没有尝试它,可能有拼写错误)
#include <iostream>
#include <cmath>
using namespace std;
#define PI 3.14159265359
struct vecVariables {
float startAngle = 45;
float startVelocity = 20;
float vx = 0;
float vy = 0;
float px = 0;
float py = 0;
float ax = 0;
float ay = -9.81;
};
int main() {
float deltaT = 0.01;
vecVariables vars; // creates an object for Variables to be used
vars.vx = vars.startVelocity * cos(vars.startAngle * PI / 180);
vars.vy = vars.startVelocity * sin(vars.startAngle * PI / 180);
while (deltaT <= 1) {
deltaT += 0.01;
// Update velocity
vars.vx += deltaT * vars.ax;
vars.vy += deltaT * vars.ay;
// Update position
vars.px += deltaT * vars.vx;
vars.py += deltaT * vars.vy;
cout << "velocity vec = [" << vars.vx << " , " << vars.vy << "]" << endl; // velocity
cout << "position vec = [" << vars.px << " , " << vars.py << "]" << endl; // position
cout << endl;
}
return 0;
}