尝试模拟重力时的奇怪行为
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.html
和
https://glm.g-truc.net/0.9.4/api/a00131.html
我正在尝试使用 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.html 和 https://glm.g-truc.net/0.9.4/api/a00131.html