为了更好地理解矢量的工作原理,我试图创建一个围绕太阳运行的非常简单的地球模拟。目前,我想要的只是地球围绕太阳转圈。没有考虑物理定律。
我认为我所做的事情会起作用,但它会产生一种进入斐波那契旋转的运动。
// initial positions
vec2 sun(0.0,0.0);
vec2 earth(10.0,0.0);
while(true) {
vec2 earthToSun = normalize(sun - earth); // this is the vector 'pointing from the earth towards the sun'
vec2 speedVector = vec2(-earthToSun.y, earthToSun.x); // this is the vector perpendicular to the earthToSun vector
earth = earth + earthToSun + speedVector; // move the earth along the resulting vector
}
我的计算有什么问题?
答案 0 :(得分:3)
为什么不用三角法来做呢:
#define PI 3.1415926
float r = 10.0;
for (int theta=0; theta<2*PI; theta += 0.01)
{
float x = r*cos(theta),
y = r*sin(theta);
earth = vec2(x, y);
}
显然,根据需要更改期间,theta
的起始值,增量等。
答案 1 :(得分:1)
您的初始条件应为
vec2 sun(0.0,0.0);
vec2 earth(10.0,0.0);
vec2 speedVector = vec2(-earthToSun.y, earthToSun.x);
看起来不错。但是,方程式存在两个问题。
地球的位置应该随着时间的推移而改变:
vec2 earthToSun = normalize(sun - earth);
earth = earth + earthToSun; // no speedVector added here
请注意,我在更新代码中不将speedVector
添加到地球。你在那里所做的是在整个模拟过程中加速你的地球。
您的normalize
函数必须按平方距离进行标准化。我不确定你是如何实现的。 F = g m1 m2 / r ^ 2.我怀疑你的{ {1}}仅由 r 而不是 r ^ ^ 2.检查https://en.wikipedia.org/wiki/Gravitational_constant以供参考
你的地球不一定会围成一圈。它很可能是一个椭圆轨道。还要确保选择足够小的步长。每次迭代,normalize
只应改变其与太阳距离的一小部分,否则您将积累明显的积分误差。