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

标签 c++ simulation physics glm-math

我正在尝试用 C++ 和 GLM 模拟牛顿引力。我正在使用 GLM vector 和我在 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 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 Version
注意:对于低帧率很抱歉,这是将视频转换为 GIF 的副产品
有谁知道这里出了什么问题?
顺便说一句,完整代码可在此处获得:https://github.com/ProtoByter/GravityLaw
编辑 1:
在物体突然加速时施加在物体上的 y 力为 3.5079064080620432e+26 N
而当它以恒定速度移动时,y 力为 -2.9308778146655032e+23 N
编辑2:
为了澄清起见,我使用了牛顿万有引力定律的 vector 形式,在维基百科上,这被定义为 vector ,而 glm::distance 返回 double 值,因此不适合

最佳答案

您使用错误的函数来计算两个物体之间的距离,
您已经使用了 glm::abs(gentype const &x) ,它仅用于计算 x 的绝对值,即如果 x < 0 那么它返回 -x 并且如果 x >= 它只是按原样返回。
您可以使用 glm::distance(point1, point2) 来计算 point1 和 point2 之间的距离。
有关更多信息,您可以查看此链接:
https://glm.g-truc.net/0.9.4/api/a00129.html

https://glm.g-truc.net/0.9.4/api/a00131.html

关于c++ - 尝试模拟重力时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64941114/

相关文章:

c++ - 模板基类的静态成员不会导出到共享库

c++ - 为什么 const std::random_device 不可能?

objective-c - Chipmunk Physics 的 anchor 和位置

C++:线程池比单线程慢?

c++ - Qt打不开新窗口

java - 角速度和计算问题

c++ - 如何模拟鼠标移动

algorithm - Haskell 粒子模拟 - 计算粒子的速度

c - 并行化错误 MPI_Allgather

android - 计算正在运行的车辆的 x 加速度(东)和 y 加速度(北)