美好的一天,我试图用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编写比按钮更复杂的代码,因此欢迎提供有关代码布局和其他方面的反馈!
非常感谢
答案 0 :(得分:2)
在使用单独的坐标进行绘制时,使用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
,vy += ay*dt
x += vx*dt
,y += vy*dt