尝试模拟重力时的奇怪行为

Weird behaivour when trying to simulate gravity

我正在尝试使用 C++ 和 GLM 模拟牛顿引力。我正在使用 GLM 向量和我在 Wikipedia

上找到的这个方程

我将其翻译成代码:

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 的结构如下

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://github.com/ProtoByter/GravityLaw

编辑 1:

在物体突然加速时施加在物体上的y力为3.5079064080620432e+26 N

而当它以恒定速度移动时,y 力为 -2.9308778146655032e+23 N

编辑 2:

为澄清起见,我使用的是牛顿万有引力定律的矢量形式,在维基百科上,这被定义为矢量,而 glm::distance returns 双精度所以不合适

您使用了错误的函数来计算两个对象之间的距离, 您已经使用了 glm::abs(gentype const &x) 这只是为了计算 x 的绝对值,即如果 x < 0 那么它 returns -x 如果 x >= 它只是 returns原样。

您可以使用glm::distance(point1, point2)来计算point1和point2之间的距离。

有关更多信息,您可以查看此 link: https://glm.g-truc.net/0.9.4/api/a00129.htmlhttps://glm.g-truc.net/0.9.4/api/a00131.html