美好的一天,我正在尝试用javascript创建一个简单的2D太阳系模型,但是在理解如何计算下一帧行星的位置时遇到一些麻烦,以及其他一些我将详细介绍的内容很快。
看完this非常好看的视频和他的其他一些人之后,我做了一个快速的MS画像试图简化我的情况。对于第二个场景,您可以看到使用速度,引力和这两个“方向”之间的角度来计算新位置?
我无法理解如何弄清楚这一切。
下面是我的代码的JS小提琴。您会注意到我正在尽力使用真正的NASA给定数据以保持其准确性。
您将特别关注第138行,这是进行下一步行动的所有计算的地方。
https://jsfiddle.net/c8eru7mk/9/
attraction: function(p2) {
// Distance to other body
var dx = p2.position.x - this.position.x;
var dy = p2.position.y - this.position.y;
var d = Math.sqrt(dx ** 2 + dy ** 2); // Possibly correct
// Force of attracrtion
this.f = G * (this.mass * p2.mass) / (d ** 2); // Possibly Correct
// Direction of force, If you read it hard enough you should be able to hear my screams of pain
// Not sure if this is correct, most likely not.
var theta = Math.atan2(dy, dx);
var fx = Math.cos(theta) * this.f;
var fy = Math.sin(theta) * this.f;
this.velocity.x += fx / this.mass;
this.velocity.y += fy / this.mass;
this.position.x += this.velocity.x;
this.position.y += this.velocity.y;
}
我目前面临的问题是
这也是我第一次实际编写比javascript中的按钮更复杂的东西,所以欢迎对代码布局和诸如此类的反馈!
非常感谢
使用单独的坐标进行绘制时,使用NASA值不是问题。使用从实际坐标到屏幕坐标进行显示的适当线性变换不会影响物理值和计算。
为了模拟具有迭代更新的行星的运动,可以假设重力和速度在dt
的一小部分时间内是恒定的。在从加速到速度以及从速度到距离的转换中,这个因子dt
都缺失了。为dt
选择合适的值可能需要一些实验。如果该值太大,则近似值与实际情况相差太远。如果该值太小,您可能看不到任何移动或舍入错误可能会影响结果。
首先让我们假设太阳总是在(0,0)。同样首先让我们忽略行星之间的力量。那么这是第一个不太接近的近似的必要公式:
(x,y)
)在M
位置的行星的标量加速度:a = G*M/(d*d)
在哪里d=sqrt(x*x+y*y)
。请注意,这与地球的质量无关。ax = -a*x/d
)ay = -a*y/d
:(-x,-y)
,a
(vx,vy)
,vx += ax*dt