gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:54:12 24 4
gpt4 key购买 nike

我正在尝试用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com