我正在尝试使用C++和GLM模拟牛顿引力。我正在使用GLM向量和在维基百科上找到的这个方程。
我将其翻译为代码:
const static double g_const = 6.67430E-11;
void gravitate(object& obj1,object& obj2) {
glm::vec2 distance = glm::abs(obj2.position-obj1.position);
glm::vec2 unitvec = (obj2.position-obj1.position)/distance;
glm::vec2 force = -g_const*obj1.mass*obj2.mass/(distance*distance)*unitvec;
obj2.updateForce(force);
}
对象类被结构化为这样
class object {
public:
double mass;
glm::vec2 velocity;
glm::vec2 position;
object(double massin, glm::vec2 pos) : mass(massin), position(pos) {;}
object(double massin, glm::vec2 pos, glm::vec2 vel) : mass(massin), position(pos), velocity(vel) {;}
void updateForce(glm::vec2 force) {
velocity+=force/mass;
}
void updatePos() {
position+=velocity;
}
void printPos(); // Not used in this example
void printVel(); // Not used in this example
}
主函数运行如下:
int main() {
object test1(massOfEarth,
glm::vec2(0, 0),
glm::vec2(0,0));
object test2(massOfmoon,
glm::vec2(distanceFromEarth,
distanceFromEarth),
moonInitalVelocity);
while (true) {
gravitate(test1,test2);
test2.updatePos();
}
}
当我运行它时,输出如下:
![GIF版本](https://istack.dev59.com/NG14o.gif)
有人知道出了什么问题吗?
另外,完整代码在此处可用:https://github.com/ProtoByter/GravityLaw 编辑1:
在物体突然加速点处施加在物体上的y力为3.5079064080620432e+26 N
当其以恒定速度移动时,y力为-2.9308778146655032e+23 N
编辑2:
为澄清起见,我正在使用牛顿万有引力的向量形式,在维基百科上它被定义为矢量量,而glm::distance返回一个double,因此不适合。
gravitate
的第2行中,当两个物体靠近时,distance
变为零或接近于零。正如你所知,lim 1/zero -> 一个巨大的数字。另外请注意,你正在使用曼哈顿距离,也许对于你的计算,你应该使用欧几里得距离(在std C++中计算它的函数称为hypot,但我不知道你正在使用的库中是否有相应的函数)。 - Aleksander Bobiński